{"version":3,"sources":["vue.js"],"names":["global","factory","exports","module","define","amd","Vue","this","set","obj","key","val","hasOwn","_isVue","_data","ob","__ob__","convert","dep","notify","vms","i","length","vm","_proxy","_digest","del","_unproxy","hasOwnProperty","call","isLiteral","exp","literalValueRE","test","isReserved","str","c","charCodeAt","_toString","value","toString","toNumber","parsed","Number","isNaN","toBoolean","stripQuotes","a","b","slice","camelize","replace","camelizeRE","toUpper","_","toUpperCase","hyphenate","hyphenateRE","toLowerCase","classify","classifyRE","bind","fn","ctx","l","arguments","apply","toArray","list","start","ret","Array","extend","to","from","keys","Object","isObject","isPlainObject","OBJECT_STRING","def","enumerable","defineProperty","writable","configurable","_debounce","func","wait","timeout","args","context","timestamp","result","later","last","Date","now","setTimeout","indexOf","arr","cancellable","cb","cancelled","cancel","looseEqual","JSON","stringify","Cache","limit","size","head","tail","undefined","_keymap","create","peek","index","next","eof","len","eatSpace","spaceChr","isStringStart","chr","doubleChr","singleChr","isExpStart","expStartChr","isExpEnd","expChrPair","parseString","stringQuote","escapeChr","parseSpecialExp","inExp","startChr","parseExpression","pipeChr","state","startState","filterArgState","filterState","filterNameState","parseFilterList","filters","push","parseFilter","filter","name","trim","parseFilterArguments","arg","processFilterArg","reservedArgRE","dynamic","stripped","parseDirective","s","hit","cache$1","get","dir","expression","put","escapeRegex","regexEscapeRE","compileRegex","open","config","delimiters","close","unsafeOpen","unsafeDelimiters","unsafeClose","tagRE","RegExp","htmlRE","cache","parseText","text","match","html","first","oneTime","tokens","lastIndex","exec","tag","tokensToExp","map","token","formatToken","join","single","$eval","inlineFilters","filterRE","appendWithTransition","el","target","applyTransition","appendChild","beforeWithTransition","before","removeWithTransition","remove","direction","op","transition","__v_trans","hooks","transitionEndEvent","_isCompiled","$parent","action","query","document","querySelector","inDoc","node","doc","ownerDocument","documentElement","parent","parentNode","nodeType","contains","getAttr","_attr","getAttribute","removeAttribute","getBindAttr","hasBindAttr","hasAttribute","insertBefore","after","nextSibling","removeChild","prepend","firstChild","replaceChild","on","event","useCapture","addEventListener","off","removeEventListener","getClass","classname","className","baseVal","setClass","cls","isIE9","namespaceURI","setAttribute","addClass","classList","add","cur","removeClass","tar","extractContent","asFragment","child","rawContent","isTemplate","isFragment","content","hasChildNodes","trimNode","createDocumentFragment","createElement","isTrimmable","lastChild","data","tagName","createAnchor","persist","anchor","debug","createComment","createTextNode","__v_anchor","findRef","hasAttributes","attrs","attributes","refRE","mapNodeRange","end","removeNodeRange","frag","onRemoved","removed","done","nodes","getOuterHTML","outerHTML","container","cloneNode","innerHTML","findVmFromFrag","__vue__","checkComponentAttr","options","hasAttrs","commonTagRE","reservedTagRE","getIsBinding","resolveAsset","id","is","mergeData","toVal","fromVal","mergeAssets","parentVal","childVal","res","guardArrayAssets","guardComponents","components","ids","guardProps","props","isArray","type","assets","asset","mergeOptions","mergeField","strat","strats","defaultStrat","mixins","mixin","mixinOptions","prototype","warnMissing","camelizedId","charAt","Dep","uid$1","subs","withoutConversion","shouldConvert","Observer","augment","hasProto","protoAugment","copyAugment","arrayMethods","arrayKeys","observeArray","walk","src","__proto__","observe","isExtensible","addVm","defineReactive","property","getOwnPropertyDescriptor","getter","setter","childOb","depend","e","newVal","initMixin","_init","$el","$root","$children","$refs","$els","_watchers","_directives","_uid","uid","_events","_eventsCount","_isFragment","_fragment","_fragmentStart","_fragmentEnd","_isDestroyed","_isReady","_isAttached","_isBeingDestroyed","_vForRemoving","_unlinkFn","_context","_scope","_frag","children","$options","constructor","_updateRef","_callHook","_initState","_initEvents","$mount","getPathCharType","ch","code","formatSubPath","path","trimmed","parse","maybeUnescapeQuote","nextChar","mode","IN_SINGLE_QUOTE","IN_DOUBLE_QUOTE","newChar","actions","APPEND","typeMap","BEFORE_PATH","subPathDepth","PUSH","INC_SUB_PATH_DEPTH","PUSH_SUB_PATH","IN_SUB_PATH","pathStateMachine","ERROR","AFTER_PATH","raw","parsePath","pathCache","getPath","parseExpression$1","setPath","original","$set","noop","save","isString","saved","newlineRE","rewrite","allowedKeywordsRE","restoreRE","restore","compileGetter","improperKeywordsRE","body","saveRE","wsRE","identRE","makeGetterFn","index$1$1","Function","scope","Math","compileSetter","needSet","expressionCache","isSimplePath","pathTestRE","literalValueRE$1","resetBatcherState","queue","userQueue","has","circular","waiting","flushBatcherQueue","_again","runBatcherQueue","devtools","emit","watcher","run","pushWatcher","q","user","nextTick","Watcher","expOrFn","isFn","uid$2","active","dirty","lazy","deps","newDeps","depIds","_Set","newDepIds","prevError","twoWay","queued","shallow","traverse","seen","seenObjects","clear","isA","isO","depId","isRealTemplate","stringToFragment","templateString","cacheKey","templateCache","tagMatch","tagRE$1","entityMatch","entityRE","commentMatch","commentRE","wrap","efault","depth","prefix","suffix","nodeToFragment","textContent","clonedNode","querySelectorAll","cloned","hasBrokenTemplate","tempClone","hasTextareaCloneBug","parseTemplate","template","shouldClone","idSelectorCache","getElementById","Fragment","linker","host","parentFrag","childFrags","inserted","unlink","childNodes","singleBefore","singleRemove","multiBefore","multiRemove","__v_frag","withTransition","method","callHook","attach","shouldCallRemove","self","beforeRemove","detach","destroy","FragmentFactory","cid","cacheId","linkerCache","compile","findPrevFrag","previousSibling","forId","range","n","floor","getTrackByKey","trackByKey","getValue","multi","init","selected","_value","indexOf$1","keyFilter","handler","codes","charCode","parseInt","keyCodes","concat","keyCode","stopFilter","stopPropagation","preventFilter","preventDefault","selfFilter","currentTarget","normalize","prop","propCache","camel","upper","testEl","prefixed","prefixes","style","kebab","camelPrefixes","normalize$1","_key","k","split","callActivateHooks","called","total","compileProps","propOptions","attr","propsData","names","empty","identRE$1","propBindingModes","ONE_WAY","TWO_WAY","ONE_TIME","optimizedLiteral","parentPath","makePropsLinkFn","_props","inlineProps","initProp","$get","_bindDir","propDef","Boolean","processPropValue","rawValue","isSimple","getPropDefaultValue","coerceProp","coerced","assertProp","updateProp","required","valid","expectedTypes","assertedType","assertType","expectedType","validator","coerce","String","pushJob","job","queue$1","flush","f","offsetHeight","Transition","enterClass","leaveClass","pendingCssEvent","pendingCssCb","pendingJsCb","justEntered","entered","left","typeCache","forEach","m","isHidden","rect","getBoundingClientRect","width","height","offsetWidth","getClientRects","partial","nodeLinkFn","_asComponent","compileNode","childLinkFn","terminal","isScript","compileNodeList","dirs","linkAndCapture","makeUnlinkFn","originalDirCount","sortDirectives","_bind","j","groupedMap","priority","descriptor","DEFAULT_PRIORITY","array","priorities","sort","group","contextDirs","destroying","teardownDirs","_teardown","compileAndLinkProps","propsLinkFn","propDirs","compileRoot","contextOptions","contextLinkFn","replacerLinkFn","containerAttrs","_containerAttrs","replacerAttrs","_replacerAttrs","compileDirectives","selfDirs","compileTextNode","compileElement","skip","linkFn","checkTerminalDirectives","checkElementDirectives","checkComponent","_skip","removeText","wholeText","processTextToken","makeTextNodeLinkFn","setTokenType","directives","fragClone","nodeList","linkFns","makeChildLinkFn","childrenLinkFn","makeTerminalNodeLinkFn","component","ref","internalDirectives","modifiers","literal","componentLinkFn","prev","previousElementSibling","matched","dirName","rawName","termDef","modifierRE","dirAttrRE","DEFAULT_TERMINAL_PRIORITY","parseModifiers","pushDir","interpTokens","hasOneTimeToken","hasOneTime","interp","dirDef","transitionRE","bindRE","onRE","makeNodeLinkFn","transclude","extractAttrs","_content","transcludeTemplate","replacer","mergeAttrs","specialCharRE","resolveSlots","contents","_slotContents","extractFragment","stateMixin","makeComputedGetter","owner","evaluate","newData","_setData","_initProps","_initMeta","_initMethods","_initData","_initComputed","_propsUnlinkFn","dataFn","oldData","removeVm","update","computed","userDef","methods","metas","_meta","eventsMixin","registerComponentEvents","eventRE","_fromParent","$on","registerCallbacks","hash","handlers","register","onAttached","callAttach","onDetached","callDetach","events","watch","_initDOMHooks","hook","$emit","noop$1","Directive","_locked","_bound","_listeners","_host","lifecycleMixin","_ref","refs","_compile","_initElement","rootLinker","contentLinkFn","ctor","_linkerCachable","rootUnlinkFn","contentUnlinkFn","_destroy","deferCleanup","_cleanup","destroyReady","pendingRemoval","cleanupIfPossible","$remove","$destroy","teardown","$off","miscMixin","_applyFilters","oldValue","write","offset","read","_resolveComponent","resolved","requested","pendingCallbacks","cbs","reason","dataAPI","clean","asStatement","$arguments","$delete","$watch","deep","sync","immediate","filterRE$1","$interpolate","$log","console","log","domAPI","insert","op1","op2","targetIsDetached","shouldCallHook","append","beforeWithCb","removeWithCb","$nextTick","$appendTo","$prependTo","$before","$after","inDocument","realCb","eventsAPI","modifyListenerCount","count","hookRE","$once","splice","isSource","shouldPropagate","hasParentCbs","some","$broadcast","source","$dispatch","lifecycleAPI","ready","$compile","limitBy","filterBy","search","delimiter","convertArray","item","$value","$key","orderBy","baseCompare","sortKeyIndex","sortKey","sortKeys","order","comparator","firstArg","installGlobalAPI","elementDirectives","transitions","partials","util","compiler","parsers","directive","extendOptions","Super","isFirstExtend","_Ctor","Sub","_assetTypes","use","plugin","installed","unshift","install","definition","inBrowser","window","__VUE_DEVTOOLS_GLOBAL_HOOK__","UA","navigator","userAgent","isIE","isAndroid","transitionProp","animationProp","animationEndEvent","isWebkitTrans","ontransitionend","onwebkittransitionend","isWebkitAnim","onanimationend","onwebkitanimationend","nextTickHandler","pending","copies","callbacks","timerFunc","postMessage","importScripts","requestAnimationFrame","setImmediate","NEXT_TICK_TOKEN","Set","p","entry","shift","newer","older","returnEntry","91","123","40","freeze","defineProperties","silent","async","warnExpressionErrors","_delimitersChanged","_propBindingModes","_maxUpdateCount","warn","optionMergeStrategies","instanceData","defaultData","created","attached","detached","beforeCompile","compiled","beforeDestroy","destroyed","activate","addSub","sub","removeSub","addDep","arrayProto","getOwnPropertyNames","items","debounce","__commonjs_global","primitives","Primitives","getProto","getGlobal","setProto","proto","prim","instance","wrapped","immutable","string","boolean","number","protos","primIndex","protoIndex","getPropertyObject","object","getPrototypeOf","isPrimitive","immutableType","replacement","applyNew","infiniteChecker","InfiniteChecker","maxIterations","check","Error","index$1","hoist","ast","walkAll","childNode","parentStack","excludeBody","shouldScope","variables","functions","pop","prependScope","declarations","kind","esprima","root","assert","condition","message","sliceSource","isDecimalDigit","isHexDigit","isOctalDigit","isWhiteSpace","isLineTerminator","isIdentifierStart","Regex","NonAsciiIdentifierStart","isIdentifierPart","NonAsciiIdentifierPart","isFutureReservedWord","isStrictModeReservedWord","isRestrictedWord","isKeyword","keyword","strict","skipComment","blockComment","lineComment","lineNumber","lineStart","throwError","Messages","UnexpectedToken","scanHexEscape","fromCharCode","scanIdentifier","Token","Identifier","Keyword","NullLiteral","BooleanLiteral","scanPunctuator","ch2","ch3","ch4","ch1","Punctuator","scanNumericLiteral","NumericLiteral","octal","parseFloat","scanStringLiteral","quote","unescaped","StringLiteral","scanRegExp","pattern","flags","classMarker","terminated","buffer","UnterminatedRegExp","substr","InvalidRegExp","isIdentifierName","advance","EOF","lex","lookahead","pos","line","peekLineTerminator","found","messageFormat","error","msg","whole","column","throwErrorTolerant","extra","errors","throwUnexpected","UnexpectedEOS","UnexpectedNumber","UnexpectedString","UnexpectedIdentifier","UnexpectedReserved","StrictReservedWord","expect","expectKeyword","matchKeyword","matchAssign","consumeSemicolon","isLeftHandSide","expr","Syntax","MemberExpression","parseArrayInitialiser","elements","parseAssignmentExpression","ArrayExpression","parsePropertyFunction","param","previousStrict","parseFunctionSourceElements","StrictParamName","FunctionExpression","params","defaults","rest","generator","parseObjectPropertyKey","StrictOctalLiteral","createLiteral","parseObjectProperty","Property","parseVariableIdentifier","parseObjectInitialiser","properties","PropertyKind","Data","Get","StrictDuplicateProperty","AccessorDataProperty","AccessorGetSet","ObjectExpression","parseGroupExpression","parsePrimaryExpression","ThisExpression","parseFunctionExpression","parseArguments","parseNonComputedProperty","parseNonComputedMember","parseComputedMember","parseNewExpression","NewExpression","callee","parseLeftHandSideExpression","parseLeftHandSideExpressionAllowCall","CallExpression","parsePostfixExpression","StrictLHSPostfix","InvalidLHSInAssignment","UpdateExpression","operator","argument","parseUnaryExpression","StrictLHSPrefix","UnaryExpression","StrictDelete","parseMultiplicativeExpression","BinaryExpression","right","parseAdditiveExpression","parseShiftExpression","parseRelationalExpression","previousAllowIn","allowIn","parseEqualityExpression","parseBitwiseANDExpression","parseBitwiseXORExpression","parseBitwiseORExpression","parseLogicalANDExpression","LogicalExpression","parseLogicalORExpression","parseConditionalExpression","consequent","ConditionalExpression","alternate","StrictLHSAssignment","AssignmentExpression","SequenceExpression","expressions","parseStatementList","statement","parseSourceElement","parseBlock","block","BlockStatement","parseVariableDeclaration","StrictVarName","VariableDeclarator","parseVariableDeclarationList","parseVariableStatement","VariableDeclaration","parseConstLetDeclaration","parseEmptyStatement","EmptyStatement","parseExpressionStatement","ExpressionStatement","parseIfStatement","parseStatement","IfStatement","parseDoWhileStatement","oldInIteration","inIteration","DoWhileStatement","parseWhileStatement","WhileStatement","parseForVariableDeclaration","parseForStatement","InvalidLHSInForIn","ForStatement","ForInStatement","each","parseContinueStatement","label","IllegalContinue","ContinueStatement","labelSet","UnknownLabel","parseBreakStatement","inSwitch","IllegalBreak","BreakStatement","parseReturnStatement","inFunctionBody","IllegalReturn","ReturnStatement","parseWithStatement","StrictModeWith","WithStatement","parseSwitchCase","SwitchCase","parseSwitchStatement","discriminant","cases","clause","oldInSwitch","defaultFound","SwitchStatement","MultipleDefaultsInSwitch","parseThrowStatement","NewlineAfterThrow","ThrowStatement","parseCatchClause","StrictCatchVariable","CatchClause","parseTryStatement","finalizer","NoCatchOrFinally","TryStatement","guardedHandlers","parseDebuggerStatement","DebuggerStatement","labeledBody","parseFunctionDeclaration","Redeclaration","LabeledStatement","sourceElement","firstRestricted","oldLabelSet","oldInFunctionBody","sourceElements","Literal","stricted","paramSet","StrictFunctionName","StrictParamDupe","FunctionDeclaration","parseSourceElements","parseProgram","program","Program","addComment","loc","comments","scanComment","comment","filterCommentLocation","collectToken","TokenName","collectRegex","regex","filterTokenLocation","createRawLiteral","createLocationMarker","marker","applyGroup","groupRange","groupLoc","trackGroupExpression","trackLeftHandSideExpression","trackLeftHandSideExpressionAllowCall","filterGroup","wrapTrackingFunction","parseFunction","isBinary","visit","patch","wrapTracking","unpatch","stringToArray","tolerant","valueOf","version","types","safeEval","parentContext","tree","prepareAst","finalValue","evaluateAst","FunctionFactory","getFunction","ReturnValue","enterBlock","leaveBlock","getName","blockContext","setValue","declaration","defaultHandler","r","infinite","catchClause","unsupportedExpression","hasProperty","ReferenceError","checkValue","Function$1","safeFunction","objectForKey","canSetProperty","err","propertyIsEnumerable","idx","identifier","IN_PATH","BEFORE_IDENT","IN_IDENT","ws","ident","[",".","0","'","\"","]","else","allowedKeywords","improperKeywords","beforeGet","preProcess","postProcess","afterGet","forContext","$forContext","alias","_withLock","$index","tmp","current","text$1","legend","tr","col","td","th","option","optgroup","thead","tbody","colgroup","caption","tfoot","g","defs","symbol","image","circle","ellipse","polygon","polyline","t","placeholder","swap","_watcher","ON","MODEL","BIND","TRANSITION","EL","COMPONENT","PARTIAL","IF","FOR","SLOT","uid$3","vFor","inMatch","itMatch","iterator","isOption","diff","updateRef","updateModel","primitive","convertedFromObject","fromObject","trackBy","oldFrags","frags","getCachedFrag","reused","fresh","removalIndex","totalRemoved","deleteCachedFrag","w","targetPrev","prevEl","currentPrev","insertionIndex","staggerCb","staggerAnchor","move","parentScope","cacheFrag","model","__v_model","forceUpdate","staggerAmount","getStagger","trans","stagger","_preProcess","_postProcess","unbind","vIf","invalid","nextElementSibling","elseEl","elseFrag","elseFactory","show","toggle","display","text$2","isRange","composing","listener","focused","rawListener","hasjQuery","jQuery","afterBind","radio","checked","select","_this","multiple","initValue","selectedIndex","checkbox","getBooleanValue","_trueValue","_falseValue","checkFilters","hasRead","hasWrite","_unbind","esc","tab","enter","space","delete","up","down","on$1","acceptStatement","iframeBind","contentWindow","capture","stop","prevent","reset","importantRE","cssText","handleObject","reduce","handleSingle","isImportant","setProperty","xlinkNS","xlinkRE","disallowedInterpAttrRE","attrWithPropsRE","enumeratedAttrRE","modelProps","true-value","false-value","bind$1","attrValue","modelProp","setAttributeNS","cloak","for","if","vClass","cleanup","prevKeys","keepAlive","inlineTemplate","pendingComponentCb","Component","pendingRemovals","pendingRemovalCb","setComponent","invalidatePending","resolveComponent","mountComponent","unbuild","childVM","ComponentName","activateHooks","cached","getCached","newComponent","build","waitingFor","extraOptions","_isRouterView","defer","_inactive","transitionMode","bindingModes","childKey","parentKey","parentWatcher","childWatcher","TYPE_TRANSITION","TYPE_ANIMATION","transDurationProp","animDurationProp","raf","waitForTransitionStart","p$1","cancelPending","callHookWithCb","enterCancelled","enterNextTick","enterDone","getCssTransitionType","setupCssCb","leave","leaveCancelled","leaveDone","leaveNextTick","hasPending","hidden","css","inlineStyles","computedStyles","getComputedStyle","transDuration","animDuration","onEnd","transition$1","oldId","class","_setupParams","_checkStatement","_update","oldVal","mappedKey","_setupParamWatcher","unwatch","paramWatchers","_paramUnwatchFns","$event","listeners","unwatchFns","slot","fallback","elseBlock","digitsRE","json","indent","capitalize","uppercase","lowercase","currency","_currency","decimals","isFinite","stringified","abs","toFixed","_int","_float","sign","pluralize","delay"],"mappings":"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","file":"vue.min.js","sourcesContent":["/*!\n * Vue.js v1.0.27-csp\n * (c) 2016 Evan You\n * Released under the MIT License.\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.Vue = factory());\n}(this, (function () { 'use strict';\n\nfunction set(obj, key, val) {\n  if (hasOwn(obj, key)) {\n    obj[key] = val;\n    return;\n  }\n  if (obj._isVue) {\n    set(obj._data, key, val);\n    return;\n  }\n  var ob = obj.__ob__;\n  if (!ob) {\n    obj[key] = val;\n    return;\n  }\n  ob.convert(key, val);\n  ob.dep.notify();\n  if (ob.vms) {\n    var i = ob.vms.length;\n    while (i--) {\n      var vm = ob.vms[i];\n      vm._proxy(key);\n      vm._digest();\n    }\n  }\n  return val;\n}\n\n/**\n * Delete a property and trigger change if necessary.\n *\n * @param {Object} obj\n * @param {String} key\n */\n\nfunction del(obj, key) {\n  if (!hasOwn(obj, key)) {\n    return;\n  }\n  delete obj[key];\n  var ob = obj.__ob__;\n  if (!ob) {\n    if (obj._isVue) {\n      delete obj._data[key];\n      obj._digest();\n    }\n    return;\n  }\n  ob.dep.notify();\n  if (ob.vms) {\n    var i = ob.vms.length;\n    while (i--) {\n      var vm = ob.vms[i];\n      vm._unproxy(key);\n      vm._digest();\n    }\n  }\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Check whether the object has the property.\n *\n * @param {Object} obj\n * @param {String} key\n * @return {Boolean}\n */\n\nfunction hasOwn(obj, key) {\n  return hasOwnProperty.call(obj, key);\n}\n\n/**\n * Check if an expression is a literal value.\n *\n * @param {String} exp\n * @return {Boolean}\n */\n\nvar literalValueRE = /^\\s?(true|false|-?[\\d\\.]+|'[^']*'|\"[^\"]*\")\\s?$/;\n\nfunction isLiteral(exp) {\n  return literalValueRE.test(exp);\n}\n\n/**\n * Check if a string starts with $ or _\n *\n * @param {String} str\n * @return {Boolean}\n */\n\nfunction isReserved(str) {\n  var c = (str + '').charCodeAt(0);\n  return c === 0x24 || c === 0x5F;\n}\n\n/**\n * Guard text output, make sure undefined outputs\n * empty string\n *\n * @param {*} value\n * @return {String}\n */\n\nfunction _toString(value) {\n  return value == null ? '' : value.toString();\n}\n\n/**\n * Check and convert possible numeric strings to numbers\n * before setting back to data\n *\n * @param {*} value\n * @return {*|Number}\n */\n\nfunction toNumber(value) {\n  if (typeof value !== 'string') {\n    return value;\n  } else {\n    var parsed = Number(value);\n    return isNaN(parsed) ? value : parsed;\n  }\n}\n\n/**\n * Convert string boolean literals into real booleans.\n *\n * @param {*} value\n * @return {*|Boolean}\n */\n\nfunction toBoolean(value) {\n  return value === 'true' ? true : value === 'false' ? false : value;\n}\n\n/**\n * Strip quotes from a string\n *\n * @param {String} str\n * @return {String | false}\n */\n\nfunction stripQuotes(str) {\n  var a = str.charCodeAt(0);\n  var b = str.charCodeAt(str.length - 1);\n  return a === b && (a === 0x22 || a === 0x27) ? str.slice(1, -1) : str;\n}\n\n/**\n * Camelize a hyphen-delimited string.\n *\n * @param {String} str\n * @return {String}\n */\n\nvar camelizeRE = /-(\\w)/g;\n\nfunction camelize(str) {\n  return str.replace(camelizeRE, toUpper);\n}\n\nfunction toUpper(_, c) {\n  return c ? c.toUpperCase() : '';\n}\n\n/**\n * Hyphenate a camelCase string.\n *\n * @param {String} str\n * @return {String}\n */\n\nvar hyphenateRE = /([^-])([A-Z])/g;\n\nfunction hyphenate(str) {\n  return str.replace(hyphenateRE, '$1-$2').replace(hyphenateRE, '$1-$2').toLowerCase();\n}\n\n/**\n * Converts hyphen/underscore/slash delimitered names into\n * camelized classNames.\n *\n * e.g. my-component => MyComponent\n *      some_else    => SomeElse\n *      some/comp    => SomeComp\n *\n * @param {String} str\n * @return {String}\n */\n\nvar classifyRE = /(?:^|[-_\\/])(\\w)/g;\n\nfunction classify(str) {\n  return str.replace(classifyRE, toUpper);\n}\n\n/**\n * Simple bind, faster than native\n *\n * @param {Function} fn\n * @param {Object} ctx\n * @return {Function}\n */\n\nfunction bind(fn, ctx) {\n  return function (a) {\n    var l = arguments.length;\n    return l ? l > 1 ? fn.apply(ctx, arguments) : fn.call(ctx, a) : fn.call(ctx);\n  };\n}\n\n/**\n * Convert an Array-like object to a real Array.\n *\n * @param {Array-like} list\n * @param {Number} [start] - start index\n * @return {Array}\n */\n\nfunction toArray(list, start) {\n  start = start || 0;\n  var i = list.length - start;\n  var ret = new Array(i);\n  while (i--) {\n    ret[i] = list[i + start];\n  }\n  return ret;\n}\n\n/**\n * Mix properties into target object.\n *\n * @param {Object} to\n * @param {Object} from\n */\n\nfunction extend(to, from) {\n  var keys = Object.keys(from);\n  var i = keys.length;\n  while (i--) {\n    to[keys[i]] = from[keys[i]];\n  }\n  return to;\n}\n\n/**\n * Quick object check - this is primarily used to tell\n * Objects from primitive values when we know the value\n * is a JSON-compliant type.\n *\n * @param {*} obj\n * @return {Boolean}\n */\n\nfunction isObject(obj) {\n  return obj !== null && typeof obj === 'object';\n}\n\n/**\n * Strict object type check. Only returns true\n * for plain JavaScript objects.\n *\n * @param {*} obj\n * @return {Boolean}\n */\n\nvar toString = Object.prototype.toString;\nvar OBJECT_STRING = '[object Object]';\n\nfunction isPlainObject(obj) {\n  return toString.call(obj) === OBJECT_STRING;\n}\n\n/**\n * Array type check.\n *\n * @param {*} obj\n * @return {Boolean}\n */\n\nvar isArray = Array.isArray;\n\n/**\n * Define a property.\n *\n * @param {Object} obj\n * @param {String} key\n * @param {*} val\n * @param {Boolean} [enumerable]\n */\n\nfunction def(obj, key, val, enumerable) {\n  Object.defineProperty(obj, key, {\n    value: val,\n    enumerable: !!enumerable,\n    writable: true,\n    configurable: true\n  });\n}\n\n/**\n * Debounce a function so it only gets called after the\n * input stops arriving after the given wait period.\n *\n * @param {Function} func\n * @param {Number} wait\n * @return {Function} - the debounced function\n */\n\nfunction _debounce(func, wait) {\n  var timeout, args, context, timestamp, result;\n  var later = function later() {\n    var last = Date.now() - timestamp;\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    }\n  };\n  return function () {\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    if (!timeout) {\n      timeout = setTimeout(later, wait);\n    }\n    return result;\n  };\n}\n\n/**\n * Manual indexOf because it's slightly faster than\n * native.\n *\n * @param {Array} arr\n * @param {*} obj\n */\n\nfunction indexOf(arr, obj) {\n  var i = arr.length;\n  while (i--) {\n    if (arr[i] === obj) return i;\n  }\n  return -1;\n}\n\n/**\n * Make a cancellable version of an async callback.\n *\n * @param {Function} fn\n * @return {Function}\n */\n\nfunction cancellable(fn) {\n  var cb = function cb() {\n    if (!cb.cancelled) {\n      return fn.apply(this, arguments);\n    }\n  };\n  cb.cancel = function () {\n    cb.cancelled = true;\n  };\n  return cb;\n}\n\n/**\n * Check if two values are loosely equal - that is,\n * if they are plain objects, do they have the same shape?\n *\n * @param {*} a\n * @param {*} b\n * @return {Boolean}\n */\n\nfunction looseEqual(a, b) {\n  /* eslint-disable eqeqeq */\n  return a == b || (isObject(a) && isObject(b) ? JSON.stringify(a) === JSON.stringify(b) : false);\n  /* eslint-enable eqeqeq */\n}\n\nvar hasProto = ('__proto__' in {});\n\n// Browser environment sniffing\nvar inBrowser = typeof window !== 'undefined' && Object.prototype.toString.call(window) !== '[object Object]';\n\n// detect devtools\nvar devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\n// UA sniffing for working around browser-specific quirks\nvar UA = inBrowser && window.navigator.userAgent.toLowerCase();\nvar isIE = UA && UA.indexOf('trident') > 0;\nvar isIE9 = UA && UA.indexOf('msie 9.0') > 0;\nvar isAndroid = UA && UA.indexOf('android') > 0;\n\nvar transitionProp = undefined;\nvar transitionEndEvent = undefined;\nvar animationProp = undefined;\nvar animationEndEvent = undefined;\n\n// Transition property/event sniffing\nif (inBrowser && !isIE9) {\n  var isWebkitTrans = window.ontransitionend === undefined && window.onwebkittransitionend !== undefined;\n  var isWebkitAnim = window.onanimationend === undefined && window.onwebkitanimationend !== undefined;\n  transitionProp = isWebkitTrans ? 'WebkitTransition' : 'transition';\n  transitionEndEvent = isWebkitTrans ? 'webkitTransitionEnd' : 'transitionend';\n  animationProp = isWebkitAnim ? 'WebkitAnimation' : 'animation';\n  animationEndEvent = isWebkitAnim ? 'webkitAnimationEnd' : 'animationend';\n}\n\n/**\n * Defer a task to execute it asynchronously. Ideally this\n * should be executed as a microtask, so we leverage\n * MutationObserver if it's available, and fallback to\n * setTimeout(0).\n *\n * @param {Function} cb\n * @param {Object} ctx\n */\n\nvar nextTick = (function () {\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n  function nextTickHandler() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      copies[i]();\n    }\n  }\n\n  /* istanbul ignore else */\n  if (inBrowser && window.postMessage && !window.importScripts && // not in WebWorker\n  !(isAndroid && !window.requestAnimationFrame) // not in Android <= 4.3\n  ) {\n      (function () {\n        var NEXT_TICK_TOKEN = '__vue__nextTick__';\n        window.addEventListener('message', function (e) {\n          if (e.source === window && e.data === NEXT_TICK_TOKEN) {\n            nextTickHandler();\n          }\n        });\n        timerFunc = function () {\n          window.postMessage(NEXT_TICK_TOKEN, '*');\n        };\n      })();\n    } else {\n    timerFunc = typeof global !== 'undefined' && global.setImmediate || setTimeout;\n  }\n\n  return function (cb, ctx) {\n    var func = ctx ? function () {\n      cb.call(ctx);\n    } : cb;\n    callbacks.push(func);\n    if (pending) return;\n    pending = true;\n    timerFunc(nextTickHandler, 0);\n  };\n})();\n\nvar _Set = undefined;\n/* istanbul ignore if */\nif (typeof Set !== 'undefined' && Set.toString().match(/native code/)) {\n  // use native Set when available.\n  _Set = Set;\n} else {\n  // a non-standard Set polyfill that only works with primitive keys.\n  _Set = function () {\n    this.set = Object.create(null);\n  };\n  _Set.prototype.has = function (key) {\n    return this.set[key] !== undefined;\n  };\n  _Set.prototype.add = function (key) {\n    this.set[key] = 1;\n  };\n  _Set.prototype.clear = function () {\n    this.set = Object.create(null);\n  };\n}\n\nfunction Cache(limit) {\n  this.size = 0;\n  this.limit = limit;\n  this.head = this.tail = undefined;\n  this._keymap = Object.create(null);\n}\n\nvar p = Cache.prototype;\n\n/**\n * Put <value> into the cache associated with <key>.\n * Returns the entry which was removed to make room for\n * the new entry. Otherwise undefined is returned.\n * (i.e. if there was enough room already).\n *\n * @param {String} key\n * @param {*} value\n * @return {Entry|undefined}\n */\n\np.put = function (key, value) {\n  var removed;\n\n  var entry = this.get(key, true);\n  if (!entry) {\n    if (this.size === this.limit) {\n      removed = this.shift();\n    }\n    entry = {\n      key: key\n    };\n    this._keymap[key] = entry;\n    if (this.tail) {\n      this.tail.newer = entry;\n      entry.older = this.tail;\n    } else {\n      this.head = entry;\n    }\n    this.tail = entry;\n    this.size++;\n  }\n  entry.value = value;\n\n  return removed;\n};\n\n/**\n * Purge the least recently used (oldest) entry from the\n * cache. Returns the removed entry or undefined if the\n * cache was empty.\n */\n\np.shift = function () {\n  var entry = this.head;\n  if (entry) {\n    this.head = this.head.newer;\n    this.head.older = undefined;\n    entry.newer = entry.older = undefined;\n    this._keymap[entry.key] = undefined;\n    this.size--;\n  }\n  return entry;\n};\n\n/**\n * Get and register recent use of <key>. Returns the value\n * associated with <key> or undefined if not in cache.\n *\n * @param {String} key\n * @param {Boolean} returnEntry\n * @return {Entry|*}\n */\n\np.get = function (key, returnEntry) {\n  var entry = this._keymap[key];\n  if (entry === undefined) return;\n  if (entry === this.tail) {\n    return returnEntry ? entry : entry.value;\n  }\n  // HEAD--------------TAIL\n  //   <.older   .newer>\n  //  <--- add direction --\n  //   A  B  C  <D>  E\n  if (entry.newer) {\n    if (entry === this.head) {\n      this.head = entry.newer;\n    }\n    entry.newer.older = entry.older; // C <-- E.\n  }\n  if (entry.older) {\n    entry.older.newer = entry.newer; // C. --> E\n  }\n  entry.newer = undefined; // D --x\n  entry.older = this.tail; // D. --> E\n  if (this.tail) {\n    this.tail.newer = entry; // E. <-- D\n  }\n  this.tail = entry;\n  return returnEntry ? entry : entry.value;\n};\n\nvar cache$1 = new Cache(1000);\nvar reservedArgRE = /^in$|^-?\\d+/;\n\n/**\n * Parser state\n */\n\nvar str;\nvar dir;\nvar len;\nvar index;\nvar chr;\nvar state;\nvar startState = 0;\nvar filterState = 1;\nvar filterNameState = 2;\nvar filterArgState = 3;\n\nvar doubleChr = 0x22;\nvar singleChr = 0x27;\nvar pipeChr = 0x7C;\nvar escapeChr = 0x5C;\nvar spaceChr = 0x20;\n\nvar expStartChr = { 0x5B: 1, 0x7B: 1, 0x28: 1 };\nvar expChrPair = { 0x5B: 0x5D, 0x7B: 0x7D, 0x28: 0x29 };\n\nfunction peek() {\n  return str.charCodeAt(index + 1);\n}\n\nfunction next() {\n  return str.charCodeAt(++index);\n}\n\nfunction eof() {\n  return index >= len;\n}\n\nfunction eatSpace() {\n  while (peek() === spaceChr) {\n    next();\n  }\n}\n\nfunction isStringStart(chr) {\n  return chr === doubleChr || chr === singleChr;\n}\n\nfunction isExpStart(chr) {\n  return expStartChr[chr];\n}\n\nfunction isExpEnd(start, chr) {\n  return expChrPair[start] === chr;\n}\n\nfunction parseString() {\n  var stringQuote = next();\n  var chr;\n  while (!eof()) {\n    chr = next();\n    // escape char\n    if (chr === escapeChr) {\n      next();\n    } else if (chr === stringQuote) {\n      break;\n    }\n  }\n}\n\nfunction parseSpecialExp(chr) {\n  var inExp = 0;\n  var startChr = chr;\n\n  while (!eof()) {\n    chr = peek();\n    if (isStringStart(chr)) {\n      parseString();\n      continue;\n    }\n\n    if (startChr === chr) {\n      inExp++;\n    }\n    if (isExpEnd(startChr, chr)) {\n      inExp--;\n    }\n\n    next();\n\n    if (inExp === 0) {\n      break;\n    }\n  }\n}\n\n/**\n * syntax:\n * expression | filterName  [arg  arg [| filterName arg arg]]\n */\n\nfunction parseExpression() {\n  var start = index;\n  while (!eof()) {\n    chr = peek();\n    if (isStringStart(chr)) {\n      parseString();\n    } else if (isExpStart(chr)) {\n      parseSpecialExp(chr);\n    } else if (chr === pipeChr) {\n      next();\n      chr = peek();\n      if (chr === pipeChr) {\n        next();\n      } else {\n        if (state === startState || state === filterArgState) {\n          state = filterState;\n        }\n        break;\n      }\n    } else if (chr === spaceChr && (state === filterNameState || state === filterArgState)) {\n      eatSpace();\n      break;\n    } else {\n      if (state === filterState) {\n        state = filterNameState;\n      }\n      next();\n    }\n  }\n\n  return str.slice(start + 1, index) || null;\n}\n\nfunction parseFilterList() {\n  var filters = [];\n  while (!eof()) {\n    filters.push(parseFilter());\n  }\n  return filters;\n}\n\nfunction parseFilter() {\n  var filter = {};\n  var args;\n\n  state = filterState;\n  filter.name = parseExpression().trim();\n\n  state = filterArgState;\n  args = parseFilterArguments();\n\n  if (args.length) {\n    filter.args = args;\n  }\n  return filter;\n}\n\nfunction parseFilterArguments() {\n  var args = [];\n  while (!eof() && state !== filterState) {\n    var arg = parseExpression();\n    if (!arg) {\n      break;\n    }\n    args.push(processFilterArg(arg));\n  }\n\n  return args;\n}\n\n/**\n * Check if an argument is dynamic and strip quotes.\n *\n * @param {String} arg\n * @return {Object}\n */\n\nfunction processFilterArg(arg) {\n  if (reservedArgRE.test(arg)) {\n    return {\n      value: toNumber(arg),\n      dynamic: false\n    };\n  } else {\n    var stripped = stripQuotes(arg);\n    var dynamic = stripped === arg;\n    return {\n      value: dynamic ? arg : stripped,\n      dynamic: dynamic\n    };\n  }\n}\n\n/**\n * Parse a directive value and extract the expression\n * and its filters into a descriptor.\n *\n * Example:\n *\n * \"a + 1 | uppercase\" will yield:\n * {\n *   expression: 'a + 1',\n *   filters: [\n *     { name: 'uppercase', args: null }\n *   ]\n * }\n *\n * @param {String} s\n * @return {Object}\n */\n\nfunction parseDirective(s) {\n  var hit = cache$1.get(s);\n  if (hit) {\n    return hit;\n  }\n\n  // reset parser state\n  str = s;\n  dir = {};\n  len = str.length;\n  index = -1;\n  chr = '';\n  state = startState;\n\n  var filters;\n\n  if (str.indexOf('|') < 0) {\n    dir.expression = str.trim();\n  } else {\n    dir.expression = parseExpression().trim();\n    filters = parseFilterList();\n    if (filters.length) {\n      dir.filters = filters;\n    }\n  }\n\n  cache$1.put(s, dir);\n  return dir;\n}\n\nvar directive = Object.freeze({\n  parseDirective: parseDirective\n});\n\nvar regexEscapeRE = /[-.*+?^${}()|[\\]\\/\\\\]/g;\nvar cache = undefined;\nvar tagRE = undefined;\nvar htmlRE = undefined;\n/**\n * Escape a string so it can be used in a RegExp\n * constructor.\n *\n * @param {String} str\n */\n\nfunction escapeRegex(str) {\n  return str.replace(regexEscapeRE, '\\\\$&');\n}\n\nfunction compileRegex() {\n  var open = escapeRegex(config.delimiters[0]);\n  var close = escapeRegex(config.delimiters[1]);\n  var unsafeOpen = escapeRegex(config.unsafeDelimiters[0]);\n  var unsafeClose = escapeRegex(config.unsafeDelimiters[1]);\n  tagRE = new RegExp(unsafeOpen + '((?:.|\\\\n)+?)' + unsafeClose + '|' + open + '((?:.|\\\\n)+?)' + close, 'g');\n  htmlRE = new RegExp('^' + unsafeOpen + '((?:.|\\\\n)+?)' + unsafeClose + '$');\n  // reset cache\n  cache = new Cache(1000);\n}\n\n/**\n * Parse a template text string into an array of tokens.\n *\n * @param {String} text\n * @return {Array<Object> | null}\n *               - {String} type\n *               - {String} value\n *               - {Boolean} [html]\n *               - {Boolean} [oneTime]\n */\n\nfunction parseText(text) {\n  if (!cache) {\n    compileRegex();\n  }\n  var hit = cache.get(text);\n  if (hit) {\n    return hit;\n  }\n  if (!tagRE.test(text)) {\n    return null;\n  }\n  var tokens = [];\n  var lastIndex = tagRE.lastIndex = 0;\n  var match, index, html, value, first, oneTime;\n  /* eslint-disable no-cond-assign */\n  while (match = tagRE.exec(text)) {\n    /* eslint-enable no-cond-assign */\n    index = match.index;\n    // push text token\n    if (index > lastIndex) {\n      tokens.push({\n        value: text.slice(lastIndex, index)\n      });\n    }\n    // tag token\n    html = htmlRE.test(match[0]);\n    value = html ? match[1] : match[2];\n    first = value.charCodeAt(0);\n    oneTime = first === 42; // *\n    value = oneTime ? value.slice(1) : value;\n    tokens.push({\n      tag: true,\n      value: value.trim(),\n      html: html,\n      oneTime: oneTime\n    });\n    lastIndex = index + match[0].length;\n  }\n  if (lastIndex < text.length) {\n    tokens.push({\n      value: text.slice(lastIndex)\n    });\n  }\n  cache.put(text, tokens);\n  return tokens;\n}\n\n/**\n * Format a list of tokens into an expression.\n * e.g. tokens parsed from 'a {{b}} c' can be serialized\n * into one single expression as '\"a \" + b + \" c\"'.\n *\n * @param {Array} tokens\n * @param {Vue} [vm]\n * @return {String}\n */\n\nfunction tokensToExp(tokens, vm) {\n  if (tokens.length > 1) {\n    return tokens.map(function (token) {\n      return formatToken(token, vm);\n    }).join('+');\n  } else {\n    return formatToken(tokens[0], vm, true);\n  }\n}\n\n/**\n * Format a single token.\n *\n * @param {Object} token\n * @param {Vue} [vm]\n * @param {Boolean} [single]\n * @return {String}\n */\n\nfunction formatToken(token, vm, single) {\n  return token.tag ? token.oneTime && vm ? '\"' + vm.$eval(token.value) + '\"' : inlineFilters(token.value, single) : '\"' + token.value + '\"';\n}\n\n/**\n * For an attribute with multiple interpolation tags,\n * e.g. attr=\"some-{{thing | filter}}\", in order to combine\n * the whole thing into a single watchable expression, we\n * have to inline those filters. This function does exactly\n * that. This is a bit hacky but it avoids heavy changes\n * to directive parser and watcher mechanism.\n *\n * @param {String} exp\n * @param {Boolean} single\n * @return {String}\n */\n\nvar filterRE = /[^|]\\|[^|]/;\nfunction inlineFilters(exp, single) {\n  if (!filterRE.test(exp)) {\n    return single ? exp : '(' + exp + ')';\n  } else {\n    var dir = parseDirective(exp);\n    if (!dir.filters) {\n      return '(' + exp + ')';\n    } else {\n      return 'this._applyFilters(' + dir.expression + // value\n      ',null,' + // oldValue (null for read)\n      JSON.stringify(dir.filters) + // filter descriptors\n      ',false)'; // write?\n    }\n  }\n}\n\nvar text = Object.freeze({\n  compileRegex: compileRegex,\n  parseText: parseText,\n  tokensToExp: tokensToExp\n});\n\nvar delimiters = ['{{', '}}'];\nvar unsafeDelimiters = ['{{{', '}}}'];\n\nvar config = Object.defineProperties({\n\n  /**\n   * Whether to print debug messages.\n   * Also enables stack trace for warnings.\n   *\n   * @type {Boolean}\n   */\n\n  debug: false,\n\n  /**\n   * Whether to suppress warnings.\n   *\n   * @type {Boolean}\n   */\n\n  silent: false,\n\n  /**\n   * Whether to use async rendering.\n   */\n\n  async: true,\n\n  /**\n   * Whether to warn against errors caught when evaluating\n   * expressions.\n   */\n\n  warnExpressionErrors: true,\n\n  /**\n   * Whether to allow devtools inspection.\n   * Disabled by default in production builds.\n   */\n\n  devtools: 'production' !== 'production',\n\n  /**\n   * Internal flag to indicate the delimiters have been\n   * changed.\n   *\n   * @type {Boolean}\n   */\n\n  _delimitersChanged: true,\n\n  /**\n   * List of asset types that a component can own.\n   *\n   * @type {Array}\n   */\n\n  _assetTypes: ['component', 'directive', 'elementDirective', 'filter', 'transition', 'partial'],\n\n  /**\n   * prop binding modes\n   */\n\n  _propBindingModes: {\n    ONE_WAY: 0,\n    TWO_WAY: 1,\n    ONE_TIME: 2\n  },\n\n  /**\n   * Max circular updates allowed in a batcher flush cycle.\n   */\n\n  _maxUpdateCount: 100\n\n}, {\n  delimiters: { /**\n                 * Interpolation delimiters. Changing these would trigger\n                 * the text parser to re-compile the regular expressions.\n                 *\n                 * @type {Array<String>}\n                 */\n\n    get: function get() {\n      return delimiters;\n    },\n    set: function set(val) {\n      delimiters = val;\n      compileRegex();\n    },\n    configurable: true,\n    enumerable: true\n  },\n  unsafeDelimiters: {\n    get: function get() {\n      return unsafeDelimiters;\n    },\n    set: function set(val) {\n      unsafeDelimiters = val;\n      compileRegex();\n    },\n    configurable: true,\n    enumerable: true\n  }\n});\n\nvar warn = undefined;\n\n/**\n * Append with transition.\n *\n * @param {Element} el\n * @param {Element} target\n * @param {Vue} vm\n * @param {Function} [cb]\n */\n\nfunction appendWithTransition(el, target, vm, cb) {\n  applyTransition(el, 1, function () {\n    target.appendChild(el);\n  }, vm, cb);\n}\n\n/**\n * InsertBefore with transition.\n *\n * @param {Element} el\n * @param {Element} target\n * @param {Vue} vm\n * @param {Function} [cb]\n */\n\nfunction beforeWithTransition(el, target, vm, cb) {\n  applyTransition(el, 1, function () {\n    before(el, target);\n  }, vm, cb);\n}\n\n/**\n * Remove with transition.\n *\n * @param {Element} el\n * @param {Vue} vm\n * @param {Function} [cb]\n */\n\nfunction removeWithTransition(el, vm, cb) {\n  applyTransition(el, -1, function () {\n    remove(el);\n  }, vm, cb);\n}\n\n/**\n * Apply transitions with an operation callback.\n *\n * @param {Element} el\n * @param {Number} direction\n *                  1: enter\n *                 -1: leave\n * @param {Function} op - the actual DOM operation\n * @param {Vue} vm\n * @param {Function} [cb]\n */\n\nfunction applyTransition(el, direction, op, vm, cb) {\n  var transition = el.__v_trans;\n  if (!transition ||\n  // skip if there are no js hooks and CSS transition is\n  // not supported\n  !transition.hooks && !transitionEndEvent ||\n  // skip transitions for initial compile\n  !vm._isCompiled ||\n  // if the vm is being manipulated by a parent directive\n  // during the parent's compilation phase, skip the\n  // animation.\n  vm.$parent && !vm.$parent._isCompiled) {\n    op();\n    if (cb) cb();\n    return;\n  }\n  var action = direction > 0 ? 'enter' : 'leave';\n  transition[action](op, cb);\n}\n\nvar transition = Object.freeze({\n  appendWithTransition: appendWithTransition,\n  beforeWithTransition: beforeWithTransition,\n  removeWithTransition: removeWithTransition,\n  applyTransition: applyTransition\n});\n\n/**\n * Query an element selector if it's not an element already.\n *\n * @param {String|Element} el\n * @return {Element}\n */\n\nfunction query(el) {\n  if (typeof el === 'string') {\n    var selector = el;\n    el = document.querySelector(el);\n    if (!el) {\n      'production' !== 'production' && warn('Cannot find element: ' + selector);\n    }\n  }\n  return el;\n}\n\n/**\n * Check if a node is in the document.\n * Note: document.documentElement.contains should work here\n * but always returns false for comment nodes in phantomjs,\n * making unit tests difficult. This is fixed by doing the\n * contains() check on the node's parentNode instead of\n * the node itself.\n *\n * @param {Node} node\n * @return {Boolean}\n */\n\nfunction inDoc(node) {\n  if (!node) return false;\n  var doc = node.ownerDocument.documentElement;\n  var parent = node.parentNode;\n  return doc === node || doc === parent || !!(parent && parent.nodeType === 1 && doc.contains(parent));\n}\n\n/**\n * Get and remove an attribute from a node.\n *\n * @param {Node} node\n * @param {String} _attr\n */\n\nfunction getAttr(node, _attr) {\n  var val = node.getAttribute(_attr);\n  if (val !== null) {\n    node.removeAttribute(_attr);\n  }\n  return val;\n}\n\n/**\n * Get an attribute with colon or v-bind: prefix.\n *\n * @param {Node} node\n * @param {String} name\n * @return {String|null}\n */\n\nfunction getBindAttr(node, name) {\n  var val = getAttr(node, ':' + name);\n  if (val === null) {\n    val = getAttr(node, 'v-bind:' + name);\n  }\n  return val;\n}\n\n/**\n * Check the presence of a bind attribute.\n *\n * @param {Node} node\n * @param {String} name\n * @return {Boolean}\n */\n\nfunction hasBindAttr(node, name) {\n  return node.hasAttribute(name) || node.hasAttribute(':' + name) || node.hasAttribute('v-bind:' + name);\n}\n\n/**\n * Insert el before target\n *\n * @param {Element} el\n * @param {Element} target\n */\n\nfunction before(el, target) {\n  target.parentNode.insertBefore(el, target);\n}\n\n/**\n * Insert el after target\n *\n * @param {Element} el\n * @param {Element} target\n */\n\nfunction after(el, target) {\n  if (target.nextSibling) {\n    before(el, target.nextSibling);\n  } else {\n    target.parentNode.appendChild(el);\n  }\n}\n\n/**\n * Remove el from DOM\n *\n * @param {Element} el\n */\n\nfunction remove(el) {\n  el.parentNode.removeChild(el);\n}\n\n/**\n * Prepend el to target\n *\n * @param {Element} el\n * @param {Element} target\n */\n\nfunction prepend(el, target) {\n  if (target.firstChild) {\n    before(el, target.firstChild);\n  } else {\n    target.appendChild(el);\n  }\n}\n\n/**\n * Replace target with el\n *\n * @param {Element} target\n * @param {Element} el\n */\n\nfunction replace(target, el) {\n  var parent = target.parentNode;\n  if (parent) {\n    parent.replaceChild(el, target);\n  }\n}\n\n/**\n * Add event listener shorthand.\n *\n * @param {Element} el\n * @param {String} event\n * @param {Function} cb\n * @param {Boolean} [useCapture]\n */\n\nfunction on(el, event, cb, useCapture) {\n  el.addEventListener(event, cb, useCapture);\n}\n\n/**\n * Remove event listener shorthand.\n *\n * @param {Element} el\n * @param {String} event\n * @param {Function} cb\n */\n\nfunction off(el, event, cb) {\n  el.removeEventListener(event, cb);\n}\n\n/**\n * For IE9 compat: when both class and :class are present\n * getAttribute('class') returns wrong value...\n *\n * @param {Element} el\n * @return {String}\n */\n\nfunction getClass(el) {\n  var classname = el.className;\n  if (typeof classname === 'object') {\n    classname = classname.baseVal || '';\n  }\n  return classname;\n}\n\n/**\n * In IE9, setAttribute('class') will result in empty class\n * if the element also has the :class attribute; However in\n * PhantomJS, setting `className` does not work on SVG elements...\n * So we have to do a conditional check here.\n *\n * @param {Element} el\n * @param {String} cls\n */\n\nfunction setClass(el, cls) {\n  /* istanbul ignore if */\n  if (isIE9 && !/svg$/.test(el.namespaceURI)) {\n    el.className = cls;\n  } else {\n    el.setAttribute('class', cls);\n  }\n}\n\n/**\n * Add class with compatibility for IE & SVG\n *\n * @param {Element} el\n * @param {String} cls\n */\n\nfunction addClass(el, cls) {\n  if (el.classList) {\n    el.classList.add(cls);\n  } else {\n    var cur = ' ' + getClass(el) + ' ';\n    if (cur.indexOf(' ' + cls + ' ') < 0) {\n      setClass(el, (cur + cls).trim());\n    }\n  }\n}\n\n/**\n * Remove class with compatibility for IE & SVG\n *\n * @param {Element} el\n * @param {String} cls\n */\n\nfunction removeClass(el, cls) {\n  if (el.classList) {\n    el.classList.remove(cls);\n  } else {\n    var cur = ' ' + getClass(el) + ' ';\n    var tar = ' ' + cls + ' ';\n    while (cur.indexOf(tar) >= 0) {\n      cur = cur.replace(tar, ' ');\n    }\n    setClass(el, cur.trim());\n  }\n  if (!el.className) {\n    el.removeAttribute('class');\n  }\n}\n\n/**\n * Extract raw content inside an element into a temporary\n * container div\n *\n * @param {Element} el\n * @param {Boolean} asFragment\n * @return {Element|DocumentFragment}\n */\n\nfunction extractContent(el, asFragment) {\n  var child;\n  var rawContent;\n  /* istanbul ignore if */\n  if (isTemplate(el) && isFragment(el.content)) {\n    el = el.content;\n  }\n  if (el.hasChildNodes()) {\n    trimNode(el);\n    rawContent = asFragment ? document.createDocumentFragment() : document.createElement('div');\n    /* eslint-disable no-cond-assign */\n    while (child = el.firstChild) {\n      /* eslint-enable no-cond-assign */\n      rawContent.appendChild(child);\n    }\n  }\n  return rawContent;\n}\n\n/**\n * Trim possible empty head/tail text and comment\n * nodes inside a parent.\n *\n * @param {Node} node\n */\n\nfunction trimNode(node) {\n  var child;\n  /* eslint-disable no-sequences */\n  while ((child = node.firstChild, isTrimmable(child))) {\n    node.removeChild(child);\n  }\n  while ((child = node.lastChild, isTrimmable(child))) {\n    node.removeChild(child);\n  }\n  /* eslint-enable no-sequences */\n}\n\nfunction isTrimmable(node) {\n  return node && (node.nodeType === 3 && !node.data.trim() || node.nodeType === 8);\n}\n\n/**\n * Check if an element is a template tag.\n * Note if the template appears inside an SVG its tagName\n * will be in lowercase.\n *\n * @param {Element} el\n */\n\nfunction isTemplate(el) {\n  return el.tagName && el.tagName.toLowerCase() === 'template';\n}\n\n/**\n * Create an \"anchor\" for performing dom insertion/removals.\n * This is used in a number of scenarios:\n * - fragment instance\n * - v-html\n * - v-if\n * - v-for\n * - component\n *\n * @param {String} content\n * @param {Boolean} persist - IE trashes empty textNodes on\n *                            cloneNode(true), so in certain\n *                            cases the anchor needs to be\n *                            non-empty to be persisted in\n *                            templates.\n * @return {Comment|Text}\n */\n\nfunction createAnchor(content, persist) {\n  var anchor = config.debug ? document.createComment(content) : document.createTextNode(persist ? ' ' : '');\n  anchor.__v_anchor = true;\n  return anchor;\n}\n\n/**\n * Find a component ref attribute that starts with $.\n *\n * @param {Element} node\n * @return {String|undefined}\n */\n\nvar refRE = /^v-ref:/;\n\nfunction findRef(node) {\n  if (node.hasAttributes()) {\n    var attrs = node.attributes;\n    for (var i = 0, l = attrs.length; i < l; i++) {\n      var name = attrs[i].name;\n      if (refRE.test(name)) {\n        return camelize(name.replace(refRE, ''));\n      }\n    }\n  }\n}\n\n/**\n * Map a function to a range of nodes .\n *\n * @param {Node} node\n * @param {Node} end\n * @param {Function} op\n */\n\nfunction mapNodeRange(node, end, op) {\n  var next;\n  while (node !== end) {\n    next = node.nextSibling;\n    op(node);\n    node = next;\n  }\n  op(end);\n}\n\n/**\n * Remove a range of nodes with transition, store\n * the nodes in a fragment with correct ordering,\n * and call callback when done.\n *\n * @param {Node} start\n * @param {Node} end\n * @param {Vue} vm\n * @param {DocumentFragment} frag\n * @param {Function} cb\n */\n\nfunction removeNodeRange(start, end, vm, frag, cb) {\n  var done = false;\n  var removed = 0;\n  var nodes = [];\n  mapNodeRange(start, end, function (node) {\n    if (node === end) done = true;\n    nodes.push(node);\n    removeWithTransition(node, vm, onRemoved);\n  });\n  function onRemoved() {\n    removed++;\n    if (done && removed >= nodes.length) {\n      for (var i = 0; i < nodes.length; i++) {\n        frag.appendChild(nodes[i]);\n      }\n      cb && cb();\n    }\n  }\n}\n\n/**\n * Check if a node is a DocumentFragment.\n *\n * @param {Node} node\n * @return {Boolean}\n */\n\nfunction isFragment(node) {\n  return node && node.nodeType === 11;\n}\n\n/**\n * Get outerHTML of elements, taking care\n * of SVG elements in IE as well.\n *\n * @param {Element} el\n * @return {String}\n */\n\nfunction getOuterHTML(el) {\n  if (el.outerHTML) {\n    return el.outerHTML;\n  } else {\n    var container = document.createElement('div');\n    container.appendChild(el.cloneNode(true));\n    return container.innerHTML;\n  }\n}\n\n/**\n * Find a vm from a fragment.\n *\n * @param {Fragment} frag\n * @return {Vue|undefined}\n */\n\nfunction findVmFromFrag(frag) {\n  var node = frag.node;\n  // handle multi-node frag\n  if (frag.end) {\n    while (!node.__vue__ && node !== frag.end && node.nextSibling) {\n      node = node.nextSibling;\n    }\n  }\n  return node.__vue__;\n}\n\nvar commonTagRE = /^(div|p|span|img|a|b|i|br|ul|ol|li|h1|h2|h3|h4|h5|h6|code|pre|table|th|td|tr|form|label|input|select|option|nav|article|section|header|footer)$/i;\nvar reservedTagRE = /^(slot|partial|component)$/i;\n\n/**\n * Check if an element is a component, if yes return its\n * component id.\n *\n * @param {Element} el\n * @param {Object} options\n * @return {Object|undefined}\n */\n\nfunction checkComponentAttr(el, options) {\n  var tag = el.tagName.toLowerCase();\n  var hasAttrs = el.hasAttributes();\n  if (!commonTagRE.test(tag) && !reservedTagRE.test(tag)) {\n    if (resolveAsset(options, 'components', tag)) {\n      return { id: tag };\n    } else {\n      var is = hasAttrs && getIsBinding(el, options);\n      if (is) {\n        return is;\n      } else if ('production' !== 'production') {}\n    }\n  } else if (hasAttrs) {\n    return getIsBinding(el, options);\n  }\n}\n\n/**\n * Get \"is\" binding from an element.\n *\n * @param {Element} el\n * @param {Object} options\n * @return {Object|undefined}\n */\n\nfunction getIsBinding(el, options) {\n  // dynamic syntax\n  var exp = el.getAttribute('is');\n  if (exp != null) {\n    if (resolveAsset(options, 'components', exp)) {\n      el.removeAttribute('is');\n      return { id: exp };\n    }\n  } else {\n    exp = getBindAttr(el, 'is');\n    if (exp != null) {\n      return { id: exp, dynamic: true };\n    }\n  }\n}\n\n/**\n * Option overwriting strategies are functions that handle\n * how to merge a parent option value and a child option\n * value into the final value.\n *\n * All strategy functions follow the same signature:\n *\n * @param {*} parentVal\n * @param {*} childVal\n * @param {Vue} [vm]\n */\n\nvar strats = config.optionMergeStrategies = Object.create(null);\n\n/**\n * Helper that recursively merges two data objects together.\n */\n\nfunction mergeData(to, from) {\n  var key, toVal, fromVal;\n  for (key in from) {\n    toVal = to[key];\n    fromVal = from[key];\n    if (!hasOwn(to, key)) {\n      set(to, key, fromVal);\n    } else if (isObject(toVal) && isObject(fromVal)) {\n      mergeData(toVal, fromVal);\n    }\n  }\n  return to;\n}\n\n/**\n * Data\n */\n\nstrats.data = function (parentVal, childVal, vm) {\n  if (!vm) {\n    // in a Vue.extend merge, both should be functions\n    if (!childVal) {\n      return parentVal;\n    }\n    if (typeof childVal !== 'function') {\n      'production' !== 'production' && warn('The \"data\" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.', vm);\n      return parentVal;\n    }\n    if (!parentVal) {\n      return childVal;\n    }\n    // when parentVal & childVal are both present,\n    // we need to return a function that returns the\n    // merged result of both functions... no need to\n    // check if parentVal is a function here because\n    // it has to be a function to pass previous merges.\n    return function mergedDataFn() {\n      return mergeData(childVal.call(this), parentVal.call(this));\n    };\n  } else if (parentVal || childVal) {\n    return function mergedInstanceDataFn() {\n      // instance merge\n      var instanceData = typeof childVal === 'function' ? childVal.call(vm) : childVal;\n      var defaultData = typeof parentVal === 'function' ? parentVal.call(vm) : undefined;\n      if (instanceData) {\n        return mergeData(instanceData, defaultData);\n      } else {\n        return defaultData;\n      }\n    };\n  }\n};\n\n/**\n * El\n */\n\nstrats.el = function (parentVal, childVal, vm) {\n  if (!vm && childVal && typeof childVal !== 'function') {\n    'production' !== 'production' && warn('The \"el\" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.', vm);\n    return;\n  }\n  var ret = childVal || parentVal;\n  // invoke the element factory if this is instance merge\n  return vm && typeof ret === 'function' ? ret.call(vm) : ret;\n};\n\n/**\n * Hooks and param attributes are merged as arrays.\n */\n\nstrats.init = strats.created = strats.ready = strats.attached = strats.detached = strats.beforeCompile = strats.compiled = strats.beforeDestroy = strats.destroyed = strats.activate = function (parentVal, childVal) {\n  return childVal ? parentVal ? parentVal.concat(childVal) : isArray(childVal) ? childVal : [childVal] : parentVal;\n};\n\n/**\n * Assets\n *\n * When a vm is present (instance creation), we need to do\n * a three-way merge between constructor options, instance\n * options and parent options.\n */\n\nfunction mergeAssets(parentVal, childVal) {\n  var res = Object.create(parentVal || null);\n  return childVal ? extend(res, guardArrayAssets(childVal)) : res;\n}\n\nconfig._assetTypes.forEach(function (type) {\n  strats[type + 's'] = mergeAssets;\n});\n\n/**\n * Events & Watchers.\n *\n * Events & watchers hashes should not overwrite one\n * another, so we merge them as arrays.\n */\n\nstrats.watch = strats.events = function (parentVal, childVal) {\n  if (!childVal) return parentVal;\n  if (!parentVal) return childVal;\n  var ret = {};\n  extend(ret, parentVal);\n  for (var key in childVal) {\n    var parent = ret[key];\n    var child = childVal[key];\n    if (parent && !isArray(parent)) {\n      parent = [parent];\n    }\n    ret[key] = parent ? parent.concat(child) : [child];\n  }\n  return ret;\n};\n\n/**\n * Other object hashes.\n */\n\nstrats.props = strats.methods = strats.computed = function (parentVal, childVal) {\n  if (!childVal) return parentVal;\n  if (!parentVal) return childVal;\n  var ret = Object.create(null);\n  extend(ret, parentVal);\n  extend(ret, childVal);\n  return ret;\n};\n\n/**\n * Default strategy.\n */\n\nvar defaultStrat = function defaultStrat(parentVal, childVal) {\n  return childVal === undefined ? parentVal : childVal;\n};\n\n/**\n * Make sure component options get converted to actual\n * constructors.\n *\n * @param {Object} options\n */\n\nfunction guardComponents(options) {\n  if (options.components) {\n    var components = options.components = guardArrayAssets(options.components);\n    var ids = Object.keys(components);\n    var def;\n    if ('production' !== 'production') {}\n    for (var i = 0, l = ids.length; i < l; i++) {\n      var key = ids[i];\n      if (commonTagRE.test(key) || reservedTagRE.test(key)) {\n        'production' !== 'production' && warn('Do not use built-in or reserved HTML elements as component ' + 'id: ' + key);\n        continue;\n      }\n      // record a all lowercase <-> kebab-case mapping for\n      // possible custom element case error warning\n      if ('production' !== 'production') {}\n      def = components[key];\n      if (isPlainObject(def)) {\n        components[key] = Vue.extend(def);\n      }\n    }\n  }\n}\n\n/**\n * Ensure all props option syntax are normalized into the\n * Object-based format.\n *\n * @param {Object} options\n */\n\nfunction guardProps(options) {\n  var props = options.props;\n  var i, val;\n  if (isArray(props)) {\n    options.props = {};\n    i = props.length;\n    while (i--) {\n      val = props[i];\n      if (typeof val === 'string') {\n        options.props[val] = null;\n      } else if (val.name) {\n        options.props[val.name] = val;\n      }\n    }\n  } else if (isPlainObject(props)) {\n    var keys = Object.keys(props);\n    i = keys.length;\n    while (i--) {\n      val = props[keys[i]];\n      if (typeof val === 'function') {\n        props[keys[i]] = { type: val };\n      }\n    }\n  }\n}\n\n/**\n * Guard an Array-format assets option and converted it\n * into the key-value Object format.\n *\n * @param {Object|Array} assets\n * @return {Object}\n */\n\nfunction guardArrayAssets(assets) {\n  if (isArray(assets)) {\n    var res = {};\n    var i = assets.length;\n    var asset;\n    while (i--) {\n      asset = assets[i];\n      var id = typeof asset === 'function' ? asset.options && asset.options.name || asset.id : asset.name || asset.id;\n      if (!id) {\n        'production' !== 'production' && warn('Array-syntax assets must provide a \"name\" or \"id\" field.');\n      } else {\n        res[id] = asset;\n      }\n    }\n    return res;\n  }\n  return assets;\n}\n\n/**\n * Merge two option objects into a new one.\n * Core utility used in both instantiation and inheritance.\n *\n * @param {Object} parent\n * @param {Object} child\n * @param {Vue} [vm] - if vm is present, indicates this is\n *                     an instantiation merge.\n */\n\nfunction mergeOptions(parent, child, vm) {\n  guardComponents(child);\n  guardProps(child);\n  if ('production' !== 'production') {}\n  var options = {};\n  var key;\n  if (child['extends']) {\n    parent = typeof child['extends'] === 'function' ? mergeOptions(parent, child['extends'].options, vm) : mergeOptions(parent, child['extends'], vm);\n  }\n  if (child.mixins) {\n    for (var i = 0, l = child.mixins.length; i < l; i++) {\n      var mixin = child.mixins[i];\n      var mixinOptions = mixin.prototype instanceof Vue ? mixin.options : mixin;\n      parent = mergeOptions(parent, mixinOptions, vm);\n    }\n  }\n  for (key in parent) {\n    mergeField(key);\n  }\n  for (key in child) {\n    if (!hasOwn(parent, key)) {\n      mergeField(key);\n    }\n  }\n  function mergeField(key) {\n    var strat = strats[key] || defaultStrat;\n    options[key] = strat(parent[key], child[key], vm, key);\n  }\n  return options;\n}\n\n/**\n * Resolve an asset.\n * This function is used because child instances need access\n * to assets defined in its ancestor chain.\n *\n * @param {Object} options\n * @param {String} type\n * @param {String} id\n * @param {Boolean} warnMissing\n * @return {Object|Function}\n */\n\nfunction resolveAsset(options, type, id, warnMissing) {\n  /* istanbul ignore if */\n  if (typeof id !== 'string') {\n    return;\n  }\n  var assets = options[type];\n  var camelizedId;\n  var res = assets[id] ||\n  // camelCase ID\n  assets[camelizedId = camelize(id)] ||\n  // Pascal Case ID\n  assets[camelizedId.charAt(0).toUpperCase() + camelizedId.slice(1)];\n  if ('production' !== 'production' && warnMissing && !res) {}\n  return res;\n}\n\nvar uid$1 = 0;\n\n/**\n * A dep is an observable that can have multiple\n * directives subscribing to it.\n *\n * @constructor\n */\nfunction Dep() {\n  this.id = uid$1++;\n  this.subs = [];\n}\n\n// the current target watcher being evaluated.\n// this is globally unique because there could be only one\n// watcher being evaluated at any time.\nDep.target = null;\n\n/**\n * Add a directive subscriber.\n *\n * @param {Directive} sub\n */\n\nDep.prototype.addSub = function (sub) {\n  this.subs.push(sub);\n};\n\n/**\n * Remove a directive subscriber.\n *\n * @param {Directive} sub\n */\n\nDep.prototype.removeSub = function (sub) {\n  this.subs.$remove(sub);\n};\n\n/**\n * Add self as a dependency to the target watcher.\n */\n\nDep.prototype.depend = function () {\n  Dep.target.addDep(this);\n};\n\n/**\n * Notify all subscribers of a new value.\n */\n\nDep.prototype.notify = function () {\n  // stablize the subscriber list first\n  var subs = toArray(this.subs);\n  for (var i = 0, l = subs.length; i < l; i++) {\n    subs[i].update();\n  }\n};\n\nvar arrayProto = Array.prototype;\nvar arrayMethods = Object.create(arrayProto)\n\n/**\n * Intercept mutating methods and emit events\n */\n\n;['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(function (method) {\n  // cache original method\n  var original = arrayProto[method];\n  def(arrayMethods, method, function mutator() {\n    // avoid leaking arguments:\n    // http://jsperf.com/closure-with-arguments\n    var i = arguments.length;\n    var args = new Array(i);\n    while (i--) {\n      args[i] = arguments[i];\n    }\n    var result = original.apply(this, args);\n    var ob = this.__ob__;\n    var inserted;\n    switch (method) {\n      case 'push':\n        inserted = args;\n        break;\n      case 'unshift':\n        inserted = args;\n        break;\n      case 'splice':\n        inserted = args.slice(2);\n        break;\n    }\n    if (inserted) ob.observeArray(inserted);\n    // notify change\n    ob.dep.notify();\n    return result;\n  });\n});\n\n/**\n * Swap the element at the given index with a new value\n * and emits corresponding event.\n *\n * @param {Number} index\n * @param {*} val\n * @return {*} - replaced element\n */\n\ndef(arrayProto, '$set', function $set(index, val) {\n  if (index >= this.length) {\n    this.length = Number(index) + 1;\n  }\n  return this.splice(index, 1, val)[0];\n});\n\n/**\n * Convenience method to remove the element at given index or target element reference.\n *\n * @param {*} item\n */\n\ndef(arrayProto, '$remove', function $remove(item) {\n  /* istanbul ignore if */\n  if (!this.length) return;\n  var index = indexOf(this, item);\n  if (index > -1) {\n    return this.splice(index, 1);\n  }\n});\n\nvar arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n\n/**\n * By default, when a reactive property is set, the new value is\n * also converted to become reactive. However in certain cases, e.g.\n * v-for scope alias and props, we don't want to force conversion\n * because the value may be a nested value under a frozen data structure.\n *\n * So whenever we want to set a reactive property without forcing\n * conversion on the new value, we wrap that call inside this function.\n */\n\nvar shouldConvert = true;\n\nfunction withoutConversion(fn) {\n  shouldConvert = false;\n  fn();\n  shouldConvert = true;\n}\n\n/**\n * Observer class that are attached to each observed\n * object. Once attached, the observer converts target\n * object's property keys into getter/setters that\n * collect dependencies and dispatches updates.\n *\n * @param {Array|Object} value\n * @constructor\n */\n\nfunction Observer(value) {\n  this.value = value;\n  this.dep = new Dep();\n  def(value, '__ob__', this);\n  if (isArray(value)) {\n    var augment = hasProto ? protoAugment : copyAugment;\n    augment(value, arrayMethods, arrayKeys);\n    this.observeArray(value);\n  } else {\n    this.walk(value);\n  }\n}\n\n// Instance methods\n\n/**\n * Walk through each property and convert them into\n * getter/setters. This method should only be called when\n * value type is Object.\n *\n * @param {Object} obj\n */\n\nObserver.prototype.walk = function (obj) {\n  var keys = Object.keys(obj);\n  for (var i = 0, l = keys.length; i < l; i++) {\n    this.convert(keys[i], obj[keys[i]]);\n  }\n};\n\n/**\n * Observe a list of Array items.\n *\n * @param {Array} items\n */\n\nObserver.prototype.observeArray = function (items) {\n  for (var i = 0, l = items.length; i < l; i++) {\n    observe(items[i]);\n  }\n};\n\n/**\n * Convert a property into getter/setter so we can emit\n * the events when the property is accessed/changed.\n *\n * @param {String} key\n * @param {*} val\n */\n\nObserver.prototype.convert = function (key, val) {\n  defineReactive(this.value, key, val);\n};\n\n/**\n * Add an owner vm, so that when $set/$delete mutations\n * happen we can notify owner vms to proxy the keys and\n * digest the watchers. This is only called when the object\n * is observed as an instance's root $data.\n *\n * @param {Vue} vm\n */\n\nObserver.prototype.addVm = function (vm) {\n  (this.vms || (this.vms = [])).push(vm);\n};\n\n/**\n * Remove an owner vm. This is called when the object is\n * swapped out as an instance's $data object.\n *\n * @param {Vue} vm\n */\n\nObserver.prototype.removeVm = function (vm) {\n  this.vms.$remove(vm);\n};\n\n// helpers\n\n/**\n * Augment an target Object or Array by intercepting\n * the prototype chain using __proto__\n *\n * @param {Object|Array} target\n * @param {Object} src\n */\n\nfunction protoAugment(target, src) {\n  /* eslint-disable no-proto */\n  target.__proto__ = src;\n  /* eslint-enable no-proto */\n}\n\n/**\n * Augment an target Object or Array by defining\n * hidden properties.\n *\n * @param {Object|Array} target\n * @param {Object} proto\n */\n\nfunction copyAugment(target, src, keys) {\n  for (var i = 0, l = keys.length; i < l; i++) {\n    var key = keys[i];\n    def(target, key, src[key]);\n  }\n}\n\n/**\n * Attempt to create an observer instance for a value,\n * returns the new observer if successfully observed,\n * or the existing observer if the value already has one.\n *\n * @param {*} value\n * @param {Vue} [vm]\n * @return {Observer|undefined}\n * @static\n */\n\nfunction observe(value, vm) {\n  if (!value || typeof value !== 'object') {\n    return;\n  }\n  var ob;\n  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n    ob = value.__ob__;\n  } else if (shouldConvert && (isArray(value) || isPlainObject(value)) && Object.isExtensible(value) && !value._isVue) {\n    ob = new Observer(value);\n  }\n  if (ob && vm) {\n    ob.addVm(vm);\n  }\n  return ob;\n}\n\n/**\n * Define a reactive property on an Object.\n *\n * @param {Object} obj\n * @param {String} key\n * @param {*} val\n */\n\nfunction defineReactive(obj, key, val) {\n  var dep = new Dep();\n\n  var property = Object.getOwnPropertyDescriptor(obj, key);\n  if (property && property.configurable === false) {\n    return;\n  }\n\n  // cater for pre-defined getter/setters\n  var getter = property && property.get;\n  var setter = property && property.set;\n\n  var childOb = observe(val);\n  Object.defineProperty(obj, key, {\n    enumerable: true,\n    configurable: true,\n    get: function reactiveGetter() {\n      var value = getter ? getter.call(obj) : val;\n      if (Dep.target) {\n        dep.depend();\n        if (childOb) {\n          childOb.dep.depend();\n        }\n        if (isArray(value)) {\n          for (var e, i = 0, l = value.length; i < l; i++) {\n            e = value[i];\n            e && e.__ob__ && e.__ob__.dep.depend();\n          }\n        }\n      }\n      return value;\n    },\n    set: function reactiveSetter(newVal) {\n      var value = getter ? getter.call(obj) : val;\n      if (newVal === value) {\n        return;\n      }\n      if (setter) {\n        setter.call(obj, newVal);\n      } else {\n        val = newVal;\n      }\n      childOb = observe(newVal);\n      dep.notify();\n    }\n  });\n}\n\n\n\nvar util = Object.freeze({\n\tdefineReactive: defineReactive,\n\tset: set,\n\tdel: del,\n\thasOwn: hasOwn,\n\tisLiteral: isLiteral,\n\tisReserved: isReserved,\n\t_toString: _toString,\n\ttoNumber: toNumber,\n\ttoBoolean: toBoolean,\n\tstripQuotes: stripQuotes,\n\tcamelize: camelize,\n\thyphenate: hyphenate,\n\tclassify: classify,\n\tbind: bind,\n\ttoArray: toArray,\n\textend: extend,\n\tisObject: isObject,\n\tisPlainObject: isPlainObject,\n\tdef: def,\n\tdebounce: _debounce,\n\tindexOf: indexOf,\n\tcancellable: cancellable,\n\tlooseEqual: looseEqual,\n\tisArray: isArray,\n\thasProto: hasProto,\n\tinBrowser: inBrowser,\n\tdevtools: devtools,\n\tisIE: isIE,\n\tisIE9: isIE9,\n\tisAndroid: isAndroid,\n\tget transitionProp () { return transitionProp; },\n\tget transitionEndEvent () { return transitionEndEvent; },\n\tget animationProp () { return animationProp; },\n\tget animationEndEvent () { return animationEndEvent; },\n\tnextTick: nextTick,\n\tget _Set () { return _Set; },\n\tquery: query,\n\tinDoc: inDoc,\n\tgetAttr: getAttr,\n\tgetBindAttr: getBindAttr,\n\thasBindAttr: hasBindAttr,\n\tbefore: before,\n\tafter: after,\n\tremove: remove,\n\tprepend: prepend,\n\treplace: replace,\n\ton: on,\n\toff: off,\n\tsetClass: setClass,\n\taddClass: addClass,\n\tremoveClass: removeClass,\n\textractContent: extractContent,\n\ttrimNode: trimNode,\n\tisTemplate: isTemplate,\n\tcreateAnchor: createAnchor,\n\tfindRef: findRef,\n\tmapNodeRange: mapNodeRange,\n\tremoveNodeRange: removeNodeRange,\n\tisFragment: isFragment,\n\tgetOuterHTML: getOuterHTML,\n\tfindVmFromFrag: findVmFromFrag,\n\tmergeOptions: mergeOptions,\n\tresolveAsset: resolveAsset,\n\tcheckComponentAttr: checkComponentAttr,\n\tcommonTagRE: commonTagRE,\n\treservedTagRE: reservedTagRE,\n\twarn: warn\n});\n\nvar uid = 0;\n\nfunction initMixin (Vue) {\n  /**\n   * The main init sequence. This is called for every\n   * instance, including ones that are created from extended\n   * constructors.\n   *\n   * @param {Object} options - this options object should be\n   *                           the result of merging class\n   *                           options and the options passed\n   *                           in to the constructor.\n   */\n\n  Vue.prototype._init = function (options) {\n    options = options || {};\n\n    this.$el = null;\n    this.$parent = options.parent;\n    this.$root = this.$parent ? this.$parent.$root : this;\n    this.$children = [];\n    this.$refs = {}; // child vm references\n    this.$els = {}; // element references\n    this._watchers = []; // all watchers as an array\n    this._directives = []; // all directives\n\n    // a uid\n    this._uid = uid++;\n\n    // a flag to avoid this being observed\n    this._isVue = true;\n\n    // events bookkeeping\n    this._events = {}; // registered callbacks\n    this._eventsCount = {}; // for $broadcast optimization\n\n    // fragment instance properties\n    this._isFragment = false;\n    this._fragment = // @type {DocumentFragment}\n    this._fragmentStart = // @type {Text|Comment}\n    this._fragmentEnd = null; // @type {Text|Comment}\n\n    // lifecycle state\n    this._isCompiled = this._isDestroyed = this._isReady = this._isAttached = this._isBeingDestroyed = this._vForRemoving = false;\n    this._unlinkFn = null;\n\n    // context:\n    // if this is a transcluded component, context\n    // will be the common parent vm of this instance\n    // and its host.\n    this._context = options._context || this.$parent;\n\n    // scope:\n    // if this is inside an inline v-for, the scope\n    // will be the intermediate scope created for this\n    // repeat fragment. this is used for linking props\n    // and container directives.\n    this._scope = options._scope;\n\n    // fragment:\n    // if this instance is compiled inside a Fragment, it\n    // needs to register itself as a child of that fragment\n    // for attach/detach to work properly.\n    this._frag = options._frag;\n    if (this._frag) {\n      this._frag.children.push(this);\n    }\n\n    // push self into parent / transclusion host\n    if (this.$parent) {\n      this.$parent.$children.push(this);\n    }\n\n    // merge options.\n    options = this.$options = mergeOptions(this.constructor.options, options, this);\n\n    // set ref\n    this._updateRef();\n\n    // initialize data as empty object.\n    // it will be filled up in _initData().\n    this._data = {};\n\n    // call init hook\n    this._callHook('init');\n\n    // initialize data observation and scope inheritance.\n    this._initState();\n\n    // setup event system and option events.\n    this._initEvents();\n\n    // call created hook\n    this._callHook('created');\n\n    // if `el` option is passed, start compilation.\n    if (options.el) {\n      this.$mount(options.el);\n    }\n  };\n}\n\nvar __commonjs_global = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : undefined;\nvar primitives = (function (module, global) {\nvar exports = module.exports;\nvar names = ['Object', 'String', 'Boolean', 'Number', 'RegExp', 'Date', 'Array']\nvar immutable = {string: 'String', boolean: 'Boolean', number: 'Number' }\n\nvar primitives = names.map(getGlobal)\nvar protos = primitives.map(getProto)\n\nvar protoReplacements = {}\n\nmodule.exports = Primitives\n\nfunction Primitives(context){\n  if (this instanceof Primitives){\n    this.context = context\n    for (var i=0;i<names.length;i++){\n      if (!this.context[names[i]]){\n        this.context[names[i]] = wrap(primitives[i])\n      }\n    }\n  } else {\n    return new Primitives(context)\n  }\n}\n\nPrimitives.prototype.replace = function(value){\n  var primIndex = primitives.indexOf(value)\n  var protoIndex = protos.indexOf(value)\n\n  if (~primIndex){\n    var name = names[primIndex]\n    return this.context[name]\n  } else if (~protoIndex) {\n    var name = names[protoIndex]\n    return this.context[name].prototype\n  } else  {\n    return value\n  }\n}\n\nPrimitives.prototype.getPropertyObject = function(object, property){\n  if (immutable[typeof object]){\n    return this.getPrototypeOf(object)\n  }\n  return object\n}\n\nPrimitives.prototype.isPrimitive = function(value){\n  return !!~primitives.indexOf(value) || !!~protos.indexOf(value)\n}\n\nPrimitives.prototype.getPrototypeOf = function(value){\n  if (value == null){ // handle null and undefined\n    return value\n  }\n\n  var immutableType = immutable[typeof value]\n  if (immutableType){\n    var proto = this.context[immutableType].prototype\n  } else {\n    var proto = Object.getPrototypeOf(value)\n  }\n\n  if (!proto || proto === Object.prototype){\n    return null\n  } else {\n    var replacement = this.replace(proto)\n    if (replacement === value){\n      replacement = this.replace(Object.prototype)\n    }\n    return replacement\n  }\n}\n\nPrimitives.prototype.applyNew = function(func, args){\n  if (func.wrapped){\n    var prim = Object.getPrototypeOf(func)\n    var instance = new (Function.prototype.bind.apply(prim, arguments))\n    setProto(instance, func.prototype)\n    return instance\n  } else {\n    return new (Function.prototype.bind.apply(func, arguments))\n  }\n}\n\nfunction getProto(func){\n  return func.prototype\n}\n\nfunction getGlobal(str){\n  return global[str]\n}\n\nfunction setProto(obj, proto){\n  obj.__proto__ = proto\n}\n\nfunction wrap(prim){\n  var proto = Object.create(prim.prototype)\n\n  var result = function() {\n    if (this instanceof result){\n      prim.apply(this, arguments)\n    } else {\n      var instance = prim.apply(null, arguments)\n      setProto(instance, proto)\n      return instance\n    }\n  }\n  setProto(result, prim)\n  result.prototype = proto\n  result.wrapped = true\n  return result\n}\nreturn module.exports;\n})({exports:{}}, __commonjs_global);\n\nvar infiniteChecker = (function (module) {\nvar exports = module.exports;\nmodule.exports = InfiniteChecker\n\nfunction InfiniteChecker(maxIterations){\n  if (this instanceof InfiniteChecker){\n    this.maxIterations = maxIterations\n    this.count = 0\n  } else {\n    return new InfiniteChecker(maxIterations)\n  }\n}\n\nInfiniteChecker.prototype.check = function(){\n  this.count += 1\n  if (this.count > this.maxIterations){\n    throw new Error('Infinite loop detected - reached max iterations')\n  }\n}\nreturn module.exports;\n})({exports:{}});\n\nvar index$1 = (function (module) {\nvar exports = module.exports;\nmodule.exports = hoist\n\nfunction hoist(ast){\n\n  var parentStack = []\n  var variables = []\n  var functions = []\n\n  if (Array.isArray(ast)){\n\n    walkAll(ast)\n    prependScope(ast, variables, functions)\n\n  } else {\n    walk(ast)\n  }\n\n  return ast\n\n  // walk through each node of a program of block statement\n  function walkAll(nodes){\n    var result = null\n    for (var i=0;i<nodes.length;i++){\n      var childNode = nodes[i]\n      if (childNode.type === 'EmptyStatement') continue\n      var result = walk(childNode)\n      if (result === 'remove'){\n        nodes.splice(i--, 1)\n      }\n    }\n  }\n\n  function walk(node){\n    var parent = parentStack[parentStack.length-1]\n    var remove = false\n    parentStack.push(node)\n\n    var excludeBody = false\n    if (shouldScope(node, parent)){\n      hoist(node.body)\n      excludeBody = true\n    }\n\n    if (node.type === 'VariableDeclarator'){\n      variables.push(node)\n    }\n\n    if (node.type === 'FunctionDeclaration'){\n      functions.push(node)\n      remove = true\n    }\n\n    for (var key in node){\n      if (key === 'type' || (excludeBody && key === 'body')) continue\n      if (key in node && node[key] && typeof node[key] == 'object'){\n        if (node[key].type){\n          walk(node[key])\n        } else if (Array.isArray(node[key])){\n          walkAll(node[key])\n        }\n      }\n    }\n\n    parentStack.pop()\n    if (remove){\n      return 'remove'\n    }\n  }\n}\n\nfunction shouldScope(node, parent){\n  if (node.type === 'Program'){\n    return true\n  } else if (node.type === 'BlockStatement'){\n    if (parent && (parent.type === 'FunctionExpression' || parent.type === 'FunctionDeclaration')){\n      return true\n    }\n  }\n}\n\nfunction prependScope(nodes, variables, functions){\n  if (variables && variables.length){\n    var declarations = []\n    for (var i=0;i<variables.length;i++){\n      declarations.push({\n        type: 'VariableDeclarator',\n        id: variables[i].id,\n        init: null\n      })\n    }\n\n    nodes.unshift({\n      type: 'VariableDeclaration',\n      kind: 'var',\n      declarations: declarations\n    })\n\n  }\n\n  if (functions && functions.length){\n    for (var i=0;i<functions.length;i++){\n      nodes.unshift(functions[i])\n    }\n  }\n}\nreturn module.exports;\n})({exports:{}});\n\nvar esprima = (function (module) {\nvar exports = module.exports;\n/*\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/*jslint bitwise:true plusplus:true */\n/*global esprima:true, define:true, exports:true, window: true,\nthrowError: true, createLiteral: true, generateStatement: true,\nparseAssignmentExpression: true, parseBlock: true, parseExpression: true,\nparseFunctionDeclaration: true, parseFunctionExpression: true,\nparseFunctionSourceElements: true, parseVariableIdentifier: true,\nparseLeftHandSideExpression: true,\nparseStatement: true, parseSourceElement: true */\n\n(function (root, factory) {\n    'use strict';\n\n    // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,\n    // Rhino, and plain browser loading.\n    if (typeof define === 'function' && define.amd) {\n        define(['exports'], factory);\n    } else if (typeof exports !== 'undefined') {\n        factory(exports);\n    } else {\n        factory((root.esprima = {}));\n    }\n}(this, function (exports) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        PropertyKind,\n        Messages,\n        Regex,\n        source,\n        strict,\n        index,\n        lineNumber,\n        lineStart,\n        length,\n        buffer,\n        state,\n        extra;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        AssignmentExpression: 'AssignmentExpression',\n        ArrayExpression: 'ArrayExpression',\n        BlockStatement: 'BlockStatement',\n        BinaryExpression: 'BinaryExpression',\n        BreakStatement: 'BreakStatement',\n        CallExpression: 'CallExpression',\n        CatchClause: 'CatchClause',\n        ConditionalExpression: 'ConditionalExpression',\n        ContinueStatement: 'ContinueStatement',\n        DoWhileStatement: 'DoWhileStatement',\n        DebuggerStatement: 'DebuggerStatement',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        ForStatement: 'ForStatement',\n        ForInStatement: 'ForInStatement',\n        FunctionDeclaration: 'FunctionDeclaration',\n        FunctionExpression: 'FunctionExpression',\n        Identifier: 'Identifier',\n        IfStatement: 'IfStatement',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        NewExpression: 'NewExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ReturnStatement: 'ReturnStatement',\n        SequenceExpression: 'SequenceExpression',\n        SwitchStatement: 'SwitchStatement',\n        SwitchCase: 'SwitchCase',\n        ThisExpression: 'ThisExpression',\n        ThrowStatement: 'ThrowStatement',\n        TryStatement: 'TryStatement',\n        UnaryExpression: 'UnaryExpression',\n        UpdateExpression: 'UpdateExpression',\n        VariableDeclaration: 'VariableDeclaration',\n        VariableDeclarator: 'VariableDeclarator',\n        WhileStatement: 'WhileStatement',\n        WithStatement: 'WithStatement'\n    };\n\n    PropertyKind = {\n        Data: 1,\n        Get: 2,\n        Set: 4\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnexpectedNumber:  'Unexpected number',\n        UnexpectedString:  'Unexpected string',\n        UnexpectedIdentifier:  'Unexpected identifier',\n        UnexpectedReserved:  'Unexpected reserved word',\n        UnexpectedEOS:  'Unexpected end of input',\n        NewlineAfterThrow:  'Illegal newline after throw',\n        InvalidRegExp: 'Invalid regular expression',\n        UnterminatedRegExp:  'Invalid regular expression: missing /',\n        InvalidLHSInAssignment:  'Invalid left-hand side in assignment',\n        InvalidLHSInForIn:  'Invalid left-hand side in for-in',\n        MultipleDefaultsInSwitch: 'More than one default clause in switch statement',\n        NoCatchOrFinally:  'Missing catch or finally after try',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared',\n        IllegalContinue: 'Illegal continue statement',\n        IllegalBreak: 'Illegal break statement',\n        IllegalReturn: 'Illegal return statement',\n        StrictModeWith:  'Strict mode code may not include a with statement',\n        StrictCatchVariable:  'Catch variable may not be eval or arguments in strict mode',\n        StrictVarName:  'Variable name may not be eval or arguments in strict mode',\n        StrictParamName:  'Parameter name eval or arguments is not allowed in strict mode',\n        StrictParamDupe: 'Strict mode function may not have duplicate parameter names',\n        StrictFunctionName:  'Function name may not be eval or arguments in strict mode',\n        StrictOctalLiteral:  'Octal literals are not allowed in strict mode.',\n        StrictDelete:  'Delete of an unqualified identifier in strict mode.',\n        StrictDuplicateProperty:  'Duplicate data property in object literal not allowed in strict mode',\n        AccessorDataProperty:  'Object literal may not have data and accessor property with the same name',\n        AccessorGetSet:  'Object literal may not have multiple get/set accessors with the same name',\n        StrictLHSAssignment:  'Assignment to eval or arguments is not allowed in strict mode',\n        StrictLHSPostfix:  'Postfix increment/decrement may not have eval or arguments operand in strict mode',\n        StrictLHSPrefix:  'Prefix increment/decrement may not have eval or arguments operand in strict mode',\n        StrictReservedWord:  'Use of future reserved word in strict mode'\n    };\n\n    // See also tools/generate-unicode-regex.py.\n    Regex = {\n        NonAsciiIdentifierStart: new RegExp('[\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0370-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u048a-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0620-\\u064a\\u066e\\u066f\\u0671-\\u06d3\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\\u0712-\\u072f\\u074d-\\u07a5\\u07b1\\u07ca-\\u07ea\\u07f4\\u07f5\\u07fa\\u0800-\\u0815\\u081a\\u0824\\u0828\\u0840-\\u0858\\u08a0\\u08a2-\\u08ac\\u0904-\\u0939\\u093d\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097f\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df-\\u09e1\\u09f0\\u09f1\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bd0\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c33\\u0c35-\\u0c39\\u0c3d\\u0c58\\u0c59\\u0c60\\u0c61\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d\\u0d4e\\u0d60\\u0d61\\u0d7a-\\u0d7f\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0e01-\\u0e30\\u0e32\\u0e33\\u0e40-\\u0e46\\u0e81\\u0e82\\u0e84\\u0e87\\u0e88\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\\u0eaa\\u0eab\\u0ead-\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0edc-\\u0edf\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6c\\u0f88-\\u0f8c\\u1000-\\u102a\\u103f\\u1050-\\u1055\\u105a-\\u105d\\u1061\\u1065\\u1066\\u106e-\\u1070\\u1075-\\u1081\\u108e\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f0\\u1700-\\u170c\\u170e-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\\u17dc\\u1820-\\u1877\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191c\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19c1-\\u19c7\\u1a00-\\u1a16\\u1a20-\\u1a54\\u1aa7\\u1b05-\\u1b33\\u1b45-\\u1b4b\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bba-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1ce9-\\u1cec\\u1cee-\\u1cf1\\u1cf5\\u1cf6\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\\u212f-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u2c00-\\u2c2e\\u2c30-\\u2c5e\\u2c60-\\u2ce4\\u2ceb-\\u2cee\\u2cf2\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u2e2f\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312d\\u3131-\\u318e\\u31a0-\\u31ba\\u31f0-\\u31ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\ua000-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua697\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua78e\\ua790-\\ua793\\ua7a0-\\ua7aa\\ua7f8-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua90a-\\ua925\\ua930-\\ua946\\ua960-\\ua97c\\ua984-\\ua9b2\\ua9cf\\uaa00-\\uaa28\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uaa60-\\uaa76\\uaa7a\\uaa80-\\uaaaf\\uaab1\\uaab5\\uaab6\\uaab9-\\uaabd\\uaac0\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaea\\uaaf2-\\uaaf4\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uabc0-\\uabe2\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc]'),\n        NonAsciiIdentifierPart: new RegExp('[\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0300-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u0483-\\u0487\\u048a-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0610-\\u061a\\u0620-\\u0669\\u066e-\\u06d3\\u06d5-\\u06dc\\u06df-\\u06e8\\u06ea-\\u06fc\\u06ff\\u0710-\\u074a\\u074d-\\u07b1\\u07c0-\\u07f5\\u07fa\\u0800-\\u082d\\u0840-\\u085b\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\u0900-\\u0963\\u0966-\\u096f\\u0971-\\u0977\\u0979-\\u097f\\u0981-\\u0983\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bc-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09ce\\u09d7\\u09dc\\u09dd\\u09df-\\u09e3\\u09e6-\\u09f1\\u0a01-\\u0a03\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a59-\\u0a5c\\u0a5e\\u0a66-\\u0a75\\u0a81-\\u0a83\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abc-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ad0\\u0ae0-\\u0ae3\\u0ae6-\\u0aef\\u0b01-\\u0b03\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3c-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b56\\u0b57\\u0b5c\\u0b5d\\u0b5f-\\u0b63\\u0b66-\\u0b6f\\u0b71\\u0b82\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd0\\u0bd7\\u0be6-\\u0bef\\u0c01-\\u0c03\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c33\\u0c35-\\u0c39\\u0c3d-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c58\\u0c59\\u0c60-\\u0c63\\u0c66-\\u0c6f\\u0c82\\u0c83\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbc-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0cde\\u0ce0-\\u0ce3\\u0ce6-\\u0cef\\u0cf1\\u0cf2\\u0d02\\u0d03\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4e\\u0d57\\u0d60-\\u0d63\\u0d66-\\u0d6f\\u0d7a-\\u0d7f\\u0d82\\u0d83\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2\\u0df3\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u0e50-\\u0e59\\u0e81\\u0e82\\u0e84\\u0e87\\u0e88\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\\u0eaa\\u0eab\\u0ead-\\u0eb9\\u0ebb-\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0ec8-\\u0ecd\\u0ed0-\\u0ed9\\u0edc-\\u0edf\\u0f00\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f3e-\\u0f47\\u0f49-\\u0f6c\\u0f71-\\u0f84\\u0f86-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u1000-\\u1049\\u1050-\\u109d\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u135d-\\u135f\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f0\\u1700-\\u170c\\u170e-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176c\\u176e-\\u1770\\u1772\\u1773\\u1780-\\u17d3\\u17d7\\u17dc\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18aa\\u18b0-\\u18f5\\u1900-\\u191c\\u1920-\\u192b\\u1930-\\u193b\\u1946-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u19d0-\\u19d9\\u1a00-\\u1a1b\\u1a20-\\u1a5e\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1aa7\\u1b00-\\u1b4b\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1b80-\\u1bf3\\u1c00-\\u1c37\\u1c40-\\u1c49\\u1c4d-\\u1c7d\\u1cd0-\\u1cd2\\u1cd4-\\u1cf6\\u1d00-\\u1de6\\u1dfc-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u200c\\u200d\\u203f\\u2040\\u2054\\u2071\\u207f\\u2090-\\u209c\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\\u212f-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u2c00-\\u2c2e\\u2c30-\\u2c5e\\u2c60-\\u2ce4\\u2ceb-\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d7f-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u2de0-\\u2dff\\u2e2f\\u3005-\\u3007\\u3021-\\u302f\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u3099\\u309a\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312d\\u3131-\\u318e\\u31a0-\\u31ba\\u31f0-\\u31ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\ua000-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua62b\\ua640-\\ua66f\\ua674-\\ua67d\\ua67f-\\ua697\\ua69f-\\ua6f1\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua78e\\ua790-\\ua793\\ua7a0-\\ua7aa\\ua7f8-\\ua827\\ua840-\\ua873\\ua880-\\ua8c4\\ua8d0-\\ua8d9\\ua8e0-\\ua8f7\\ua8fb\\ua900-\\ua92d\\ua930-\\ua953\\ua960-\\ua97c\\ua980-\\ua9c0\\ua9cf-\\ua9d9\\uaa00-\\uaa36\\uaa40-\\uaa4d\\uaa50-\\uaa59\\uaa60-\\uaa76\\uaa7a\\uaa7b\\uaa80-\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaef\\uaaf2-\\uaaf6\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uabc0-\\uabea\\uabec\\uabed\\uabf0-\\uabf9\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe00-\\ufe0f\\ufe20-\\ufe26\\ufe33\\ufe34\\ufe4d-\\ufe4f\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff10-\\uff19\\uff21-\\uff3a\\uff3f\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc]')\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function sliceSource(from, to) {\n        return source.slice(from, to);\n    }\n\n    if (typeof 'esprima'[0] === 'undefined') {\n        sliceSource = function sliceArraySource(from, to) {\n            return source.slice(from, to).join('');\n        };\n    }\n\n    function isDecimalDigit(ch) {\n        return '0123456789'.indexOf(ch) >= 0;\n    }\n\n    function isHexDigit(ch) {\n        return '0123456789abcdefABCDEF'.indexOf(ch) >= 0;\n    }\n\n    function isOctalDigit(ch) {\n        return '01234567'.indexOf(ch) >= 0;\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === ' ') || (ch === '\\u0009') || (ch === '\\u000B') ||\n            (ch === '\\u000C') || (ch === '\\u00A0') ||\n            (ch.charCodeAt(0) >= 0x1680 &&\n             '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(ch) >= 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === '\\n' || ch === '\\r' || ch === '\\u2028' || ch === '\\u2029');\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === '$') || (ch === '_') || (ch === '\\\\') ||\n            (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||\n            ((ch.charCodeAt(0) >= 0x80) && Regex.NonAsciiIdentifierStart.test(ch));\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === '$') || (ch === '_') || (ch === '\\\\') ||\n            (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||\n            ((ch >= '0') && (ch <= '9')) ||\n            ((ch.charCodeAt(0) >= 0x80) && Regex.NonAsciiIdentifierPart.test(ch));\n    }\n\n    // 7.6.1.2 Future Reserved Words\n\n    function isFutureReservedWord(id) {\n        switch (id) {\n\n        // Future reserved words.\n        case 'class':\n        case 'enum':\n        case 'export':\n        case 'extends':\n        case 'import':\n        case 'super':\n            return true;\n        }\n\n        return false;\n    }\n\n    function isStrictModeReservedWord(id) {\n        switch (id) {\n\n        // Strict Mode reserved words.\n        case 'implements':\n        case 'interface':\n        case 'package':\n        case 'private':\n        case 'protected':\n        case 'public':\n        case 'static':\n        case 'yield':\n        case 'let':\n            return true;\n        }\n\n        return false;\n    }\n\n    function isRestrictedWord(id) {\n        return id === 'eval' || id === 'arguments';\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        var keyword = false;\n        switch (id.length) {\n        case 2:\n            keyword = (id === 'if') || (id === 'in') || (id === 'do');\n            break;\n        case 3:\n            keyword = (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try');\n            break;\n        case 4:\n            keyword = (id === 'this') || (id === 'else') || (id === 'case') || (id === 'void') || (id === 'with');\n            break;\n        case 5:\n            keyword = (id === 'while') || (id === 'break') || (id === 'catch') || (id === 'throw');\n            break;\n        case 6:\n            keyword = (id === 'return') || (id === 'typeof') || (id === 'delete') || (id === 'switch');\n            break;\n        case 7:\n            keyword = (id === 'default') || (id === 'finally');\n            break;\n        case 8:\n            keyword = (id === 'function') || (id === 'continue') || (id === 'debugger');\n            break;\n        case 10:\n            keyword = (id === 'instanceof');\n            break;\n        }\n\n        if (keyword) {\n            return true;\n        }\n\n        switch (id) {\n        // Future reserved words.\n        // 'const' is specialized as Keyword in V8.\n        case 'const':\n            return true;\n\n        // For compatiblity to SpiderMonkey and ES.next\n        case 'yield':\n        case 'let':\n            return true;\n        }\n\n        if (strict && isStrictModeReservedWord(id)) {\n            return true;\n        }\n\n        return isFutureReservedWord(id);\n    }\n\n    // 7.4 Comments\n\n    function skipComment() {\n        var ch, blockComment, lineComment;\n\n        blockComment = false;\n        lineComment = false;\n\n        while (index < length) {\n            ch = source[index];\n\n            if (lineComment) {\n                ch = source[index++];\n                if (isLineTerminator(ch)) {\n                    lineComment = false;\n                    if (ch === '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                    ++lineNumber;\n                    lineStart = index;\n                }\n            } else if (blockComment) {\n                if (isLineTerminator(ch)) {\n                    if (ch === '\\r' && source[index + 1] === '\\n') {\n                        ++index;\n                    }\n                    ++lineNumber;\n                    ++index;\n                    lineStart = index;\n                    if (index >= length) {\n                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                    }\n                } else {\n                    ch = source[index++];\n                    if (index >= length) {\n                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                    }\n                    if (ch === '*') {\n                        ch = source[index];\n                        if (ch === '/') {\n                            ++index;\n                            blockComment = false;\n                        }\n                    }\n                }\n            } else if (ch === '/') {\n                ch = source[index + 1];\n                if (ch === '/') {\n                    index += 2;\n                    lineComment = true;\n                } else if (ch === '*') {\n                    index += 2;\n                    blockComment = true;\n                    if (index >= length) {\n                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                    }\n                } else {\n                    break;\n                }\n            } else if (isWhiteSpace(ch)) {\n                ++index;\n            } else if (isLineTerminator(ch)) {\n                ++index;\n                if (ch ===  '\\r' && source[index] === '\\n') {\n                    ++index;\n                }\n                ++lineNumber;\n                lineStart = index;\n            } else {\n                break;\n            }\n        }\n    }\n\n    function scanHexEscape(prefix) {\n        var i, len, ch, code = 0;\n\n        len = (prefix === 'u') ? 4 : 2;\n        for (i = 0; i < len; ++i) {\n            if (index < length && isHexDigit(source[index])) {\n                ch = source[index++];\n                code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());\n            } else {\n                return '';\n            }\n        }\n        return String.fromCharCode(code);\n    }\n\n    function scanIdentifier() {\n        var ch, start, id, restore;\n\n        ch = source[index];\n        if (!isIdentifierStart(ch)) {\n            return;\n        }\n\n        start = index;\n        if (ch === '\\\\') {\n            ++index;\n            if (source[index] !== 'u') {\n                return;\n            }\n            ++index;\n            restore = index;\n            ch = scanHexEscape('u');\n            if (ch) {\n                if (ch === '\\\\' || !isIdentifierStart(ch)) {\n                    return;\n                }\n                id = ch;\n            } else {\n                index = restore;\n                id = 'u';\n            }\n        } else {\n            id = source[index++];\n        }\n\n        while (index < length) {\n            ch = source[index];\n            if (!isIdentifierPart(ch)) {\n                break;\n            }\n            if (ch === '\\\\') {\n                ++index;\n                if (source[index] !== 'u') {\n                    return;\n                }\n                ++index;\n                restore = index;\n                ch = scanHexEscape('u');\n                if (ch) {\n                    if (ch === '\\\\' || !isIdentifierPart(ch)) {\n                        return;\n                    }\n                    id += ch;\n                } else {\n                    index = restore;\n                    id += 'u';\n                }\n            } else {\n                id += source[index++];\n            }\n        }\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            return {\n                type: Token.Identifier,\n                value: id,\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [start, index]\n            };\n        }\n\n        if (isKeyword(id)) {\n            return {\n                type: Token.Keyword,\n                value: id,\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [start, index]\n            };\n        }\n\n        // 7.8.1 Null Literals\n\n        if (id === 'null') {\n            return {\n                type: Token.NullLiteral,\n                value: id,\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [start, index]\n            };\n        }\n\n        // 7.8.2 Boolean Literals\n\n        if (id === 'true' || id === 'false') {\n            return {\n                type: Token.BooleanLiteral,\n                value: id,\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [start, index]\n            };\n        }\n\n        return {\n            type: Token.Identifier,\n            value: id,\n            lineNumber: lineNumber,\n            lineStart: lineStart,\n            range: [start, index]\n        };\n    }\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            ch1 = source[index],\n            ch2,\n            ch3,\n            ch4;\n\n        // Check for most common single-character punctuators.\n\n        if (ch1 === ';' || ch1 === '{' || ch1 === '}') {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [start, index]\n            };\n        }\n\n        if (ch1 === ',' || ch1 === '(' || ch1 === ')') {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [start, index]\n            };\n        }\n\n        // Dot (.) can also start a floating-point number, hence the need\n        // to check the next character.\n\n        ch2 = source[index + 1];\n        if (ch1 === '.' && !isDecimalDigit(ch2)) {\n            return {\n                type: Token.Punctuator,\n                value: source[index++],\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [start, index]\n            };\n        }\n\n        // Peek more characters.\n\n        ch3 = source[index + 2];\n        ch4 = source[index + 3];\n\n        // 4-character punctuator: >>>=\n\n        if (ch1 === '>' && ch2 === '>' && ch3 === '>') {\n            if (ch4 === '=') {\n                index += 4;\n                return {\n                    type: Token.Punctuator,\n                    value: '>>>=',\n                    lineNumber: lineNumber,\n                    lineStart: lineStart,\n                    range: [start, index]\n                };\n            }\n        }\n\n        // 3-character punctuators: === !== >>> <<= >>=\n\n        if (ch1 === '=' && ch2 === '=' && ch3 === '=') {\n            index += 3;\n            return {\n                type: Token.Punctuator,\n                value: '===',\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [start, index]\n            };\n        }\n\n        if (ch1 === '!' && ch2 === '=' && ch3 === '=') {\n            index += 3;\n            return {\n                type: Token.Punctuator,\n                value: '!==',\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [start, index]\n            };\n        }\n\n        if (ch1 === '>' && ch2 === '>' && ch3 === '>') {\n            index += 3;\n            return {\n                type: Token.Punctuator,\n                value: '>>>',\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [start, index]\n            };\n        }\n\n        if (ch1 === '<' && ch2 === '<' && ch3 === '=') {\n            index += 3;\n            return {\n                type: Token.Punctuator,\n                value: '<<=',\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [start, index]\n            };\n        }\n\n        if (ch1 === '>' && ch2 === '>' && ch3 === '=') {\n            index += 3;\n            return {\n                type: Token.Punctuator,\n                value: '>>=',\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [start, index]\n            };\n        }\n\n        // 2-character punctuators: <= >= == != ++ -- << >> && ||\n        // += -= *= %= &= |= ^= /=\n\n        if (ch2 === '=') {\n            if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n                index += 2;\n                return {\n                    type: Token.Punctuator,\n                    value: ch1 + ch2,\n                    lineNumber: lineNumber,\n                    lineStart: lineStart,\n                    range: [start, index]\n                };\n            }\n        }\n\n        if (ch1 === ch2 && ('+-<>&|'.indexOf(ch1) >= 0)) {\n            if ('+-<>&|'.indexOf(ch2) >= 0) {\n                index += 2;\n                return {\n                    type: Token.Punctuator,\n                    value: ch1 + ch2,\n                    lineNumber: lineNumber,\n                    lineStart: lineStart,\n                    range: [start, index]\n                };\n            }\n        }\n\n        // The remaining 1-character punctuators.\n\n        if ('[]<>+-*%&|^!~?:=/'.indexOf(ch1) >= 0) {\n            return {\n                type: Token.Punctuator,\n                value: source[index++],\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [start, index]\n            };\n        }\n    }\n\n    // 7.8.3 Numeric Literals\n\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                if (ch === 'x' || ch === 'X') {\n                    number += source[index++];\n                    while (index < length) {\n                        ch = source[index];\n                        if (!isHexDigit(ch)) {\n                            break;\n                        }\n                        number += source[index++];\n                    }\n\n                    if (number.length <= 2) {\n                        // only 0x\n                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                    }\n\n                    if (index < length) {\n                        ch = source[index];\n                        if (isIdentifierStart(ch)) {\n                            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                        }\n                    }\n                    return {\n                        type: Token.NumericLiteral,\n                        value: parseInt(number, 16),\n                        lineNumber: lineNumber,\n                        lineStart: lineStart,\n                        range: [start, index]\n                    };\n                } else if (isOctalDigit(ch)) {\n                    number += source[index++];\n                    while (index < length) {\n                        ch = source[index];\n                        if (!isOctalDigit(ch)) {\n                            break;\n                        }\n                        number += source[index++];\n                    }\n\n                    if (index < length) {\n                        ch = source[index];\n                        if (isIdentifierStart(ch) || isDecimalDigit(ch)) {\n                            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                        }\n                    }\n                    return {\n                        type: Token.NumericLiteral,\n                        value: parseInt(number, 8),\n                        octal: true,\n                        lineNumber: lineNumber,\n                        lineStart: lineStart,\n                        range: [start, index]\n                    };\n                }\n\n                // decimal number starts with '0' such as '09' is illegal.\n                if (isDecimalDigit(ch)) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (index < length) {\n                ch = source[index];\n                if (!isDecimalDigit(ch)) {\n                    break;\n                }\n                number += source[index++];\n            }\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (index < length) {\n                ch = source[index];\n                if (!isDecimalDigit(ch)) {\n                    break;\n                }\n                number += source[index++];\n            }\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n\n            ch = source[index];\n            if (isDecimalDigit(ch)) {\n                number += source[index++];\n                while (index < length) {\n                    ch = source[index];\n                    if (!isDecimalDigit(ch)) {\n                        break;\n                    }\n                    number += source[index++];\n                }\n            } else {\n                ch = 'character ' + ch;\n                if (index >= length) {\n                    ch = '<end>';\n                }\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (index < length) {\n            ch = source[index];\n            if (isIdentifierStart(ch)) {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            lineNumber: lineNumber,\n            lineStart: lineStart,\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, code, unescaped, restore, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!isLineTerminator(ch)) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'u':\n                    case 'x':\n                        restore = index;\n                        unescaped = scanHexEscape(ch);\n                        if (unescaped) {\n                            str += unescaped;\n                        } else {\n                            index = restore;\n                            str += ch;\n                        }\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        if (isOctalDigit(ch)) {\n                            code = '01234567'.indexOf(ch);\n\n                            // \\0 is not octal escape sequence\n                            if (code !== 0) {\n                                octal = true;\n                            }\n\n                            if (index < length && isOctalDigit(source[index])) {\n                                octal = true;\n                                code = code * 8 + '01234567'.indexOf(source[index++]);\n\n                                // 3 digits are only allowed when string starts\n                                // with 0, 1, 2, 3\n                                if ('0123'.indexOf(ch) >= 0 &&\n                                        index < length &&\n                                        isOctalDigit(source[index])) {\n                                    code = code * 8 + '01234567'.indexOf(source[index++]);\n                                }\n                            }\n                            str += String.fromCharCode(code);\n                        } else {\n                            str += ch;\n                        }\n                        break;\n                    }\n                } else {\n                    ++lineNumber;\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch)) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            lineNumber: lineNumber,\n            lineStart: lineStart,\n            range: [start, index]\n        };\n    }\n\n    function scanRegExp() {\n        var str, ch, start, pattern, flags, value, classMarker = false, restore, terminated = false;\n\n        buffer = null;\n        skipComment();\n\n        start = index;\n        ch = source[index];\n        assert(ch === '/', 'Regular expression literal must start with a slash');\n        str = source[index++];\n\n        while (index < length) {\n            ch = source[index++];\n            str += ch;\n            if (ch === '\\\\') {\n                ch = source[index++];\n                // ECMA-262 7.8.5\n                if (isLineTerminator(ch)) {\n                    throwError({}, Messages.UnterminatedRegExp);\n                }\n                str += ch;\n            } else if (classMarker) {\n                if (ch === ']') {\n                    classMarker = false;\n                }\n            } else {\n                if (ch === '/') {\n                    terminated = true;\n                    break;\n                } else if (ch === '[') {\n                    classMarker = true;\n                } else if (isLineTerminator(ch)) {\n                    throwError({}, Messages.UnterminatedRegExp);\n                }\n            }\n        }\n\n        if (!terminated) {\n            throwError({}, Messages.UnterminatedRegExp);\n        }\n\n        // Exclude leading and trailing slash.\n        pattern = str.substr(1, str.length - 2);\n\n        flags = '';\n        while (index < length) {\n            ch = source[index];\n            if (!isIdentifierPart(ch)) {\n                break;\n            }\n\n            ++index;\n            if (ch === '\\\\' && index < length) {\n                ch = source[index];\n                if (ch === 'u') {\n                    ++index;\n                    restore = index;\n                    ch = scanHexEscape('u');\n                    if (ch) {\n                        flags += ch;\n                        str += '\\\\u';\n                        for (; restore < index; ++restore) {\n                            str += source[restore];\n                        }\n                    } else {\n                        index = restore;\n                        flags += 'u';\n                        str += '\\\\u';\n                    }\n                } else {\n                    str += '\\\\';\n                }\n            } else {\n                flags += ch;\n                str += ch;\n            }\n        }\n\n        try {\n            value = new RegExp(pattern, flags);\n        } catch (e) {\n            throwError({}, Messages.InvalidRegExp);\n        }\n\n        return {\n            literal: str,\n            value: value,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch, token;\n\n        skipComment();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                lineNumber: lineNumber,\n                lineStart: lineStart,\n                range: [index, index]\n            };\n        }\n\n        token = scanPunctuator();\n        if (typeof token !== 'undefined') {\n            return token;\n        }\n\n        ch = source[index];\n\n        if (ch === '\\'' || ch === '\"') {\n            return scanStringLiteral();\n        }\n\n        if (ch === '.' || isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        token = scanIdentifier();\n        if (typeof token !== 'undefined') {\n            return token;\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    function lex() {\n        var token;\n\n        if (buffer) {\n            index = buffer.range[1];\n            lineNumber = buffer.lineNumber;\n            lineStart = buffer.lineStart;\n            token = buffer;\n            buffer = null;\n            return token;\n        }\n\n        buffer = null;\n        return advance();\n    }\n\n    function lookahead() {\n        var pos, line, start;\n\n        if (buffer !== null) {\n            return buffer;\n        }\n\n        pos = index;\n        line = lineNumber;\n        start = lineStart;\n        buffer = advance();\n        index = pos;\n        lineNumber = line;\n        lineStart = start;\n\n        return buffer;\n    }\n\n    // Return true if there is a line terminator before the next token.\n\n    function peekLineTerminator() {\n        var pos, line, start, found;\n\n        pos = index;\n        line = lineNumber;\n        start = lineStart;\n        skipComment();\n        found = lineNumber !== line;\n        index = pos;\n        lineNumber = line;\n        lineStart = start;\n\n        return found;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    return args[index] || '';\n                }\n            );\n\n        if (typeof token.lineNumber === 'number') {\n            error = new Error('Line ' + token.lineNumber + ': ' + msg);\n            error.index = token.range[0];\n            error.lineNumber = token.lineNumber;\n            error.column = token.range[0] - lineStart + 1;\n        } else {\n            error = new Error('Line ' + lineNumber + ': ' + msg);\n            error.index = index;\n            error.lineNumber = lineNumber;\n            error.column = index - lineStart + 1;\n        }\n\n        throw error;\n    }\n\n    function throwErrorTolerant() {\n        try {\n            throwError.apply(null, arguments);\n        } catch (e) {\n            if (extra.errors) {\n                extra.errors.push(e);\n            } else {\n                throw e;\n            }\n        }\n    }\n\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        if (token.type === Token.EOF) {\n            throwError(token, Messages.UnexpectedEOS);\n        }\n\n        if (token.type === Token.NumericLiteral) {\n            throwError(token, Messages.UnexpectedNumber);\n        }\n\n        if (token.type === Token.StringLiteral) {\n            throwError(token, Messages.UnexpectedString);\n        }\n\n        if (token.type === Token.Identifier) {\n            throwError(token, Messages.UnexpectedIdentifier);\n        }\n\n        if (token.type === Token.Keyword) {\n            if (isFutureReservedWord(token.value)) {\n                throwError(token, Messages.UnexpectedReserved);\n            } else if (strict && isStrictModeReservedWord(token.value)) {\n                throwErrorTolerant(token, Messages.StrictReservedWord);\n                return;\n            }\n            throwError(token, Messages.UnexpectedToken, token.value);\n        }\n\n        // BooleanLiteral, NullLiteral, or Punctuator.\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Expect the next token to match the specified keyword.\n    // If not, an exception will be thrown.\n\n    function expectKeyword(keyword) {\n        var token = lex();\n        if (token.type !== Token.Keyword || token.value !== keyword) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        var token = lookahead();\n        return token.type === Token.Punctuator && token.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        var token = lookahead();\n        return token.type === Token.Keyword && token.value === keyword;\n    }\n\n    // Return true if the next token is an assignment operator\n\n    function matchAssign() {\n        var token = lookahead(),\n            op = token.value;\n\n        if (token.type !== Token.Punctuator) {\n            return false;\n        }\n        return op === '=' ||\n            op === '*=' ||\n            op === '/=' ||\n            op === '%=' ||\n            op === '+=' ||\n            op === '-=' ||\n            op === '<<=' ||\n            op === '>>=' ||\n            op === '>>>=' ||\n            op === '&=' ||\n            op === '^=' ||\n            op === '|=';\n    }\n\n    function consumeSemicolon() {\n        var token, line;\n\n        // Catch the very common case first.\n        if (source[index] === ';') {\n            lex();\n            return;\n        }\n\n        line = lineNumber;\n        skipComment();\n        if (lineNumber !== line) {\n            return;\n        }\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        token = lookahead();\n        if (token.type !== Token.EOF && !match('}')) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if provided expression is LeftHandSideExpression\n\n    function isLeftHandSide(expr) {\n        return expr.type === Syntax.Identifier || expr.type === Syntax.MemberExpression;\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseAssignmentExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return {\n            type: Syntax.ArrayExpression,\n            elements: elements\n        };\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parsePropertyFunction(param, first) {\n        var previousStrict, body;\n\n        previousStrict = strict;\n        body = parseFunctionSourceElements();\n        if (first && strict && isRestrictedWord(param[0].name)) {\n            throwErrorTolerant(first, Messages.StrictParamName);\n        }\n        strict = previousStrict;\n\n        return {\n            type: Syntax.FunctionExpression,\n            id: null,\n            params: param,\n            defaults: [],\n            body: body,\n            rest: null,\n            generator: false,\n            expression: false\n        };\n    }\n\n    function parseObjectPropertyKey() {\n        var token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            if (strict && token.octal) {\n                throwErrorTolerant(token, Messages.StrictOctalLiteral);\n            }\n            return createLiteral(token);\n        }\n\n        return {\n            type: Syntax.Identifier,\n            name: token.value\n        };\n    }\n\n    function parseObjectProperty() {\n        var token, key, id, param;\n\n        token = lookahead();\n\n        if (token.type === Token.Identifier) {\n\n            id = parseObjectPropertyKey();\n\n            // Property Assignment: Getter and Setter.\n\n            if (token.value === 'get' && !match(':')) {\n                key = parseObjectPropertyKey();\n                expect('(');\n                expect(')');\n                return {\n                    type: Syntax.Property,\n                    key: key,\n                    value: parsePropertyFunction([]),\n                    kind: 'get'\n                };\n            } else if (token.value === 'set' && !match(':')) {\n                key = parseObjectPropertyKey();\n                expect('(');\n                token = lookahead();\n                if (token.type !== Token.Identifier) {\n                    expect(')');\n                    throwErrorTolerant(token, Messages.UnexpectedToken, token.value);\n                    return {\n                        type: Syntax.Property,\n                        key: key,\n                        value: parsePropertyFunction([]),\n                        kind: 'set'\n                    };\n                } else {\n                    param = [ parseVariableIdentifier() ];\n                    expect(')');\n                    return {\n                        type: Syntax.Property,\n                        key: key,\n                        value: parsePropertyFunction(param, token),\n                        kind: 'set'\n                    };\n                }\n            } else {\n                expect(':');\n                return {\n                    type: Syntax.Property,\n                    key: id,\n                    value: parseAssignmentExpression(),\n                    kind: 'init'\n                };\n            }\n        } else if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        } else {\n            key = parseObjectPropertyKey();\n            expect(':');\n            return {\n                type: Syntax.Property,\n                key: key,\n                value: parseAssignmentExpression(),\n                kind: 'init'\n            };\n        }\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [], property, name, kind, map = {}, toString = String;\n\n        expect('{');\n\n        while (!match('}')) {\n            property = parseObjectProperty();\n\n            if (property.key.type === Syntax.Identifier) {\n                name = property.key.name;\n            } else {\n                name = toString(property.key.value);\n            }\n            kind = (property.kind === 'init') ? PropertyKind.Data : (property.kind === 'get') ? PropertyKind.Get : PropertyKind.Set;\n            if (Object.prototype.hasOwnProperty.call(map, name)) {\n                if (map[name] === PropertyKind.Data) {\n                    if (strict && kind === PropertyKind.Data) {\n                        throwErrorTolerant({}, Messages.StrictDuplicateProperty);\n                    } else if (kind !== PropertyKind.Data) {\n                        throwErrorTolerant({}, Messages.AccessorDataProperty);\n                    }\n                } else {\n                    if (kind === PropertyKind.Data) {\n                        throwErrorTolerant({}, Messages.AccessorDataProperty);\n                    } else if (map[name] & kind) {\n                        throwErrorTolerant({}, Messages.AccessorGetSet);\n                    }\n                }\n                map[name] |= kind;\n            } else {\n                map[name] = kind;\n            }\n\n            properties.push(property);\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return {\n            type: Syntax.ObjectExpression,\n            properties: properties\n        };\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var token = lookahead(),\n            type = token.type;\n\n        if (type === Token.Identifier) {\n            return {\n                type: Syntax.Identifier,\n                name: lex().value\n            };\n        }\n\n        if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            if (strict && token.octal) {\n                throwErrorTolerant(token, Messages.StrictOctalLiteral);\n            }\n            return createLiteral(lex());\n        }\n\n        if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                return {\n                    type: Syntax.ThisExpression\n                };\n            }\n\n            if (matchKeyword('function')) {\n                return parseFunctionExpression();\n            }\n        }\n\n        if (type === Token.BooleanLiteral) {\n            lex();\n            token.value = (token.value === 'true');\n            return createLiteral(token);\n        }\n\n        if (type === Token.NullLiteral) {\n            lex();\n            token.value = null;\n            return createLiteral(token);\n        }\n\n        if (match('[')) {\n            return parseArrayInitialiser();\n        }\n\n        if (match('{')) {\n            return parseObjectInitialiser();\n        }\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        if (match('/') || match('/=')) {\n            return createLiteral(scanRegExp());\n        }\n\n        return throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseAssignmentExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return {\n            type: Syntax.Identifier,\n            name: token.value\n        };\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseNewExpression() {\n        var expr;\n\n        expectKeyword('new');\n\n        expr = {\n            type: Syntax.NewExpression,\n            callee: parseLeftHandSideExpression(),\n            'arguments': []\n        };\n\n        if (match('(')) {\n            expr['arguments'] = parseArguments();\n        }\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpressionAllowCall() {\n        var expr;\n\n        expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();\n\n        while (match('.') || match('[') || match('(')) {\n            if (match('(')) {\n                expr = {\n                    type: Syntax.CallExpression,\n                    callee: expr,\n                    'arguments': parseArguments()\n                };\n            } else if (match('[')) {\n                expr = {\n                    type: Syntax.MemberExpression,\n                    computed: true,\n                    object: expr,\n                    property: parseComputedMember()\n                };\n            } else {\n                expr = {\n                    type: Syntax.MemberExpression,\n                    computed: false,\n                    object: expr,\n                    property: parseNonComputedMember()\n                };\n            }\n        }\n\n        return expr;\n    }\n\n\n    function parseLeftHandSideExpression() {\n        var expr;\n\n        expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();\n\n        while (match('.') || match('[')) {\n            if (match('[')) {\n                expr = {\n                    type: Syntax.MemberExpression,\n                    computed: true,\n                    object: expr,\n                    property: parseComputedMember()\n                };\n            } else {\n                expr = {\n                    type: Syntax.MemberExpression,\n                    computed: false,\n                    object: expr,\n                    property: parseNonComputedMember()\n                };\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    function parsePostfixExpression() {\n        var expr = parseLeftHandSideExpressionAllowCall(), token;\n\n        token = lookahead();\n        if (token.type !== Token.Punctuator) {\n            return expr;\n        }\n\n        if ((match('++') || match('--')) && !peekLineTerminator()) {\n            // 11.3.1, 11.3.2\n            if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {\n                throwErrorTolerant({}, Messages.StrictLHSPostfix);\n            }\n            if (!isLeftHandSide(expr)) {\n                throwErrorTolerant({}, Messages.InvalidLHSInAssignment);\n            }\n\n            expr = {\n                type: Syntax.UpdateExpression,\n                operator: lex().value,\n                argument: expr,\n                prefix: false\n            };\n        }\n\n        return expr;\n    }\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        token = lookahead();\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return parsePostfixExpression();\n        }\n\n        if (match('++') || match('--')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            // 11.4.4, 11.4.5\n            if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {\n                throwErrorTolerant({}, Messages.StrictLHSPrefix);\n            }\n\n            if (!isLeftHandSide(expr)) {\n                throwErrorTolerant({}, Messages.InvalidLHSInAssignment);\n            }\n\n            expr = {\n                type: Syntax.UpdateExpression,\n                operator: token.value,\n                argument: expr,\n                prefix: true\n            };\n            return expr;\n        }\n\n        if (match('+') || match('-') || match('~') || match('!')) {\n            expr = {\n                type: Syntax.UnaryExpression,\n                operator: lex().value,\n                argument: parseUnaryExpression(),\n                prefix: true\n            };\n            return expr;\n        }\n\n        if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            expr = {\n                type: Syntax.UnaryExpression,\n                operator: lex().value,\n                argument: parseUnaryExpression(),\n                prefix: true\n            };\n            if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) {\n                throwErrorTolerant({}, Messages.StrictDelete);\n            }\n            return expr;\n        }\n\n        return parsePostfixExpression();\n    }\n\n    // 11.5 Multiplicative Operators\n\n    function parseMultiplicativeExpression() {\n        var expr = parseUnaryExpression();\n\n        while (match('*') || match('/') || match('%')) {\n            expr = {\n                type: Syntax.BinaryExpression,\n                operator: lex().value,\n                left: expr,\n                right: parseUnaryExpression()\n            };\n        }\n\n        return expr;\n    }\n\n    // 11.6 Additive Operators\n\n    function parseAdditiveExpression() {\n        var expr = parseMultiplicativeExpression();\n\n        while (match('+') || match('-')) {\n            expr = {\n                type: Syntax.BinaryExpression,\n                operator: lex().value,\n                left: expr,\n                right: parseMultiplicativeExpression()\n            };\n        }\n\n        return expr;\n    }\n\n    // 11.7 Bitwise Shift Operators\n\n    function parseShiftExpression() {\n        var expr = parseAdditiveExpression();\n\n        while (match('<<') || match('>>') || match('>>>')) {\n            expr = {\n                type: Syntax.BinaryExpression,\n                operator: lex().value,\n                left: expr,\n                right: parseAdditiveExpression()\n            };\n        }\n\n        return expr;\n    }\n    // 11.8 Relational Operators\n\n    function parseRelationalExpression() {\n        var expr, previousAllowIn;\n\n        previousAllowIn = state.allowIn;\n        state.allowIn = true;\n\n        expr = parseShiftExpression();\n\n        while (match('<') || match('>') || match('<=') || match('>=') || (previousAllowIn && matchKeyword('in')) || matchKeyword('instanceof')) {\n            expr = {\n                type: Syntax.BinaryExpression,\n                operator: lex().value,\n                left: expr,\n                right: parseShiftExpression()\n            };\n        }\n\n        state.allowIn = previousAllowIn;\n        return expr;\n    }\n\n    // 11.9 Equality Operators\n\n    function parseEqualityExpression() {\n        var expr = parseRelationalExpression();\n\n        while (match('==') || match('!=') || match('===') || match('!==')) {\n            expr = {\n                type: Syntax.BinaryExpression,\n                operator: lex().value,\n                left: expr,\n                right: parseRelationalExpression()\n            };\n        }\n\n        return expr;\n    }\n\n    // 11.10 Binary Bitwise Operators\n\n    function parseBitwiseANDExpression() {\n        var expr = parseEqualityExpression();\n\n        while (match('&')) {\n            lex();\n            expr = {\n                type: Syntax.BinaryExpression,\n                operator: '&',\n                left: expr,\n                right: parseEqualityExpression()\n            };\n        }\n\n        return expr;\n    }\n\n    function parseBitwiseXORExpression() {\n        var expr = parseBitwiseANDExpression();\n\n        while (match('^')) {\n            lex();\n            expr = {\n                type: Syntax.BinaryExpression,\n                operator: '^',\n                left: expr,\n                right: parseBitwiseANDExpression()\n            };\n        }\n\n        return expr;\n    }\n\n    function parseBitwiseORExpression() {\n        var expr = parseBitwiseXORExpression();\n\n        while (match('|')) {\n            lex();\n            expr = {\n                type: Syntax.BinaryExpression,\n                operator: '|',\n                left: expr,\n                right: parseBitwiseXORExpression()\n            };\n        }\n\n        return expr;\n    }\n\n    // 11.11 Binary Logical Operators\n\n    function parseLogicalANDExpression() {\n        var expr = parseBitwiseORExpression();\n\n        while (match('&&')) {\n            lex();\n            expr = {\n                type: Syntax.LogicalExpression,\n                operator: '&&',\n                left: expr,\n                right: parseBitwiseORExpression()\n            };\n        }\n\n        return expr;\n    }\n\n    function parseLogicalORExpression() {\n        var expr = parseLogicalANDExpression();\n\n        while (match('||')) {\n            lex();\n            expr = {\n                type: Syntax.LogicalExpression,\n                operator: '||',\n                left: expr,\n                right: parseLogicalANDExpression()\n            };\n        }\n\n        return expr;\n    }\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, previousAllowIn, consequent;\n\n        expr = parseLogicalORExpression();\n\n        if (match('?')) {\n            lex();\n            previousAllowIn = state.allowIn;\n            state.allowIn = true;\n            consequent = parseAssignmentExpression();\n            state.allowIn = previousAllowIn;\n            expect(':');\n\n            expr = {\n                type: Syntax.ConditionalExpression,\n                test: expr,\n                consequent: consequent,\n                alternate: parseAssignmentExpression()\n            };\n        }\n\n        return expr;\n    }\n\n    // 11.13 Assignment Operators\n\n    function parseAssignmentExpression() {\n        var token, expr;\n\n        token = lookahead();\n        expr = parseConditionalExpression();\n\n        if (matchAssign()) {\n            // LeftHandSideExpression\n            if (!isLeftHandSide(expr)) {\n                throwErrorTolerant({}, Messages.InvalidLHSInAssignment);\n            }\n\n            // 11.13.1\n            if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {\n                throwErrorTolerant(token, Messages.StrictLHSAssignment);\n            }\n\n            expr = {\n                type: Syntax.AssignmentExpression,\n                operator: lex().value,\n                left: expr,\n                right: parseAssignmentExpression()\n            };\n        }\n\n        return expr;\n    }\n\n    // 11.14 Comma Operator\n\n    function parseExpression() {\n        var expr = parseAssignmentExpression();\n\n        if (match(',')) {\n            expr = {\n                type: Syntax.SequenceExpression,\n                expressions: [ expr ]\n            };\n\n            while (index < length) {\n                if (!match(',')) {\n                    break;\n                }\n                lex();\n                expr.expressions.push(parseAssignmentExpression());\n            }\n\n        }\n        return expr;\n    }\n\n    // 12.1 Block\n\n    function parseStatementList() {\n        var list = [],\n            statement;\n\n        while (index < length) {\n            if (match('}')) {\n                break;\n            }\n            statement = parseSourceElement();\n            if (typeof statement === 'undefined') {\n                break;\n            }\n            list.push(statement);\n        }\n\n        return list;\n    }\n\n    function parseBlock() {\n        var block;\n\n        expect('{');\n\n        block = parseStatementList();\n\n        expect('}');\n\n        return {\n            type: Syntax.BlockStatement,\n            body: block\n        };\n    }\n\n    // 12.2 Variable Statement\n\n    function parseVariableIdentifier() {\n        var token = lex();\n\n        if (token.type !== Token.Identifier) {\n            throwUnexpected(token);\n        }\n\n        return {\n            type: Syntax.Identifier,\n            name: token.value\n        };\n    }\n\n    function parseVariableDeclaration(kind) {\n        var id = parseVariableIdentifier(),\n            init = null;\n\n        // 12.2.1\n        if (strict && isRestrictedWord(id.name)) {\n            throwErrorTolerant({}, Messages.StrictVarName);\n        }\n\n        if (kind === 'const') {\n            expect('=');\n            init = parseAssignmentExpression();\n        } else if (match('=')) {\n            lex();\n            init = parseAssignmentExpression();\n        }\n\n        return {\n            type: Syntax.VariableDeclarator,\n            id: id,\n            init: init\n        };\n    }\n\n    function parseVariableDeclarationList(kind) {\n        var list = [];\n\n        do {\n            list.push(parseVariableDeclaration(kind));\n            if (!match(',')) {\n                break;\n            }\n            lex();\n        } while (index < length);\n\n        return list;\n    }\n\n    function parseVariableStatement() {\n        var declarations;\n\n        expectKeyword('var');\n\n        declarations = parseVariableDeclarationList();\n\n        consumeSemicolon();\n\n        return {\n            type: Syntax.VariableDeclaration,\n            declarations: declarations,\n            kind: 'var'\n        };\n    }\n\n    // kind may be `const` or `let`\n    // Both are experimental and not in the specification yet.\n    // see http://wiki.ecmascript.org/doku.php?id=harmony:const\n    // and http://wiki.ecmascript.org/doku.php?id=harmony:let\n    function parseConstLetDeclaration(kind) {\n        var declarations;\n\n        expectKeyword(kind);\n\n        declarations = parseVariableDeclarationList(kind);\n\n        consumeSemicolon();\n\n        return {\n            type: Syntax.VariableDeclaration,\n            declarations: declarations,\n            kind: kind\n        };\n    }\n\n    // 12.3 Empty Statement\n\n    function parseEmptyStatement() {\n        expect(';');\n\n        return {\n            type: Syntax.EmptyStatement\n        };\n    }\n\n    // 12.4 Expression Statement\n\n    function parseExpressionStatement() {\n        var expr = parseExpression();\n\n        consumeSemicolon();\n\n        return {\n            type: Syntax.ExpressionStatement,\n            expression: expr\n        };\n    }\n\n    // 12.5 If statement\n\n    function parseIfStatement() {\n        var test, consequent, alternate;\n\n        expectKeyword('if');\n\n        expect('(');\n\n        test = parseExpression();\n\n        expect(')');\n\n        consequent = parseStatement();\n\n        if (matchKeyword('else')) {\n            lex();\n            alternate = parseStatement();\n        } else {\n            alternate = null;\n        }\n\n        return {\n            type: Syntax.IfStatement,\n            test: test,\n            consequent: consequent,\n            alternate: alternate\n        };\n    }\n\n    // 12.6 Iteration Statements\n\n    function parseDoWhileStatement() {\n        var body, test, oldInIteration;\n\n        expectKeyword('do');\n\n        oldInIteration = state.inIteration;\n        state.inIteration = true;\n\n        body = parseStatement();\n\n        state.inIteration = oldInIteration;\n\n        expectKeyword('while');\n\n        expect('(');\n\n        test = parseExpression();\n\n        expect(')');\n\n        if (match(';')) {\n            lex();\n        }\n\n        return {\n            type: Syntax.DoWhileStatement,\n            body: body,\n            test: test\n        };\n    }\n\n    function parseWhileStatement() {\n        var test, body, oldInIteration;\n\n        expectKeyword('while');\n\n        expect('(');\n\n        test = parseExpression();\n\n        expect(')');\n\n        oldInIteration = state.inIteration;\n        state.inIteration = true;\n\n        body = parseStatement();\n\n        state.inIteration = oldInIteration;\n\n        return {\n            type: Syntax.WhileStatement,\n            test: test,\n            body: body\n        };\n    }\n\n    function parseForVariableDeclaration() {\n        var token = lex();\n\n        return {\n            type: Syntax.VariableDeclaration,\n            declarations: parseVariableDeclarationList(),\n            kind: token.value\n        };\n    }\n\n    function parseForStatement() {\n        var init, test, update, left, right, body, oldInIteration;\n\n        init = test = update = null;\n\n        expectKeyword('for');\n\n        expect('(');\n\n        if (match(';')) {\n            lex();\n        } else {\n            if (matchKeyword('var') || matchKeyword('let')) {\n                state.allowIn = false;\n                init = parseForVariableDeclaration();\n                state.allowIn = true;\n\n                if (init.declarations.length === 1 && matchKeyword('in')) {\n                    lex();\n                    left = init;\n                    right = parseExpression();\n                    init = null;\n                }\n            } else {\n                state.allowIn = false;\n                init = parseExpression();\n                state.allowIn = true;\n\n                if (matchKeyword('in')) {\n                    // LeftHandSideExpression\n                    if (!isLeftHandSide(init)) {\n                        throwErrorTolerant({}, Messages.InvalidLHSInForIn);\n                    }\n\n                    lex();\n                    left = init;\n                    right = parseExpression();\n                    init = null;\n                }\n            }\n\n            if (typeof left === 'undefined') {\n                expect(';');\n            }\n        }\n\n        if (typeof left === 'undefined') {\n\n            if (!match(';')) {\n                test = parseExpression();\n            }\n            expect(';');\n\n            if (!match(')')) {\n                update = parseExpression();\n            }\n        }\n\n        expect(')');\n\n        oldInIteration = state.inIteration;\n        state.inIteration = true;\n\n        body = parseStatement();\n\n        state.inIteration = oldInIteration;\n\n        if (typeof left === 'undefined') {\n            return {\n                type: Syntax.ForStatement,\n                init: init,\n                test: test,\n                update: update,\n                body: body\n            };\n        }\n\n        return {\n            type: Syntax.ForInStatement,\n            left: left,\n            right: right,\n            body: body,\n            each: false\n        };\n    }\n\n    // 12.7 The continue statement\n\n    function parseContinueStatement() {\n        var token, label = null;\n\n        expectKeyword('continue');\n\n        // Optimize the most common form: 'continue;'.\n        if (source[index] === ';') {\n            lex();\n\n            if (!state.inIteration) {\n                throwError({}, Messages.IllegalContinue);\n            }\n\n            return {\n                type: Syntax.ContinueStatement,\n                label: null\n            };\n        }\n\n        if (peekLineTerminator()) {\n            if (!state.inIteration) {\n                throwError({}, Messages.IllegalContinue);\n            }\n\n            return {\n                type: Syntax.ContinueStatement,\n                label: null\n            };\n        }\n\n        token = lookahead();\n        if (token.type === Token.Identifier) {\n            label = parseVariableIdentifier();\n\n            if (!Object.prototype.hasOwnProperty.call(state.labelSet, label.name)) {\n                throwError({}, Messages.UnknownLabel, label.name);\n            }\n        }\n\n        consumeSemicolon();\n\n        if (label === null && !state.inIteration) {\n            throwError({}, Messages.IllegalContinue);\n        }\n\n        return {\n            type: Syntax.ContinueStatement,\n            label: label\n        };\n    }\n\n    // 12.8 The break statement\n\n    function parseBreakStatement() {\n        var token, label = null;\n\n        expectKeyword('break');\n\n        // Optimize the most common form: 'break;'.\n        if (source[index] === ';') {\n            lex();\n\n            if (!(state.inIteration || state.inSwitch)) {\n                throwError({}, Messages.IllegalBreak);\n            }\n\n            return {\n                type: Syntax.BreakStatement,\n                label: null\n            };\n        }\n\n        if (peekLineTerminator()) {\n            if (!(state.inIteration || state.inSwitch)) {\n                throwError({}, Messages.IllegalBreak);\n            }\n\n            return {\n                type: Syntax.BreakStatement,\n                label: null\n            };\n        }\n\n        token = lookahead();\n        if (token.type === Token.Identifier) {\n            label = parseVariableIdentifier();\n\n            if (!Object.prototype.hasOwnProperty.call(state.labelSet, label.name)) {\n                throwError({}, Messages.UnknownLabel, label.name);\n            }\n        }\n\n        consumeSemicolon();\n\n        if (label === null && !(state.inIteration || state.inSwitch)) {\n            throwError({}, Messages.IllegalBreak);\n        }\n\n        return {\n            type: Syntax.BreakStatement,\n            label: label\n        };\n    }\n\n    // 12.9 The return statement\n\n    function parseReturnStatement() {\n        var token, argument = null;\n\n        expectKeyword('return');\n\n        if (!state.inFunctionBody) {\n            throwErrorTolerant({}, Messages.IllegalReturn);\n        }\n\n        // 'return' followed by a space and an identifier is very common.\n        if (source[index] === ' ') {\n            if (isIdentifierStart(source[index + 1])) {\n                argument = parseExpression();\n                consumeSemicolon();\n                return {\n                    type: Syntax.ReturnStatement,\n                    argument: argument\n                };\n            }\n        }\n\n        if (peekLineTerminator()) {\n            return {\n                type: Syntax.ReturnStatement,\n                argument: null\n            };\n        }\n\n        if (!match(';')) {\n            token = lookahead();\n            if (!match('}') && token.type !== Token.EOF) {\n                argument = parseExpression();\n            }\n        }\n\n        consumeSemicolon();\n\n        return {\n            type: Syntax.ReturnStatement,\n            argument: argument\n        };\n    }\n\n    // 12.10 The with statement\n\n    function parseWithStatement() {\n        var object, body;\n\n        if (strict) {\n            throwErrorTolerant({}, Messages.StrictModeWith);\n        }\n\n        expectKeyword('with');\n\n        expect('(');\n\n        object = parseExpression();\n\n        expect(')');\n\n        body = parseStatement();\n\n        return {\n            type: Syntax.WithStatement,\n            object: object,\n            body: body\n        };\n    }\n\n    // 12.10 The swith statement\n\n    function parseSwitchCase() {\n        var test,\n            consequent = [],\n            statement;\n\n        if (matchKeyword('default')) {\n            lex();\n            test = null;\n        } else {\n            expectKeyword('case');\n            test = parseExpression();\n        }\n        expect(':');\n\n        while (index < length) {\n            if (match('}') || matchKeyword('default') || matchKeyword('case')) {\n                break;\n            }\n            statement = parseStatement();\n            if (typeof statement === 'undefined') {\n                break;\n            }\n            consequent.push(statement);\n        }\n\n        return {\n            type: Syntax.SwitchCase,\n            test: test,\n            consequent: consequent\n        };\n    }\n\n    function parseSwitchStatement() {\n        var discriminant, cases, clause, oldInSwitch, defaultFound;\n\n        expectKeyword('switch');\n\n        expect('(');\n\n        discriminant = parseExpression();\n\n        expect(')');\n\n        expect('{');\n\n        cases = [];\n\n        if (match('}')) {\n            lex();\n            return {\n                type: Syntax.SwitchStatement,\n                discriminant: discriminant,\n                cases: cases\n            };\n        }\n\n        oldInSwitch = state.inSwitch;\n        state.inSwitch = true;\n        defaultFound = false;\n\n        while (index < length) {\n            if (match('}')) {\n                break;\n            }\n            clause = parseSwitchCase();\n            if (clause.test === null) {\n                if (defaultFound) {\n                    throwError({}, Messages.MultipleDefaultsInSwitch);\n                }\n                defaultFound = true;\n            }\n            cases.push(clause);\n        }\n\n        state.inSwitch = oldInSwitch;\n\n        expect('}');\n\n        return {\n            type: Syntax.SwitchStatement,\n            discriminant: discriminant,\n            cases: cases\n        };\n    }\n\n    // 12.13 The throw statement\n\n    function parseThrowStatement() {\n        var argument;\n\n        expectKeyword('throw');\n\n        if (peekLineTerminator()) {\n            throwError({}, Messages.NewlineAfterThrow);\n        }\n\n        argument = parseExpression();\n\n        consumeSemicolon();\n\n        return {\n            type: Syntax.ThrowStatement,\n            argument: argument\n        };\n    }\n\n    // 12.14 The try statement\n\n    function parseCatchClause() {\n        var param;\n\n        expectKeyword('catch');\n\n        expect('(');\n        if (match(')')) {\n            throwUnexpected(lookahead());\n        }\n\n        param = parseVariableIdentifier();\n        // 12.14.1\n        if (strict && isRestrictedWord(param.name)) {\n            throwErrorTolerant({}, Messages.StrictCatchVariable);\n        }\n\n        expect(')');\n\n        return {\n            type: Syntax.CatchClause,\n            param: param,\n            body: parseBlock()\n        };\n    }\n\n    function parseTryStatement() {\n        var block, handlers = [], finalizer = null;\n\n        expectKeyword('try');\n\n        block = parseBlock();\n\n        if (matchKeyword('catch')) {\n            handlers.push(parseCatchClause());\n        }\n\n        if (matchKeyword('finally')) {\n            lex();\n            finalizer = parseBlock();\n        }\n\n        if (handlers.length === 0 && !finalizer) {\n            throwError({}, Messages.NoCatchOrFinally);\n        }\n\n        return {\n            type: Syntax.TryStatement,\n            block: block,\n            guardedHandlers: [],\n            handlers: handlers,\n            finalizer: finalizer\n        };\n    }\n\n    // 12.15 The debugger statement\n\n    function parseDebuggerStatement() {\n        expectKeyword('debugger');\n\n        consumeSemicolon();\n\n        return {\n            type: Syntax.DebuggerStatement\n        };\n    }\n\n    // 12 Statements\n\n    function parseStatement() {\n        var token = lookahead(),\n            expr,\n            labeledBody;\n\n        if (token.type === Token.EOF) {\n            throwUnexpected(token);\n        }\n\n        if (token.type === Token.Punctuator) {\n            switch (token.value) {\n            case ';':\n                return parseEmptyStatement();\n            case '{':\n                return parseBlock();\n            case '(':\n                return parseExpressionStatement();\n            default:\n                break;\n            }\n        }\n\n        if (token.type === Token.Keyword) {\n            switch (token.value) {\n            case 'break':\n                return parseBreakStatement();\n            case 'continue':\n                return parseContinueStatement();\n            case 'debugger':\n                return parseDebuggerStatement();\n            case 'do':\n                return parseDoWhileStatement();\n            case 'for':\n                return parseForStatement();\n            case 'function':\n                return parseFunctionDeclaration();\n            case 'if':\n                return parseIfStatement();\n            case 'return':\n                return parseReturnStatement();\n            case 'switch':\n                return parseSwitchStatement();\n            case 'throw':\n                return parseThrowStatement();\n            case 'try':\n                return parseTryStatement();\n            case 'var':\n                return parseVariableStatement();\n            case 'while':\n                return parseWhileStatement();\n            case 'with':\n                return parseWithStatement();\n            default:\n                break;\n            }\n        }\n\n        expr = parseExpression();\n\n        // 12.12 Labelled Statements\n        if ((expr.type === Syntax.Identifier) && match(':')) {\n            lex();\n\n            if (Object.prototype.hasOwnProperty.call(state.labelSet, expr.name)) {\n                throwError({}, Messages.Redeclaration, 'Label', expr.name);\n            }\n\n            state.labelSet[expr.name] = true;\n            labeledBody = parseStatement();\n            delete state.labelSet[expr.name];\n\n            return {\n                type: Syntax.LabeledStatement,\n                label: expr,\n                body: labeledBody\n            };\n        }\n\n        consumeSemicolon();\n\n        return {\n            type: Syntax.ExpressionStatement,\n            expression: expr\n        };\n    }\n\n    // 13 Function Definition\n\n    function parseFunctionSourceElements() {\n        var sourceElement, sourceElements = [], token, directive, firstRestricted,\n            oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody;\n\n        expect('{');\n\n        while (index < length) {\n            token = lookahead();\n            if (token.type !== Token.StringLiteral) {\n                break;\n            }\n\n            sourceElement = parseSourceElement();\n            sourceElements.push(sourceElement);\n            if (sourceElement.expression.type !== Syntax.Literal) {\n                // this is not directive\n                break;\n            }\n            directive = sliceSource(token.range[0] + 1, token.range[1] - 1);\n            if (directive === 'use strict') {\n                strict = true;\n                if (firstRestricted) {\n                    throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);\n                }\n            } else {\n                if (!firstRestricted && token.octal) {\n                    firstRestricted = token;\n                }\n            }\n        }\n\n        oldLabelSet = state.labelSet;\n        oldInIteration = state.inIteration;\n        oldInSwitch = state.inSwitch;\n        oldInFunctionBody = state.inFunctionBody;\n\n        state.labelSet = {};\n        state.inIteration = false;\n        state.inSwitch = false;\n        state.inFunctionBody = true;\n\n        while (index < length) {\n            if (match('}')) {\n                break;\n            }\n            sourceElement = parseSourceElement();\n            if (typeof sourceElement === 'undefined') {\n                break;\n            }\n            sourceElements.push(sourceElement);\n        }\n\n        expect('}');\n\n        state.labelSet = oldLabelSet;\n        state.inIteration = oldInIteration;\n        state.inSwitch = oldInSwitch;\n        state.inFunctionBody = oldInFunctionBody;\n\n        return {\n            type: Syntax.BlockStatement,\n            body: sourceElements\n        };\n    }\n\n    function parseFunctionDeclaration() {\n        var id, param, params = [], body, token, stricted, firstRestricted, message, previousStrict, paramSet;\n\n        expectKeyword('function');\n        token = lookahead();\n        id = parseVariableIdentifier();\n        if (strict) {\n            if (isRestrictedWord(token.value)) {\n                throwErrorTolerant(token, Messages.StrictFunctionName);\n            }\n        } else {\n            if (isRestrictedWord(token.value)) {\n                firstRestricted = token;\n                message = Messages.StrictFunctionName;\n            } else if (isStrictModeReservedWord(token.value)) {\n                firstRestricted = token;\n                message = Messages.StrictReservedWord;\n            }\n        }\n\n        expect('(');\n\n        if (!match(')')) {\n            paramSet = {};\n            while (index < length) {\n                token = lookahead();\n                param = parseVariableIdentifier();\n                if (strict) {\n                    if (isRestrictedWord(token.value)) {\n                        stricted = token;\n                        message = Messages.StrictParamName;\n                    }\n                    if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) {\n                        stricted = token;\n                        message = Messages.StrictParamDupe;\n                    }\n                } else if (!firstRestricted) {\n                    if (isRestrictedWord(token.value)) {\n                        firstRestricted = token;\n                        message = Messages.StrictParamName;\n                    } else if (isStrictModeReservedWord(token.value)) {\n                        firstRestricted = token;\n                        message = Messages.StrictReservedWord;\n                    } else if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) {\n                        firstRestricted = token;\n                        message = Messages.StrictParamDupe;\n                    }\n                }\n                params.push(param);\n                paramSet[param.name] = true;\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        previousStrict = strict;\n        body = parseFunctionSourceElements();\n        if (strict && firstRestricted) {\n            throwError(firstRestricted, message);\n        }\n        if (strict && stricted) {\n            throwErrorTolerant(stricted, message);\n        }\n        strict = previousStrict;\n\n        return {\n            type: Syntax.FunctionDeclaration,\n            id: id,\n            params: params,\n            defaults: [],\n            body: body,\n            rest: null,\n            generator: false,\n            expression: false\n        };\n    }\n\n    function parseFunctionExpression() {\n        var token, id = null, stricted, firstRestricted, message, param, params = [], body, previousStrict, paramSet;\n\n        expectKeyword('function');\n\n        if (!match('(')) {\n            token = lookahead();\n            id = parseVariableIdentifier();\n            if (strict) {\n                if (isRestrictedWord(token.value)) {\n                    throwErrorTolerant(token, Messages.StrictFunctionName);\n                }\n            } else {\n                if (isRestrictedWord(token.value)) {\n                    firstRestricted = token;\n                    message = Messages.StrictFunctionName;\n                } else if (isStrictModeReservedWord(token.value)) {\n                    firstRestricted = token;\n                    message = Messages.StrictReservedWord;\n                }\n            }\n        }\n\n        expect('(');\n\n        if (!match(')')) {\n            paramSet = {};\n            while (index < length) {\n                token = lookahead();\n                param = parseVariableIdentifier();\n                if (strict) {\n                    if (isRestrictedWord(token.value)) {\n                        stricted = token;\n                        message = Messages.StrictParamName;\n                    }\n                    if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) {\n                        stricted = token;\n                        message = Messages.StrictParamDupe;\n                    }\n                } else if (!firstRestricted) {\n                    if (isRestrictedWord(token.value)) {\n                        firstRestricted = token;\n                        message = Messages.StrictParamName;\n                    } else if (isStrictModeReservedWord(token.value)) {\n                        firstRestricted = token;\n                        message = Messages.StrictReservedWord;\n                    } else if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) {\n                        firstRestricted = token;\n                        message = Messages.StrictParamDupe;\n                    }\n                }\n                params.push(param);\n                paramSet[param.name] = true;\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        previousStrict = strict;\n        body = parseFunctionSourceElements();\n        if (strict && firstRestricted) {\n            throwError(firstRestricted, message);\n        }\n        if (strict && stricted) {\n            throwErrorTolerant(stricted, message);\n        }\n        strict = previousStrict;\n\n        return {\n            type: Syntax.FunctionExpression,\n            id: id,\n            params: params,\n            defaults: [],\n            body: body,\n            rest: null,\n            generator: false,\n            expression: false\n        };\n    }\n\n    // 14 Program\n\n    function parseSourceElement() {\n        var token = lookahead();\n\n        if (token.type === Token.Keyword) {\n            switch (token.value) {\n            case 'const':\n            case 'let':\n                return parseConstLetDeclaration(token.value);\n            case 'function':\n                return parseFunctionDeclaration();\n            default:\n                return parseStatement();\n            }\n        }\n\n        if (token.type !== Token.EOF) {\n            return parseStatement();\n        }\n    }\n\n    function parseSourceElements() {\n        var sourceElement, sourceElements = [], token, directive, firstRestricted;\n\n        while (index < length) {\n            token = lookahead();\n            if (token.type !== Token.StringLiteral) {\n                break;\n            }\n\n            sourceElement = parseSourceElement();\n            sourceElements.push(sourceElement);\n            if (sourceElement.expression.type !== Syntax.Literal) {\n                // this is not directive\n                break;\n            }\n            directive = sliceSource(token.range[0] + 1, token.range[1] - 1);\n            if (directive === 'use strict') {\n                strict = true;\n                if (firstRestricted) {\n                    throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);\n                }\n            } else {\n                if (!firstRestricted && token.octal) {\n                    firstRestricted = token;\n                }\n            }\n        }\n\n        while (index < length) {\n            sourceElement = parseSourceElement();\n            if (typeof sourceElement === 'undefined') {\n                break;\n            }\n            sourceElements.push(sourceElement);\n        }\n        return sourceElements;\n    }\n\n    function parseProgram() {\n        var program;\n        strict = false;\n        program = {\n            type: Syntax.Program,\n            body: parseSourceElements()\n        };\n        return program;\n    }\n\n    // The following functions are needed only when the option to preserve\n    // the comments is active.\n\n    function addComment(type, value, start, end, loc) {\n        assert(typeof start === 'number', 'Comment must have valid position');\n\n        // Because the way the actual token is scanned, often the comments\n        // (if any) are skipped twice during the lexical analysis.\n        // Thus, we need to skip adding a comment if the comment array already\n        // handled it.\n        if (extra.comments.length > 0) {\n            if (extra.comments[extra.comments.length - 1].range[1] > start) {\n                return;\n            }\n        }\n\n        extra.comments.push({\n            type: type,\n            value: value,\n            range: [start, end],\n            loc: loc\n        });\n    }\n\n    function scanComment() {\n        var comment, ch, loc, start, blockComment, lineComment;\n\n        comment = '';\n        blockComment = false;\n        lineComment = false;\n\n        while (index < length) {\n            ch = source[index];\n\n            if (lineComment) {\n                ch = source[index++];\n                if (isLineTerminator(ch)) {\n                    loc.end = {\n                        line: lineNumber,\n                        column: index - lineStart - 1\n                    };\n                    lineComment = false;\n                    addComment('Line', comment, start, index - 1, loc);\n                    if (ch === '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                    ++lineNumber;\n                    lineStart = index;\n                    comment = '';\n                } else if (index >= length) {\n                    lineComment = false;\n                    comment += ch;\n                    loc.end = {\n                        line: lineNumber,\n                        column: length - lineStart\n                    };\n                    addComment('Line', comment, start, length, loc);\n                } else {\n                    comment += ch;\n                }\n            } else if (blockComment) {\n                if (isLineTerminator(ch)) {\n                    if (ch === '\\r' && source[index + 1] === '\\n') {\n                        ++index;\n                        comment += '\\r\\n';\n                    } else {\n                        comment += ch;\n                    }\n                    ++lineNumber;\n                    ++index;\n                    lineStart = index;\n                    if (index >= length) {\n                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                    }\n                } else {\n                    ch = source[index++];\n                    if (index >= length) {\n                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                    }\n                    comment += ch;\n                    if (ch === '*') {\n                        ch = source[index];\n                        if (ch === '/') {\n                            comment = comment.substr(0, comment.length - 1);\n                            blockComment = false;\n                            ++index;\n                            loc.end = {\n                                line: lineNumber,\n                                column: index - lineStart\n                            };\n                            addComment('Block', comment, start, index, loc);\n                            comment = '';\n                        }\n                    }\n                }\n            } else if (ch === '/') {\n                ch = source[index + 1];\n                if (ch === '/') {\n                    loc = {\n                        start: {\n                            line: lineNumber,\n                            column: index - lineStart\n                        }\n                    };\n                    start = index;\n                    index += 2;\n                    lineComment = true;\n                    if (index >= length) {\n                        loc.end = {\n                            line: lineNumber,\n                            column: index - lineStart\n                        };\n                        lineComment = false;\n                        addComment('Line', comment, start, index, loc);\n                    }\n                } else if (ch === '*') {\n                    start = index;\n                    index += 2;\n                    blockComment = true;\n                    loc = {\n                        start: {\n                            line: lineNumber,\n                            column: index - lineStart - 2\n                        }\n                    };\n                    if (index >= length) {\n                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                    }\n                } else {\n                    break;\n                }\n            } else if (isWhiteSpace(ch)) {\n                ++index;\n            } else if (isLineTerminator(ch)) {\n                ++index;\n                if (ch ===  '\\r' && source[index] === '\\n') {\n                    ++index;\n                }\n                ++lineNumber;\n                lineStart = index;\n            } else {\n                break;\n            }\n        }\n    }\n\n    function filterCommentLocation() {\n        var i, entry, comment, comments = [];\n\n        for (i = 0; i < extra.comments.length; ++i) {\n            entry = extra.comments[i];\n            comment = {\n                type: entry.type,\n                value: entry.value\n            };\n            if (extra.range) {\n                comment.range = entry.range;\n            }\n            if (extra.loc) {\n                comment.loc = entry.loc;\n            }\n            comments.push(comment);\n        }\n\n        extra.comments = comments;\n    }\n\n    function collectToken() {\n        var start, loc, token, range, value;\n\n        skipComment();\n        start = index;\n        loc = {\n            start: {\n                line: lineNumber,\n                column: index - lineStart\n            }\n        };\n\n        token = extra.advance();\n        loc.end = {\n            line: lineNumber,\n            column: index - lineStart\n        };\n\n        if (token.type !== Token.EOF) {\n            range = [token.range[0], token.range[1]];\n            value = sliceSource(token.range[0], token.range[1]);\n            extra.tokens.push({\n                type: TokenName[token.type],\n                value: value,\n                range: range,\n                loc: loc\n            });\n        }\n\n        return token;\n    }\n\n    function collectRegex() {\n        var pos, loc, regex, token;\n\n        skipComment();\n\n        pos = index;\n        loc = {\n            start: {\n                line: lineNumber,\n                column: index - lineStart\n            }\n        };\n\n        regex = extra.scanRegExp();\n        loc.end = {\n            line: lineNumber,\n            column: index - lineStart\n        };\n\n        // Pop the previous token, which is likely '/' or '/='\n        if (extra.tokens.length > 0) {\n            token = extra.tokens[extra.tokens.length - 1];\n            if (token.range[0] === pos && token.type === 'Punctuator') {\n                if (token.value === '/' || token.value === '/=') {\n                    extra.tokens.pop();\n                }\n            }\n        }\n\n        extra.tokens.push({\n            type: 'RegularExpression',\n            value: regex.literal,\n            range: [pos, index],\n            loc: loc\n        });\n\n        return regex;\n    }\n\n    function filterTokenLocation() {\n        var i, entry, token, tokens = [];\n\n        for (i = 0; i < extra.tokens.length; ++i) {\n            entry = extra.tokens[i];\n            token = {\n                type: entry.type,\n                value: entry.value\n            };\n            if (extra.range) {\n                token.range = entry.range;\n            }\n            if (extra.loc) {\n                token.loc = entry.loc;\n            }\n            tokens.push(token);\n        }\n\n        extra.tokens = tokens;\n    }\n\n    function createLiteral(token) {\n        return {\n            type: Syntax.Literal,\n            value: token.value\n        };\n    }\n\n    function createRawLiteral(token) {\n        return {\n            type: Syntax.Literal,\n            value: token.value,\n            raw: sliceSource(token.range[0], token.range[1])\n        };\n    }\n\n    function createLocationMarker() {\n        var marker = {};\n\n        marker.range = [index, index];\n        marker.loc = {\n            start: {\n                line: lineNumber,\n                column: index - lineStart\n            },\n            end: {\n                line: lineNumber,\n                column: index - lineStart\n            }\n        };\n\n        marker.end = function () {\n            this.range[1] = index;\n            this.loc.end.line = lineNumber;\n            this.loc.end.column = index - lineStart;\n        };\n\n        marker.applyGroup = function (node) {\n            if (extra.range) {\n                node.groupRange = [this.range[0], this.range[1]];\n            }\n            if (extra.loc) {\n                node.groupLoc = {\n                    start: {\n                        line: this.loc.start.line,\n                        column: this.loc.start.column\n                    },\n                    end: {\n                        line: this.loc.end.line,\n                        column: this.loc.end.column\n                    }\n                };\n            }\n        };\n\n        marker.apply = function (node) {\n            if (extra.range) {\n                node.range = [this.range[0], this.range[1]];\n            }\n            if (extra.loc) {\n                node.loc = {\n                    start: {\n                        line: this.loc.start.line,\n                        column: this.loc.start.column\n                    },\n                    end: {\n                        line: this.loc.end.line,\n                        column: this.loc.end.column\n                    }\n                };\n            }\n        };\n\n        return marker;\n    }\n\n    function trackGroupExpression() {\n        var marker, expr;\n\n        skipComment();\n        marker = createLocationMarker();\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        marker.end();\n        marker.applyGroup(expr);\n\n        return expr;\n    }\n\n    function trackLeftHandSideExpression() {\n        var marker, expr;\n\n        skipComment();\n        marker = createLocationMarker();\n\n        expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();\n\n        while (match('.') || match('[')) {\n            if (match('[')) {\n                expr = {\n                    type: Syntax.MemberExpression,\n                    computed: true,\n                    object: expr,\n                    property: parseComputedMember()\n                };\n                marker.end();\n                marker.apply(expr);\n            } else {\n                expr = {\n                    type: Syntax.MemberExpression,\n                    computed: false,\n                    object: expr,\n                    property: parseNonComputedMember()\n                };\n                marker.end();\n                marker.apply(expr);\n            }\n        }\n\n        return expr;\n    }\n\n    function trackLeftHandSideExpressionAllowCall() {\n        var marker, expr;\n\n        skipComment();\n        marker = createLocationMarker();\n\n        expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();\n\n        while (match('.') || match('[') || match('(')) {\n            if (match('(')) {\n                expr = {\n                    type: Syntax.CallExpression,\n                    callee: expr,\n                    'arguments': parseArguments()\n                };\n                marker.end();\n                marker.apply(expr);\n            } else if (match('[')) {\n                expr = {\n                    type: Syntax.MemberExpression,\n                    computed: true,\n                    object: expr,\n                    property: parseComputedMember()\n                };\n                marker.end();\n                marker.apply(expr);\n            } else {\n                expr = {\n                    type: Syntax.MemberExpression,\n                    computed: false,\n                    object: expr,\n                    property: parseNonComputedMember()\n                };\n                marker.end();\n                marker.apply(expr);\n            }\n        }\n\n        return expr;\n    }\n\n    function filterGroup(node) {\n        var n, i, entry;\n\n        n = (Object.prototype.toString.apply(node) === '[object Array]') ? [] : {};\n        for (i in node) {\n            if (node.hasOwnProperty(i) && i !== 'groupRange' && i !== 'groupLoc') {\n                entry = node[i];\n                if (entry === null || typeof entry !== 'object' || entry instanceof RegExp) {\n                    n[i] = entry;\n                } else {\n                    n[i] = filterGroup(entry);\n                }\n            }\n        }\n        return n;\n    }\n\n    function wrapTrackingFunction(range, loc) {\n\n        return function (parseFunction) {\n\n            function isBinary(node) {\n                return node.type === Syntax.LogicalExpression ||\n                    node.type === Syntax.BinaryExpression;\n            }\n\n            function visit(node) {\n                var start, end;\n\n                if (isBinary(node.left)) {\n                    visit(node.left);\n                }\n                if (isBinary(node.right)) {\n                    visit(node.right);\n                }\n\n                if (range) {\n                    if (node.left.groupRange || node.right.groupRange) {\n                        start = node.left.groupRange ? node.left.groupRange[0] : node.left.range[0];\n                        end = node.right.groupRange ? node.right.groupRange[1] : node.right.range[1];\n                        node.range = [start, end];\n                    } else if (typeof node.range === 'undefined') {\n                        start = node.left.range[0];\n                        end = node.right.range[1];\n                        node.range = [start, end];\n                    }\n                }\n                if (loc) {\n                    if (node.left.groupLoc || node.right.groupLoc) {\n                        start = node.left.groupLoc ? node.left.groupLoc.start : node.left.loc.start;\n                        end = node.right.groupLoc ? node.right.groupLoc.end : node.right.loc.end;\n                        node.loc = {\n                            start: start,\n                            end: end\n                        };\n                    } else if (typeof node.loc === 'undefined') {\n                        node.loc = {\n                            start: node.left.loc.start,\n                            end: node.right.loc.end\n                        };\n                    }\n                }\n            }\n\n            return function () {\n                var marker, node;\n\n                skipComment();\n\n                marker = createLocationMarker();\n                node = parseFunction.apply(null, arguments);\n                marker.end();\n\n                if (range && typeof node.range === 'undefined') {\n                    marker.apply(node);\n                }\n\n                if (loc && typeof node.loc === 'undefined') {\n                    marker.apply(node);\n                }\n\n                if (isBinary(node)) {\n                    visit(node);\n                }\n\n                return node;\n            };\n        };\n    }\n\n    function patch() {\n\n        var wrapTracking;\n\n        if (extra.comments) {\n            extra.skipComment = skipComment;\n            skipComment = scanComment;\n        }\n\n        if (extra.raw) {\n            extra.createLiteral = createLiteral;\n            createLiteral = createRawLiteral;\n        }\n\n        if (extra.range || extra.loc) {\n\n            extra.parseGroupExpression = parseGroupExpression;\n            extra.parseLeftHandSideExpression = parseLeftHandSideExpression;\n            extra.parseLeftHandSideExpressionAllowCall = parseLeftHandSideExpressionAllowCall;\n            parseGroupExpression = trackGroupExpression;\n            parseLeftHandSideExpression = trackLeftHandSideExpression;\n            parseLeftHandSideExpressionAllowCall = trackLeftHandSideExpressionAllowCall;\n\n            wrapTracking = wrapTrackingFunction(extra.range, extra.loc);\n\n            extra.parseAdditiveExpression = parseAdditiveExpression;\n            extra.parseAssignmentExpression = parseAssignmentExpression;\n            extra.parseBitwiseANDExpression = parseBitwiseANDExpression;\n            extra.parseBitwiseORExpression = parseBitwiseORExpression;\n            extra.parseBitwiseXORExpression = parseBitwiseXORExpression;\n            extra.parseBlock = parseBlock;\n            extra.parseFunctionSourceElements = parseFunctionSourceElements;\n            extra.parseCatchClause = parseCatchClause;\n            extra.parseComputedMember = parseComputedMember;\n            extra.parseConditionalExpression = parseConditionalExpression;\n            extra.parseConstLetDeclaration = parseConstLetDeclaration;\n            extra.parseEqualityExpression = parseEqualityExpression;\n            extra.parseExpression = parseExpression;\n            extra.parseForVariableDeclaration = parseForVariableDeclaration;\n            extra.parseFunctionDeclaration = parseFunctionDeclaration;\n            extra.parseFunctionExpression = parseFunctionExpression;\n            extra.parseLogicalANDExpression = parseLogicalANDExpression;\n            extra.parseLogicalORExpression = parseLogicalORExpression;\n            extra.parseMultiplicativeExpression = parseMultiplicativeExpression;\n            extra.parseNewExpression = parseNewExpression;\n            extra.parseNonComputedProperty = parseNonComputedProperty;\n            extra.parseObjectProperty = parseObjectProperty;\n            extra.parseObjectPropertyKey = parseObjectPropertyKey;\n            extra.parsePostfixExpression = parsePostfixExpression;\n            extra.parsePrimaryExpression = parsePrimaryExpression;\n            extra.parseProgram = parseProgram;\n            extra.parsePropertyFunction = parsePropertyFunction;\n            extra.parseRelationalExpression = parseRelationalExpression;\n            extra.parseStatement = parseStatement;\n            extra.parseShiftExpression = parseShiftExpression;\n            extra.parseSwitchCase = parseSwitchCase;\n            extra.parseUnaryExpression = parseUnaryExpression;\n            extra.parseVariableDeclaration = parseVariableDeclaration;\n            extra.parseVariableIdentifier = parseVariableIdentifier;\n\n            parseAdditiveExpression = wrapTracking(extra.parseAdditiveExpression);\n            parseAssignmentExpression = wrapTracking(extra.parseAssignmentExpression);\n            parseBitwiseANDExpression = wrapTracking(extra.parseBitwiseANDExpression);\n            parseBitwiseORExpression = wrapTracking(extra.parseBitwiseORExpression);\n            parseBitwiseXORExpression = wrapTracking(extra.parseBitwiseXORExpression);\n            parseBlock = wrapTracking(extra.parseBlock);\n            parseFunctionSourceElements = wrapTracking(extra.parseFunctionSourceElements);\n            parseCatchClause = wrapTracking(extra.parseCatchClause);\n            parseComputedMember = wrapTracking(extra.parseComputedMember);\n            parseConditionalExpression = wrapTracking(extra.parseConditionalExpression);\n            parseConstLetDeclaration = wrapTracking(extra.parseConstLetDeclaration);\n            parseEqualityExpression = wrapTracking(extra.parseEqualityExpression);\n            parseExpression = wrapTracking(extra.parseExpression);\n            parseForVariableDeclaration = wrapTracking(extra.parseForVariableDeclaration);\n            parseFunctionDeclaration = wrapTracking(extra.parseFunctionDeclaration);\n            parseFunctionExpression = wrapTracking(extra.parseFunctionExpression);\n            parseLeftHandSideExpression = wrapTracking(parseLeftHandSideExpression);\n            parseLogicalANDExpression = wrapTracking(extra.parseLogicalANDExpression);\n            parseLogicalORExpression = wrapTracking(extra.parseLogicalORExpression);\n            parseMultiplicativeExpression = wrapTracking(extra.parseMultiplicativeExpression);\n            parseNewExpression = wrapTracking(extra.parseNewExpression);\n            parseNonComputedProperty = wrapTracking(extra.parseNonComputedProperty);\n            parseObjectProperty = wrapTracking(extra.parseObjectProperty);\n            parseObjectPropertyKey = wrapTracking(extra.parseObjectPropertyKey);\n            parsePostfixExpression = wrapTracking(extra.parsePostfixExpression);\n            parsePrimaryExpression = wrapTracking(extra.parsePrimaryExpression);\n            parseProgram = wrapTracking(extra.parseProgram);\n            parsePropertyFunction = wrapTracking(extra.parsePropertyFunction);\n            parseRelationalExpression = wrapTracking(extra.parseRelationalExpression);\n            parseStatement = wrapTracking(extra.parseStatement);\n            parseShiftExpression = wrapTracking(extra.parseShiftExpression);\n            parseSwitchCase = wrapTracking(extra.parseSwitchCase);\n            parseUnaryExpression = wrapTracking(extra.parseUnaryExpression);\n            parseVariableDeclaration = wrapTracking(extra.parseVariableDeclaration);\n            parseVariableIdentifier = wrapTracking(extra.parseVariableIdentifier);\n        }\n\n        if (typeof extra.tokens !== 'undefined') {\n            extra.advance = advance;\n            extra.scanRegExp = scanRegExp;\n\n            advance = collectToken;\n            scanRegExp = collectRegex;\n        }\n    }\n\n    function unpatch() {\n        if (typeof extra.skipComment === 'function') {\n            skipComment = extra.skipComment;\n        }\n\n        if (extra.raw) {\n            createLiteral = extra.createLiteral;\n        }\n\n        if (extra.range || extra.loc) {\n            parseAdditiveExpression = extra.parseAdditiveExpression;\n            parseAssignmentExpression = extra.parseAssignmentExpression;\n            parseBitwiseANDExpression = extra.parseBitwiseANDExpression;\n            parseBitwiseORExpression = extra.parseBitwiseORExpression;\n            parseBitwiseXORExpression = extra.parseBitwiseXORExpression;\n            parseBlock = extra.parseBlock;\n            parseFunctionSourceElements = extra.parseFunctionSourceElements;\n            parseCatchClause = extra.parseCatchClause;\n            parseComputedMember = extra.parseComputedMember;\n            parseConditionalExpression = extra.parseConditionalExpression;\n            parseConstLetDeclaration = extra.parseConstLetDeclaration;\n            parseEqualityExpression = extra.parseEqualityExpression;\n            parseExpression = extra.parseExpression;\n            parseForVariableDeclaration = extra.parseForVariableDeclaration;\n            parseFunctionDeclaration = extra.parseFunctionDeclaration;\n            parseFunctionExpression = extra.parseFunctionExpression;\n            parseGroupExpression = extra.parseGroupExpression;\n            parseLeftHandSideExpression = extra.parseLeftHandSideExpression;\n            parseLeftHandSideExpressionAllowCall = extra.parseLeftHandSideExpressionAllowCall;\n            parseLogicalANDExpression = extra.parseLogicalANDExpression;\n            parseLogicalORExpression = extra.parseLogicalORExpression;\n            parseMultiplicativeExpression = extra.parseMultiplicativeExpression;\n            parseNewExpression = extra.parseNewExpression;\n            parseNonComputedProperty = extra.parseNonComputedProperty;\n            parseObjectProperty = extra.parseObjectProperty;\n            parseObjectPropertyKey = extra.parseObjectPropertyKey;\n            parsePrimaryExpression = extra.parsePrimaryExpression;\n            parsePostfixExpression = extra.parsePostfixExpression;\n            parseProgram = extra.parseProgram;\n            parsePropertyFunction = extra.parsePropertyFunction;\n            parseRelationalExpression = extra.parseRelationalExpression;\n            parseStatement = extra.parseStatement;\n            parseShiftExpression = extra.parseShiftExpression;\n            parseSwitchCase = extra.parseSwitchCase;\n            parseUnaryExpression = extra.parseUnaryExpression;\n            parseVariableDeclaration = extra.parseVariableDeclaration;\n            parseVariableIdentifier = extra.parseVariableIdentifier;\n        }\n\n        if (typeof extra.scanRegExp === 'function') {\n            advance = extra.advance;\n            scanRegExp = extra.scanRegExp;\n        }\n    }\n\n    function stringToArray(str) {\n        var length = str.length,\n            result = [],\n            i;\n        for (i = 0; i < length; ++i) {\n            result[i] = str.charAt(i);\n        }\n        return result;\n    }\n\n    function parse(code, options) {\n        var program, toString;\n\n        toString = String;\n        if (typeof code !== 'string' && !(code instanceof String)) {\n            code = toString(code);\n        }\n\n        source = code;\n        index = 0;\n        lineNumber = (source.length > 0) ? 1 : 0;\n        lineStart = 0;\n        length = source.length;\n        buffer = null;\n        state = {\n            allowIn: true,\n            labelSet: {},\n            inFunctionBody: false,\n            inIteration: false,\n            inSwitch: false\n        };\n\n        extra = {};\n        if (typeof options !== 'undefined') {\n            extra.range = (typeof options.range === 'boolean') && options.range;\n            extra.loc = (typeof options.loc === 'boolean') && options.loc;\n            extra.raw = (typeof options.raw === 'boolean') && options.raw;\n            if (typeof options.tokens === 'boolean' && options.tokens) {\n                extra.tokens = [];\n            }\n            if (typeof options.comment === 'boolean' && options.comment) {\n                extra.comments = [];\n            }\n            if (typeof options.tolerant === 'boolean' && options.tolerant) {\n                extra.errors = [];\n            }\n        }\n\n        if (length > 0) {\n            if (typeof source[0] === 'undefined') {\n                // Try first to convert to a string. This is good as fast path\n                // for old IE which understands string indexing for string\n                // literals only and not for string object.\n                if (code instanceof String) {\n                    source = code.valueOf();\n                }\n\n                // Force accessing the characters via an array.\n                if (typeof source[0] === 'undefined') {\n                    source = stringToArray(code);\n                }\n            }\n        }\n\n        patch();\n        try {\n            program = parseProgram();\n            if (typeof extra.comments !== 'undefined') {\n                filterCommentLocation();\n                program.comments = extra.comments;\n            }\n            if (typeof extra.tokens !== 'undefined') {\n                filterTokenLocation();\n                program.tokens = extra.tokens;\n            }\n            if (typeof extra.errors !== 'undefined') {\n                program.errors = extra.errors;\n            }\n            if (extra.range || extra.loc) {\n                program.body = filterGroup(program.body);\n            }\n        } catch (e) {\n            throw e;\n        } finally {\n            unpatch();\n            extra = {};\n        }\n\n        return program;\n    }\n\n    // Sync with package.json.\n    exports.version = '1.0.4';\n\n    exports.parse = parse;\n\n    // Deep copy.\n    exports.Syntax = (function () {\n        var name, types = {};\n\n        if (typeof Object.create === 'function') {\n            types = Object.create(null);\n        }\n\n        for (name in Syntax) {\n            if (Syntax.hasOwnProperty(name)) {\n                types[name] = Syntax[name];\n            }\n        }\n\n        if (typeof Object.freeze === 'function') {\n            Object.freeze(types);\n        }\n\n        return types;\n    }());\n\n}));\n/* vim: set sw=4 ts=4 et tw=80 : */\nreturn module.exports;\n})({exports:{}});\n\nvar index$1$1 = (function (module, global) {\nvar exports = module.exports;\nvar parse = esprima.parse\nvar hoist = index$1\n\nvar InfiniteChecker = infiniteChecker\nvar Primitives = primitives\n\nmodule.exports = safeEval\nmodule.exports.FunctionFactory = FunctionFactory\nmodule.exports.Function = FunctionFactory()\n\nvar maxIterations = 1000000\n\n// 'eval' with a controlled environment\nfunction safeEval(src, parentContext){\n  var tree = prepareAst(src)\n  var context = Object.create(parentContext || {})\n  return finalValue(evaluateAst(tree, context))\n}\n\n// create a 'Function' constructor for a controlled environment\nfunction FunctionFactory(parentContext){\n  var context = Object.create(parentContext || {})\n  return function Function() {\n    // normalize arguments array\n    var args = Array.prototype.slice.call(arguments)\n    var src = args.slice(-1)[0]\n    args = args.slice(0,-1)\n    if (typeof src === 'string'){\n      //HACK: esprima doesn't like returns outside functions\n      src = parse('function a(){' + src + '}').body[0].body\n    }\n    var tree = prepareAst(src)\n    return getFunction(tree, args, context)\n  }\n}\n\n// takes an AST or js source and returns an AST\nfunction prepareAst(src){\n  var tree = (typeof src === 'string') ? parse(src) : src\n  return hoist(tree)\n}\n\n// evaluate an AST in the given context\nfunction evaluateAst(tree, context){\n\n  var safeFunction = FunctionFactory(context)\n  var primitives = Primitives(context)\n\n  // block scoped context for catch (ex) and 'let'\n  var blockContext = context\n\n  return walk(tree)\n\n  // recursively walk every node in an array\n  function walkAll(nodes){\n    var result = undefined\n    for (var i=0;i<nodes.length;i++){\n      var childNode = nodes[i]\n      if (childNode.type === 'EmptyStatement') continue\n      result = walk(childNode)\n      if (result instanceof ReturnValue){\n        return result\n      }\n    }\n    return result\n  }\n\n  // recursively evalutate the node of an AST\n  function walk(node){\n    if (!node) return\n    switch (node.type) {\n\n      case 'Program':\n        return walkAll(node.body)\n\n      case 'BlockStatement':\n        enterBlock()\n        var result = walkAll(node.body)\n        leaveBlock()\n        return result\n\n      case 'FunctionDeclaration':\n        var params = node.params.map(getName)\n        var value = getFunction(node.body, params, blockContext)\n        return context[node.id.name] = value\n\n      case 'FunctionExpression':\n        var params = node.params.map(getName)\n        return getFunction(node.body, params, blockContext)\n\n      case 'ReturnStatement':\n        var value = walk(node.argument)\n        return new ReturnValue('return', value)\n\n      case 'BreakStatement':\n        return new ReturnValue('break')\n\n      case 'ContinueStatement':\n        return new ReturnValue('continue')\n\n      case 'ExpressionStatement':\n        return walk(node.expression)\n\n      case 'AssignmentExpression':\n        return setValue(blockContext, node.left, node.right, node.operator)\n\n      case 'UpdateExpression':\n        return setValue(blockContext, node.argument, null, node.operator)\n\n      case 'VariableDeclaration':\n        node.declarations.forEach(function(declaration){\n          var target = node.kind === 'let' ? blockContext : context\n          if (declaration.init){\n            target[declaration.id.name] = walk(declaration.init)\n          } else {\n            target[declaration.id.name] = undefined\n          }\n        })\n        break\n\n      case 'SwitchStatement':\n        var defaultHandler = null\n        var matched = false\n        var value = walk(node.discriminant)\n        var result = undefined\n\n        enterBlock()\n\n        var i = 0\n        while (result == null){\n          if (i<node.cases.length){\n            if (node.cases[i].test){ // check or fall through\n              matched = matched || (walk(node.cases[i].test) === value)\n            } else if (defaultHandler == null) {\n              defaultHandler = i\n            }\n            if (matched){\n              var r = walkAll(node.cases[i].consequent)\n              if (r instanceof ReturnValue){ // break out\n                if (r.type == 'break') break\n                result = r\n              }\n            }\n            i += 1 // continue\n          } else if (!matched && defaultHandler != null){\n            // go back and do the default handler\n            i = defaultHandler\n            matched = true\n          } else {\n            // nothing we can do\n            break\n          }\n        }\n\n        leaveBlock()\n        return result\n\n      case 'IfStatement':\n        if (walk(node.test)){\n          return walk(node.consequent)\n        } else if (node.alternate) {\n          return walk(node.alternate)\n        }\n\n      case 'ForStatement':\n        var infinite = InfiniteChecker(maxIterations)\n        var result = undefined\n\n        enterBlock() // allow lets on delarations\n        for (walk(node.init); walk(node.test); walk(node.update)){\n          var r = walk(node.body)\n\n          // handle early return, continue and break\n          if (r instanceof ReturnValue){\n            if (r.type == 'continue') continue\n            if (r.type == 'break') break\n            result = r\n            break\n          }\n\n          infinite.check()\n        }\n        leaveBlock()\n        return result\n\n      case 'ForInStatement':\n        var infinite = InfiniteChecker(maxIterations)\n        var result = undefined\n\n        var value = walk(node.right)\n        var property = node.left\n\n        var target = context\n        enterBlock()\n\n        if (property.type == 'VariableDeclaration'){\n          walk(property)\n          property = property.declarations[0].id\n          if (property.kind === 'let'){\n            target = blockContext\n          }\n        }\n\n        for (var key in value){\n          setValue(target, property, {type: 'Literal', value: key})\n          var r = walk(node.body)\n\n          // handle early return, continue and break\n          if (r instanceof ReturnValue){\n            if (r.type == 'continue') continue\n            if (r.type == 'break') break\n            result = r\n            break\n          }\n\n          infinite.check()\n        }\n        leaveBlock()\n\n        return result\n\n      case 'WhileStatement':\n        var infinite = InfiniteChecker(maxIterations)\n        while (walk(node.test)){\n          walk(node.body)\n          infinite.check()\n        }\n        break\n\n      case 'TryStatement':\n        try {\n          walk(node.block)\n        } catch (error) {\n          enterBlock()\n          var catchClause = node.handlers[0]\n          if (catchClause) {\n            blockContext[catchClause.param.name] = error\n            walk(catchClause.body)\n          }\n          leaveBlock()\n        } finally {\n          if (node.finalizer) {\n            walk(node.finalizer)\n          }\n        }\n        break\n\n      case 'Literal':\n        return node.value\n\n      case 'UnaryExpression':\n        var val = walk(node.argument)\n        switch(node.operator) {\n          case '+': return +val\n          case '-': return -val\n          case '~': return ~val\n          case '!': return !val\n          case 'typeof': return typeof val\n          default: return unsupportedExpression(node)\n        }\n\n      case 'ArrayExpression':\n        var obj = blockContext['Array']()\n        for (var i=0;i<node.elements.length;i++){\n          obj.push(walk(node.elements[i]))\n        }\n        return obj\n\n      case 'ObjectExpression':\n        var obj = blockContext['Object']()\n        for (var i = 0; i < node.properties.length; i++) {\n          var prop = node.properties[i]\n          var value = (prop.value === null) ? prop.value : walk(prop.value)\n          obj[prop.key.value || prop.key.name] = value\n        }\n        return obj\n\n      case 'NewExpression':\n        var args = node.arguments.map(function(arg){\n          return walk(arg)\n        })\n        var target = walk(node.callee)\n        return primitives.applyNew(target, args)\n\n\n      case 'BinaryExpression':\n        var l = walk(node.left)\n        var r = walk(node.right)\n        switch(node.operator) {\n          case '==':  return l === r\n          case '===': return l === r\n          case '!=':  return l != r\n          case '!==': return l !== r\n          case '+':   return l + r\n          case '-':   return l - r\n          case '*':   return l * r\n          case '/':   return l / r\n          case '%':   return l % r\n          case '<':   return l < r\n          case '<=':  return l <= r\n          case '>':   return l > r\n          case '>=':  return l >= r\n          case '|':   return l | r\n          case '&':   return l & r\n          case '^':   return l ^ r\n          case 'instanceof': return l instanceof r\n          default: return unsupportedExpression(node)\n        }\n\n      case 'LogicalExpression':\n        switch(node.operator) {\n          case '&&':  return walk(node.left) && walk(node.right)\n          case '||':  return walk(node.left) || walk(node.right)\n          default: return unsupportedExpression(node)\n        }\n\n      case 'ThisExpression':\n        return blockContext['this']\n\n      case 'Identifier':\n        if (node.name === 'undefined'){\n          return undefined\n        } else if (hasProperty(blockContext, node.name, primitives)){\n          return finalValue(blockContext[node.name])\n        } else {\n          throw new ReferenceError(node.name + ' is not defined')\n        }\n\n      case 'CallExpression':\n        var args = node.arguments.map(function(arg){\n          return walk(arg)\n        })\n        var object = null\n        var target = walk(node.callee)\n\n        if (node.callee.type === 'MemberExpression'){\n          object = walk(node.callee.object)\n        }\n        return target.apply(object, args)\n\n      case 'MemberExpression':\n        var obj = walk(node.object)\n        if (node.computed){\n          var prop = walk(node.property)\n        } else {\n          var prop = node.property.name\n        }\n        obj = primitives.getPropertyObject(obj, prop)\n        return checkValue(obj[prop]);\n\n      case 'ConditionalExpression':\n        var val = walk(node.test)\n        return val ? walk(node.consequent) : walk(node.alternate)\n\n      case 'EmptyStatement':\n        return\n\n      default:\n        return unsupportedExpression(node)\n    }\n  }\n\n  // safely retrieve a value\n  function checkValue(value){\n    if (value === Function$1){\n      value = safeFunction\n    }\n    return finalValue(value)\n  }\n\n  // block scope context control\n  function enterBlock(){\n    blockContext = Object.create(blockContext)\n  }\n  function leaveBlock(){\n    blockContext = Object.getPrototypeOf(blockContext)\n  }\n\n  // set a value in the specified context if allowed\n  function setValue(object, left, right, operator){\n    var name = null\n\n    if (left.type === 'Identifier'){\n      name = left.name\n      // handle parent context shadowing\n      object = objectForKey(object, name, primitives)\n    } else if (left.type === 'MemberExpression'){\n      if (left.computed){\n        name = walk(left.property)\n      } else {\n        name = left.property.name\n      }\n      object = walk(left.object)\n    }\n\n    // stop built in properties from being able to be changed\n    if (canSetProperty(object, name, primitives)){\n      switch(operator) {\n        case undefined: return object[name] = walk(right)\n        case '=':  return object[name] = walk(right)\n        case '+=': return object[name] += walk(right)\n        case '-=': return object[name] -= walk(right)\n        case '++': return object[name]++\n        case '--': return object[name]--\n      }\n    }\n\n  }\n\n}\n\n// when an unsupported expression is encountered, throw an error\nfunction unsupportedExpression(node){\n  console.error(node)\n  var err = new Error('Unsupported expression: ' + node.type)\n  err.node = node\n  throw err\n}\n\n// walk a provided object's prototypal hierarchy to retrieve an inherited object\nfunction objectForKey(object, key, primitives){\n  var proto = primitives.getPrototypeOf(object)\n  if (!proto || hasOwnProperty(object, key)){\n    return object\n  } else {\n    return objectForKey(proto, key, primitives)\n  }\n}\n\nfunction hasProperty(object, key, primitives){\n  var proto = primitives.getPrototypeOf(object)\n  var hasOwn = hasOwnProperty(object, key)\n  if (object[key] !== undefined){\n    return true\n  } else if (!proto || hasOwn){\n    return hasOwn\n  } else {\n    return hasProperty(proto, key, primitives)\n  }\n}\n\nfunction hasOwnProperty(object, key){\n  return Object.prototype.hasOwnProperty.call(object, key)\n}\n\nfunction propertyIsEnumerable(object, key){\n  return Object.prototype.propertyIsEnumerable.call(object, key)\n}\n\n\n// determine if we have write access to a property\nfunction canSetProperty(object, property, primitives){\n  if (property === '__proto__' || primitives.isPrimitive(object)){\n    return false\n  } else if (object != null){\n\n    if (hasOwnProperty(object, property)){\n      if (propertyIsEnumerable(object, property)){\n        return true\n      } else {\n        return false\n      }\n    } else {\n      return canSetProperty(primitives.getPrototypeOf(object), property, primitives)\n    }\n\n  } else {\n    return true\n  }\n}\n\n// generate a function with specified context\nfunction getFunction(body, params, parentContext){\n  return function(){\n    var context = Object.create(parentContext)\n    if (this == global){\n      context['this'] = null\n    } else {\n      context['this'] = this\n    }\n    // normalize arguments array\n    var args = Array.prototype.slice.call(arguments)\n    context['arguments'] = arguments\n    args.forEach(function(arg,idx){\n      var param = params[idx]\n      if (param){\n        context[param] = arg\n      }\n    })\n    var result = evaluateAst(body, context)\n\n    if (result instanceof ReturnValue){\n      return result.value\n    }\n  }\n}\n\nfunction finalValue(value){\n  if (value instanceof ReturnValue){\n    return value.value\n  }\n  return value\n}\n\n// get the name of an identifier\nfunction getName(identifier){\n  return identifier.name\n}\n\n// a ReturnValue struct for differentiating between expression result and return statement\nfunction ReturnValue(type, value){\n  this.type = type\n  this.value = value\n}\nreturn module.exports;\n})({exports:{}}, __commonjs_global);\n\nvar Function$1 = index$1$1.Function;\n\nvar pathCache = new Cache(1000);\n\n// actions\nvar APPEND = 0;\nvar PUSH = 1;\nvar INC_SUB_PATH_DEPTH = 2;\nvar PUSH_SUB_PATH = 3;\n\n// states\nvar BEFORE_PATH = 0;\nvar IN_PATH = 1;\nvar BEFORE_IDENT = 2;\nvar IN_IDENT = 3;\nvar IN_SUB_PATH = 4;\nvar IN_SINGLE_QUOTE = 5;\nvar IN_DOUBLE_QUOTE = 6;\nvar AFTER_PATH = 7;\nvar ERROR = 8;\n\nvar pathStateMachine = [];\n\npathStateMachine[BEFORE_PATH] = {\n  'ws': [BEFORE_PATH],\n  'ident': [IN_IDENT, APPEND],\n  '[': [IN_SUB_PATH],\n  'eof': [AFTER_PATH]\n};\n\npathStateMachine[IN_PATH] = {\n  'ws': [IN_PATH],\n  '.': [BEFORE_IDENT],\n  '[': [IN_SUB_PATH],\n  'eof': [AFTER_PATH]\n};\n\npathStateMachine[BEFORE_IDENT] = {\n  'ws': [BEFORE_IDENT],\n  'ident': [IN_IDENT, APPEND]\n};\n\npathStateMachine[IN_IDENT] = {\n  'ident': [IN_IDENT, APPEND],\n  '0': [IN_IDENT, APPEND],\n  'number': [IN_IDENT, APPEND],\n  'ws': [IN_PATH, PUSH],\n  '.': [BEFORE_IDENT, PUSH],\n  '[': [IN_SUB_PATH, PUSH],\n  'eof': [AFTER_PATH, PUSH]\n};\n\npathStateMachine[IN_SUB_PATH] = {\n  \"'\": [IN_SINGLE_QUOTE, APPEND],\n  '\"': [IN_DOUBLE_QUOTE, APPEND],\n  '[': [IN_SUB_PATH, INC_SUB_PATH_DEPTH],\n  ']': [IN_PATH, PUSH_SUB_PATH],\n  'eof': ERROR,\n  'else': [IN_SUB_PATH, APPEND]\n};\n\npathStateMachine[IN_SINGLE_QUOTE] = {\n  \"'\": [IN_SUB_PATH, APPEND],\n  'eof': ERROR,\n  'else': [IN_SINGLE_QUOTE, APPEND]\n};\n\npathStateMachine[IN_DOUBLE_QUOTE] = {\n  '\"': [IN_SUB_PATH, APPEND],\n  'eof': ERROR,\n  'else': [IN_DOUBLE_QUOTE, APPEND]\n};\n\n/**\n * Determine the type of a character in a keypath.\n *\n * @param {Char} ch\n * @return {String} type\n */\n\nfunction getPathCharType(ch) {\n  if (ch === undefined) {\n    return 'eof';\n  }\n\n  var code = ch.charCodeAt(0);\n\n  switch (code) {\n    case 0x5B: // [\n    case 0x5D: // ]\n    case 0x2E: // .\n    case 0x22: // \"\n    case 0x27: // '\n    case 0x30:\n      // 0\n      return ch;\n\n    case 0x5F: // _\n    case 0x24:\n      // $\n      return 'ident';\n\n    case 0x20: // Space\n    case 0x09: // Tab\n    case 0x0A: // Newline\n    case 0x0D: // Return\n    case 0xA0: // No-break space\n    case 0xFEFF: // Byte Order Mark\n    case 0x2028: // Line Separator\n    case 0x2029:\n      // Paragraph Separator\n      return 'ws';\n  }\n\n  // a-z, A-Z\n  if (code >= 0x61 && code <= 0x7A || code >= 0x41 && code <= 0x5A) {\n    return 'ident';\n  }\n\n  // 1-9\n  if (code >= 0x31 && code <= 0x39) {\n    return 'number';\n  }\n\n  return 'else';\n}\n\n/**\n * Format a subPath, return its plain form if it is\n * a literal string or number. Otherwise prepend the\n * dynamic indicator (*).\n *\n * @param {String} path\n * @return {String}\n */\n\nfunction formatSubPath(path) {\n  var trimmed = path.trim();\n  // invalid leading 0\n  if (path.charAt(0) === '0' && isNaN(path)) {\n    return false;\n  }\n  return isLiteral(trimmed) ? stripQuotes(trimmed) : '*' + trimmed;\n}\n\n/**\n * Parse a string path into an array of segments\n *\n * @param {String} path\n * @return {Array|undefined}\n */\n\nfunction parse(path) {\n  var keys = [];\n  var index = -1;\n  var mode = BEFORE_PATH;\n  var subPathDepth = 0;\n  var c, newChar, key, type, transition, action, typeMap;\n\n  var actions = [];\n\n  actions[PUSH] = function () {\n    if (key !== undefined) {\n      keys.push(key);\n      key = undefined;\n    }\n  };\n\n  actions[APPEND] = function () {\n    if (key === undefined) {\n      key = newChar;\n    } else {\n      key += newChar;\n    }\n  };\n\n  actions[INC_SUB_PATH_DEPTH] = function () {\n    actions[APPEND]();\n    subPathDepth++;\n  };\n\n  actions[PUSH_SUB_PATH] = function () {\n    if (subPathDepth > 0) {\n      subPathDepth--;\n      mode = IN_SUB_PATH;\n      actions[APPEND]();\n    } else {\n      subPathDepth = 0;\n      key = formatSubPath(key);\n      if (key === false) {\n        return false;\n      } else {\n        actions[PUSH]();\n      }\n    }\n  };\n\n  function maybeUnescapeQuote() {\n    var nextChar = path[index + 1];\n    if (mode === IN_SINGLE_QUOTE && nextChar === \"'\" || mode === IN_DOUBLE_QUOTE && nextChar === '\"') {\n      index++;\n      newChar = '\\\\' + nextChar;\n      actions[APPEND]();\n      return true;\n    }\n  }\n\n  while (mode != null) {\n    index++;\n    c = path[index];\n\n    if (c === '\\\\' && maybeUnescapeQuote()) {\n      continue;\n    }\n\n    type = getPathCharType(c);\n    typeMap = pathStateMachine[mode];\n    transition = typeMap[type] || typeMap['else'] || ERROR;\n\n    if (transition === ERROR) {\n      return; // parse error\n    }\n\n    mode = transition[0];\n    action = actions[transition[1]];\n    if (action) {\n      newChar = transition[2];\n      newChar = newChar === undefined ? c : newChar;\n      if (action() === false) {\n        return;\n      }\n    }\n\n    if (mode === AFTER_PATH) {\n      keys.raw = path;\n      return keys;\n    }\n  }\n}\n\n/**\n * External parse that check for a cache hit first\n *\n * @param {String} path\n * @return {Array|undefined}\n */\n\nfunction parsePath(path) {\n  var hit = pathCache.get(path);\n  if (!hit) {\n    hit = parse(path);\n    if (hit) {\n      pathCache.put(path, hit);\n    }\n  }\n  return hit;\n}\n\n/**\n * Get from an object from a path string\n *\n * @param {Object} obj\n * @param {String} path\n */\n\nfunction getPath(obj, path) {\n  return parseExpression$1(path).get(obj);\n}\n\n/**\n * Set on an object from a path\n *\n * @param {Object} obj\n * @param {String | Array} path\n * @param {*} val\n */\n\nfunction setPath(obj, path, val) {\n  var original = obj;\n  if (typeof path === 'string') {\n    path = parse(path);\n  }\n  if (!path || !isObject(obj)) {\n    return false;\n  }\n  var last, key;\n  for (var i = 0, l = path.length; i < l; i++) {\n    last = obj;\n    key = path[i];\n    if (key.charAt(0) === '*') {\n      key = parseExpression$1(key.slice(1)).get.call(original, original);\n    }\n    if (i < l - 1) {\n      obj = obj[key];\n      if (!isObject(obj)) {\n        obj = {};\n        if ('production' !== 'production' && last._isVue) {}\n        set(last, key, obj);\n      }\n    } else {\n      if (isArray(obj)) {\n        obj.$set(key, val);\n      } else if (key in obj) {\n        obj[key] = val;\n      } else {\n        if ('production' !== 'production' && obj._isVue) {}\n        set(obj, key, val);\n      }\n    }\n  }\n  return true;\n}\n\nvar path = Object.freeze({\n  parsePath: parsePath,\n  getPath: getPath,\n  setPath: setPath\n});\n\nvar expressionCache = new Cache(1000);\n\nvar allowedKeywords = 'Math,Date,this,true,false,null,undefined,Infinity,NaN,' + 'isNaN,isFinite,decodeURI,decodeURIComponent,encodeURI,' + 'encodeURIComponent,parseInt,parseFloat';\nvar allowedKeywordsRE = new RegExp('^(' + allowedKeywords.replace(/,/g, '\\\\b|') + '\\\\b)');\n\n// keywords that don't make sense inside expressions\nvar improperKeywords = 'break,case,class,catch,const,continue,debugger,default,' + 'delete,do,else,export,extends,finally,for,function,if,' + 'import,in,instanceof,let,return,super,switch,throw,try,' + 'var,while,with,yield,enum,await,implements,package,' + 'protected,static,interface,private,public';\nvar improperKeywordsRE = new RegExp('^(' + improperKeywords.replace(/,/g, '\\\\b|') + '\\\\b)');\n\nvar wsRE = /\\s/g;\nvar newlineRE = /\\n/g;\nvar saveRE = /[\\{,]\\s*[\\w\\$_]+\\s*:|('(?:[^'\\\\]|\\\\.)*'|\"(?:[^\"\\\\]|\\\\.)*\"|`(?:[^`\\\\]|\\\\.)*\\$\\{|\\}(?:[^`\\\\\"']|\\\\.)*`|`(?:[^`\\\\]|\\\\.)*`)|new |typeof |void /g;\nvar restoreRE = /\"(\\d+)\"/g;\nvar pathTestRE = /^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*|\\['.*?'\\]|\\[\".*?\"\\]|\\[\\d+\\]|\\[[A-Za-z_$][\\w$]*\\])*$/;\nvar identRE = /[^\\w$\\.](?:[A-Za-z_$][\\w$]*)/g;\nvar literalValueRE$1 = /^(?:true|false|null|undefined|Infinity|NaN)$/;\n\nfunction noop() {}\n\n/**\n * Save / Rewrite / Restore\n *\n * When rewriting paths found in an expression, it is\n * possible for the same letter sequences to be found in\n * strings and Object literal property keys. Therefore we\n * remove and store these parts in a temporary array, and\n * restore them after the path rewrite.\n */\n\nvar saved = [];\n\n/**\n * Save replacer\n *\n * The save regex can match two possible cases:\n * 1. An opening object literal\n * 2. A string\n * If matched as a plain string, we need to escape its\n * newlines, since the string needs to be preserved when\n * generating the function body.\n *\n * @param {String} str\n * @param {String} isString - str if matched as a string\n * @return {String} - placeholder with index\n */\n\nfunction save(str, isString) {\n  var i = saved.length;\n  saved[i] = isString ? str.replace(newlineRE, '\\\\n') : str;\n  return '\"' + i + '\"';\n}\n\n/**\n * Path rewrite replacer\n *\n * @param {String} raw\n * @return {String}\n */\n\nfunction rewrite(raw) {\n  var c = raw.charAt(0);\n  var path = raw.slice(1);\n  if (allowedKeywordsRE.test(path)) {\n    return raw;\n  } else {\n    path = path.indexOf('\"') > -1 ? path.replace(restoreRE, restore) : path;\n    return c + 'scope.' + path;\n  }\n}\n\n/**\n * Restore replacer\n *\n * @param {String} str\n * @param {String} i - matched save index\n * @return {String}\n */\n\nfunction restore(str, i) {\n  return saved[i];\n}\n\n/**\n * Rewrite an expression, prefixing all path accessors with\n * `scope.` and generate getter/setter functions.\n *\n * @param {String} exp\n * @return {Function}\n */\n\nfunction compileGetter(exp) {\n  if (improperKeywordsRE.test(exp)) {\n    'production' !== 'production' && warn('Avoid using reserved keywords in expression: ' + exp);\n  }\n  // reset state\n  saved.length = 0;\n  // save strings and object literal keys\n  var body = exp.replace(saveRE, save).replace(wsRE, '');\n  // rewrite all paths\n  // pad 1 space here because the regex matches 1 extra char\n  body = (' ' + body).replace(identRE, rewrite).replace(restoreRE, restore);\n  return makeGetterFn(body);\n}\n\n/**\n * Build a getter function. Requires eval.\n *\n * We isolate the try/catch so it doesn't affect the\n * optimization of the parse function when it is not called.\n *\n * @param {String} body\n * @return {Function|undefined}\n */\n\nfunction makeGetterFn(body) {\n  try {\n    var fn = index$1$1.Function('scope', 'Math', 'return ' + body);\n    return function (scope) {\n      return fn.call(this, scope, Math);\n    };\n  } catch (e) {\n    if ('production' !== 'production') {}\n    return noop;\n  }\n}\n\n/**\n * Compile a setter function for the expression.\n *\n * @param {String} exp\n * @return {Function|undefined}\n */\n\nfunction compileSetter(exp) {\n  var path = parsePath(exp);\n  if (path) {\n    return function (scope, val) {\n      setPath(scope, path, val);\n    };\n  } else {\n    'production' !== 'production' && warn('Invalid setter expression: ' + exp);\n  }\n}\n\n/**\n * Parse an expression into re-written getter/setters.\n *\n * @param {String} exp\n * @param {Boolean} needSet\n * @return {Function}\n */\n\nfunction parseExpression$1(exp, needSet) {\n  exp = exp.trim();\n  // try cache\n  var hit = expressionCache.get(exp);\n  if (hit) {\n    if (needSet && !hit.set) {\n      hit.set = compileSetter(hit.exp);\n    }\n    return hit;\n  }\n  var res = { exp: exp };\n  res.get = isSimplePath(exp) && exp.indexOf('[') < 0\n  // optimized super simple getter\n  ? makeGetterFn('scope.' + exp)\n  // dynamic getter\n  : compileGetter(exp);\n  if (needSet) {\n    res.set = compileSetter(exp);\n  }\n  expressionCache.put(exp, res);\n  return res;\n}\n\n/**\n * Check if an expression is a simple path.\n *\n * @param {String} exp\n * @return {Boolean}\n */\n\nfunction isSimplePath(exp) {\n  return pathTestRE.test(exp) &&\n  // don't treat literal values as paths\n  !literalValueRE$1.test(exp) &&\n  // Math constants e.g. Math.PI, Math.E etc.\n  exp.slice(0, 5) !== 'Math.';\n}\n\nvar expression = Object.freeze({\n  parseExpression: parseExpression$1,\n  isSimplePath: isSimplePath\n});\n\n// we have two separate queues: one for directive updates\n// and one for user watcher registered via $watch().\n// we want to guarantee directive updates to be called\n// before user watchers so that when user watchers are\n// triggered, the DOM would have already been in updated\n// state.\n\nvar queue = [];\nvar userQueue = [];\nvar has = {};\nvar circular = {};\nvar waiting = false;\n\n/**\n * Reset the batcher's state.\n */\n\nfunction resetBatcherState() {\n  queue.length = 0;\n  userQueue.length = 0;\n  has = {};\n  circular = {};\n  waiting = false;\n}\n\n/**\n * Flush both queues and run the watchers.\n */\n\nfunction flushBatcherQueue() {\n  var _again = true;\n\n  _function: while (_again) {\n    _again = false;\n\n    runBatcherQueue(queue);\n    runBatcherQueue(userQueue);\n    // user watchers triggered more watchers,\n    // keep flushing until it depletes\n    if (queue.length) {\n      _again = true;\n      continue _function;\n    }\n    // dev tool hook\n    /* istanbul ignore if */\n    if (devtools && config.devtools) {\n      devtools.emit('flush');\n    }\n    resetBatcherState();\n  }\n}\n\n/**\n * Run the watchers in a single queue.\n *\n * @param {Array} queue\n */\n\nfunction runBatcherQueue(queue) {\n  // do not cache length because more watchers might be pushed\n  // as we run existing watchers\n  for (var i = 0; i < queue.length; i++) {\n    var watcher = queue[i];\n    var id = watcher.id;\n    has[id] = null;\n    watcher.run();\n    // in dev build, check and stop circular updates.\n    if ('production' !== 'production' && has[id] != null) {}\n  }\n  queue.length = 0;\n}\n\n/**\n * Push a watcher into the watcher queue.\n * Jobs with duplicate IDs will be skipped unless it's\n * pushed when the queue is being flushed.\n *\n * @param {Watcher} watcher\n *   properties:\n *   - {Number} id\n *   - {Function} run\n */\n\nfunction pushWatcher(watcher) {\n  var id = watcher.id;\n  if (has[id] == null) {\n    // push watcher into appropriate queue\n    var q = watcher.user ? userQueue : queue;\n    has[id] = q.length;\n    q.push(watcher);\n    // queue the flush\n    if (!waiting) {\n      waiting = true;\n      nextTick(flushBatcherQueue);\n    }\n  }\n}\n\nvar uid$2 = 0;\n\n/**\n * A watcher parses an expression, collects dependencies,\n * and fires callback when the expression value changes.\n * This is used for both the $watch() api and directives.\n *\n * @param {Vue} vm\n * @param {String|Function} expOrFn\n * @param {Function} cb\n * @param {Object} options\n *                 - {Array} filters\n *                 - {Boolean} twoWay\n *                 - {Boolean} deep\n *                 - {Boolean} user\n *                 - {Boolean} sync\n *                 - {Boolean} lazy\n *                 - {Function} [preProcess]\n *                 - {Function} [postProcess]\n * @constructor\n */\nfunction Watcher(vm, expOrFn, cb, options) {\n  // mix in options\n  if (options) {\n    extend(this, options);\n  }\n  var isFn = typeof expOrFn === 'function';\n  this.vm = vm;\n  vm._watchers.push(this);\n  this.expression = expOrFn;\n  this.cb = cb;\n  this.id = ++uid$2; // uid for batching\n  this.active = true;\n  this.dirty = this.lazy; // for lazy watchers\n  this.deps = [];\n  this.newDeps = [];\n  this.depIds = new _Set();\n  this.newDepIds = new _Set();\n  this.prevError = null; // for async error stacks\n  // parse expression for getter/setter\n  if (isFn) {\n    this.getter = expOrFn;\n    this.setter = undefined;\n  } else {\n    var res = parseExpression$1(expOrFn, this.twoWay);\n    this.getter = res.get;\n    this.setter = res.set;\n  }\n  this.value = this.lazy ? undefined : this.get();\n  // state for avoiding false triggers for deep and Array\n  // watchers during vm._digest()\n  this.queued = this.shallow = false;\n}\n\n/**\n * Evaluate the getter, and re-collect dependencies.\n */\n\nWatcher.prototype.get = function () {\n  this.beforeGet();\n  var scope = this.scope || this.vm;\n  var value;\n  try {\n    value = this.getter.call(scope, scope);\n  } catch (e) {\n    if ('production' !== 'production' && config.warnExpressionErrors) {}\n  }\n  // \"touch\" every property so they are all tracked as\n  // dependencies for deep watching\n  if (this.deep) {\n    traverse(value);\n  }\n  if (this.preProcess) {\n    value = this.preProcess(value);\n  }\n  if (this.filters) {\n    value = scope._applyFilters(value, null, this.filters, false);\n  }\n  if (this.postProcess) {\n    value = this.postProcess(value);\n  }\n  this.afterGet();\n  return value;\n};\n\n/**\n * Set the corresponding value with the setter.\n *\n * @param {*} value\n */\n\nWatcher.prototype.set = function (value) {\n  var scope = this.scope || this.vm;\n  if (this.filters) {\n    value = scope._applyFilters(value, this.value, this.filters, true);\n  }\n  try {\n    this.setter.call(scope, scope, value);\n  } catch (e) {\n    if ('production' !== 'production' && config.warnExpressionErrors) {}\n  }\n  // two-way sync for v-for alias\n  var forContext = scope.$forContext;\n  if (forContext && forContext.alias === this.expression) {\n    if (forContext.filters) {\n      'production' !== 'production' && warn('It seems you are using two-way binding on ' + 'a v-for alias (' + this.expression + '), and the ' + 'v-for has filters. This will not work properly. ' + 'Either remove the filters or use an array of ' + 'objects and bind to object properties instead.', this.vm);\n      return;\n    }\n    forContext._withLock(function () {\n      if (scope.$key) {\n        // original is an object\n        forContext.rawValue[scope.$key] = value;\n      } else {\n        forContext.rawValue.$set(scope.$index, value);\n      }\n    });\n  }\n};\n\n/**\n * Prepare for dependency collection.\n */\n\nWatcher.prototype.beforeGet = function () {\n  Dep.target = this;\n};\n\n/**\n * Add a dependency to this directive.\n *\n * @param {Dep} dep\n */\n\nWatcher.prototype.addDep = function (dep) {\n  var id = dep.id;\n  if (!this.newDepIds.has(id)) {\n    this.newDepIds.add(id);\n    this.newDeps.push(dep);\n    if (!this.depIds.has(id)) {\n      dep.addSub(this);\n    }\n  }\n};\n\n/**\n * Clean up for dependency collection.\n */\n\nWatcher.prototype.afterGet = function () {\n  Dep.target = null;\n  var i = this.deps.length;\n  while (i--) {\n    var dep = this.deps[i];\n    if (!this.newDepIds.has(dep.id)) {\n      dep.removeSub(this);\n    }\n  }\n  var tmp = this.depIds;\n  this.depIds = this.newDepIds;\n  this.newDepIds = tmp;\n  this.newDepIds.clear();\n  tmp = this.deps;\n  this.deps = this.newDeps;\n  this.newDeps = tmp;\n  this.newDeps.length = 0;\n};\n\n/**\n * Subscriber interface.\n * Will be called when a dependency changes.\n *\n * @param {Boolean} shallow\n */\n\nWatcher.prototype.update = function (shallow) {\n  if (this.lazy) {\n    this.dirty = true;\n  } else if (this.sync || !config.async) {\n    this.run();\n  } else {\n    // if queued, only overwrite shallow with non-shallow,\n    // but not the other way around.\n    this.shallow = this.queued ? shallow ? this.shallow : false : !!shallow;\n    this.queued = true;\n    // record before-push error stack in debug mode\n    /* istanbul ignore if */\n    if ('production' !== 'production' && config.debug) {}\n    pushWatcher(this);\n  }\n};\n\n/**\n * Batcher job interface.\n * Will be called by the batcher.\n */\n\nWatcher.prototype.run = function () {\n  if (this.active) {\n    var value = this.get();\n    if (value !== this.value ||\n    // Deep watchers and watchers on Object/Arrays should fire even\n    // when the value is the same, because the value may\n    // have mutated; but only do so if this is a\n    // non-shallow update (caused by a vm digest).\n    (isObject(value) || this.deep) && !this.shallow) {\n      // set new value\n      var oldValue = this.value;\n      this.value = value;\n      // in debug + async mode, when a watcher callbacks\n      // throws, we also throw the saved before-push error\n      // so the full cross-tick stack trace is available.\n      var prevError = this.prevError;\n      /* istanbul ignore if */\n      if ('production' !== 'production' && config.debug && prevError) {} else {\n        this.cb.call(this.vm, value, oldValue);\n      }\n    }\n    this.queued = this.shallow = false;\n  }\n};\n\n/**\n * Evaluate the value of the watcher.\n * This only gets called for lazy watchers.\n */\n\nWatcher.prototype.evaluate = function () {\n  // avoid overwriting another watcher that is being\n  // collected.\n  var current = Dep.target;\n  this.value = this.get();\n  this.dirty = false;\n  Dep.target = current;\n};\n\n/**\n * Depend on all deps collected by this watcher.\n */\n\nWatcher.prototype.depend = function () {\n  var i = this.deps.length;\n  while (i--) {\n    this.deps[i].depend();\n  }\n};\n\n/**\n * Remove self from all dependencies' subcriber list.\n */\n\nWatcher.prototype.teardown = function () {\n  if (this.active) {\n    // remove self from vm's watcher list\n    // this is a somewhat expensive operation so we skip it\n    // if the vm is being destroyed or is performing a v-for\n    // re-render (the watcher list is then filtered by v-for).\n    if (!this.vm._isBeingDestroyed && !this.vm._vForRemoving) {\n      this.vm._watchers.$remove(this);\n    }\n    var i = this.deps.length;\n    while (i--) {\n      this.deps[i].removeSub(this);\n    }\n    this.active = false;\n    this.vm = this.cb = this.value = null;\n  }\n};\n\n/**\n * Recrusively traverse an object to evoke all converted\n * getters, so that every nested property inside the object\n * is collected as a \"deep\" dependency.\n *\n * @param {*} val\n */\n\nvar seenObjects = new _Set();\nfunction traverse(val, seen) {\n  var i = undefined,\n      keys = undefined;\n  if (!seen) {\n    seen = seenObjects;\n    seen.clear();\n  }\n  var isA = isArray(val);\n  var isO = isObject(val);\n  if ((isA || isO) && Object.isExtensible(val)) {\n    if (val.__ob__) {\n      var depId = val.__ob__.dep.id;\n      if (seen.has(depId)) {\n        return;\n      } else {\n        seen.add(depId);\n      }\n    }\n    if (isA) {\n      i = val.length;\n      while (i--) traverse(val[i], seen);\n    } else if (isO) {\n      keys = Object.keys(val);\n      i = keys.length;\n      while (i--) traverse(val[keys[i]], seen);\n    }\n  }\n}\n\nvar text$1 = {\n\n  bind: function bind() {\n    this.attr = this.el.nodeType === 3 ? 'data' : 'textContent';\n  },\n\n  update: function update(value) {\n    this.el[this.attr] = _toString(value);\n  }\n};\n\nvar templateCache = new Cache(1000);\nvar idSelectorCache = new Cache(1000);\n\nvar map = {\n  efault: [0, '', ''],\n  legend: [1, '<fieldset>', '</fieldset>'],\n  tr: [2, '<table><tbody>', '</tbody></table>'],\n  col: [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>']\n};\n\nmap.td = map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>'];\n\nmap.option = map.optgroup = [1, '<select multiple=\"multiple\">', '</select>'];\n\nmap.thead = map.tbody = map.colgroup = map.caption = map.tfoot = [1, '<table>', '</table>'];\n\nmap.g = map.defs = map.symbol = map.use = map.image = map.text = map.circle = map.ellipse = map.line = map.path = map.polygon = map.polyline = map.rect = [1, '<svg ' + 'xmlns=\"http://www.w3.org/2000/svg\" ' + 'xmlns:xlink=\"http://www.w3.org/1999/xlink\" ' + 'xmlns:ev=\"http://www.w3.org/2001/xml-events\"' + 'version=\"1.1\">', '</svg>'];\n\n/**\n * Check if a node is a supported template node with a\n * DocumentFragment content.\n *\n * @param {Node} node\n * @return {Boolean}\n */\n\nfunction isRealTemplate(node) {\n  return isTemplate(node) && isFragment(node.content);\n}\n\nvar tagRE$1 = /<([\\w:-]+)/;\nvar entityRE = /&#?\\w+?;/;\nvar commentRE = /<!--/;\n\n/**\n * Convert a string template to a DocumentFragment.\n * Determines correct wrapping by tag types. Wrapping\n * strategy found in jQuery & component/domify.\n *\n * @param {String} templateString\n * @param {Boolean} raw\n * @return {DocumentFragment}\n */\n\nfunction stringToFragment(templateString, raw) {\n  // try a cache hit first\n  var cacheKey = raw ? templateString : templateString.trim();\n  var hit = templateCache.get(cacheKey);\n  if (hit) {\n    return hit;\n  }\n\n  var frag = document.createDocumentFragment();\n  var tagMatch = templateString.match(tagRE$1);\n  var entityMatch = entityRE.test(templateString);\n  var commentMatch = commentRE.test(templateString);\n\n  if (!tagMatch && !entityMatch && !commentMatch) {\n    // text only, return a single text node.\n    frag.appendChild(document.createTextNode(templateString));\n  } else {\n    var tag = tagMatch && tagMatch[1];\n    var wrap = map[tag] || map.efault;\n    var depth = wrap[0];\n    var prefix = wrap[1];\n    var suffix = wrap[2];\n    var node = document.createElement('div');\n\n    node.innerHTML = prefix + templateString + suffix;\n    while (depth--) {\n      node = node.lastChild;\n    }\n\n    var child;\n    /* eslint-disable no-cond-assign */\n    while (child = node.firstChild) {\n      /* eslint-enable no-cond-assign */\n      frag.appendChild(child);\n    }\n  }\n  if (!raw) {\n    trimNode(frag);\n  }\n  templateCache.put(cacheKey, frag);\n  return frag;\n}\n\n/**\n * Convert a template node to a DocumentFragment.\n *\n * @param {Node} node\n * @return {DocumentFragment}\n */\n\nfunction nodeToFragment(node) {\n  // if its a template tag and the browser supports it,\n  // its content is already a document fragment. However, iOS Safari has\n  // bug when using directly cloned template content with touch\n  // events and can cause crashes when the nodes are removed from DOM, so we\n  // have to treat template elements as string templates. (#2805)\n  /* istanbul ignore if */\n  if (isRealTemplate(node)) {\n    return stringToFragment(node.innerHTML);\n  }\n  // script template\n  if (node.tagName === 'SCRIPT') {\n    return stringToFragment(node.textContent);\n  }\n  // normal node, clone it to avoid mutating the original\n  var clonedNode = cloneNode(node);\n  var frag = document.createDocumentFragment();\n  var child;\n  /* eslint-disable no-cond-assign */\n  while (child = clonedNode.firstChild) {\n    /* eslint-enable no-cond-assign */\n    frag.appendChild(child);\n  }\n  trimNode(frag);\n  return frag;\n}\n\n// Test for the presence of the Safari template cloning bug\n// https://bugs.webkit.org/showug.cgi?id=137755\nvar hasBrokenTemplate = (function () {\n  /* istanbul ignore else */\n  if (inBrowser) {\n    var a = document.createElement('div');\n    a.innerHTML = '<template>1</template>';\n    return !a.cloneNode(true).firstChild.innerHTML;\n  } else {\n    return false;\n  }\n})();\n\n// Test for IE10/11 textarea placeholder clone bug\nvar hasTextareaCloneBug = (function () {\n  /* istanbul ignore else */\n  if (inBrowser) {\n    var t = document.createElement('textarea');\n    t.placeholder = 't';\n    return t.cloneNode(true).value === 't';\n  } else {\n    return false;\n  }\n})();\n\n/**\n * 1. Deal with Safari cloning nested <template> bug by\n *    manually cloning all template instances.\n * 2. Deal with IE10/11 textarea placeholder bug by setting\n *    the correct value after cloning.\n *\n * @param {Element|DocumentFragment} node\n * @return {Element|DocumentFragment}\n */\n\nfunction cloneNode(node) {\n  /* istanbul ignore if */\n  if (!node.querySelectorAll) {\n    return node.cloneNode();\n  }\n  var res = node.cloneNode(true);\n  var i, original, cloned;\n  /* istanbul ignore if */\n  if (hasBrokenTemplate) {\n    var tempClone = res;\n    if (isRealTemplate(node)) {\n      node = node.content;\n      tempClone = res.content;\n    }\n    original = node.querySelectorAll('template');\n    if (original.length) {\n      cloned = tempClone.querySelectorAll('template');\n      i = cloned.length;\n      while (i--) {\n        cloned[i].parentNode.replaceChild(cloneNode(original[i]), cloned[i]);\n      }\n    }\n  }\n  /* istanbul ignore if */\n  if (hasTextareaCloneBug) {\n    if (node.tagName === 'TEXTAREA') {\n      res.value = node.value;\n    } else {\n      original = node.querySelectorAll('textarea');\n      if (original.length) {\n        cloned = res.querySelectorAll('textarea');\n        i = cloned.length;\n        while (i--) {\n          cloned[i].value = original[i].value;\n        }\n      }\n    }\n  }\n  return res;\n}\n\n/**\n * Process the template option and normalizes it into a\n * a DocumentFragment that can be used as a partial or a\n * instance template.\n *\n * @param {*} template\n *        Possible values include:\n *        - DocumentFragment object\n *        - Node object of type Template\n *        - id selector: '#some-template-id'\n *        - template string: '<div><span>{{msg}}</span></div>'\n * @param {Boolean} shouldClone\n * @param {Boolean} raw\n *        inline HTML interpolation. Do not check for id\n *        selector and keep whitespace in the string.\n * @return {DocumentFragment|undefined}\n */\n\nfunction parseTemplate(template, shouldClone, raw) {\n  var node, frag;\n\n  // if the template is already a document fragment,\n  // do nothing\n  if (isFragment(template)) {\n    trimNode(template);\n    return shouldClone ? cloneNode(template) : template;\n  }\n\n  if (typeof template === 'string') {\n    // id selector\n    if (!raw && template.charAt(0) === '#') {\n      // id selector can be cached too\n      frag = idSelectorCache.get(template);\n      if (!frag) {\n        node = document.getElementById(template.slice(1));\n        if (node) {\n          frag = nodeToFragment(node);\n          // save selector to cache\n          idSelectorCache.put(template, frag);\n        }\n      }\n    } else {\n      // normal string template\n      frag = stringToFragment(template, raw);\n    }\n  } else if (template.nodeType) {\n    // a direct node\n    frag = nodeToFragment(template);\n  }\n\n  return frag && shouldClone ? cloneNode(frag) : frag;\n}\n\nvar template = Object.freeze({\n  cloneNode: cloneNode,\n  parseTemplate: parseTemplate\n});\n\nvar html = {\n\n  bind: function bind() {\n    // a comment node means this is a binding for\n    // {{{ inline unescaped html }}}\n    if (this.el.nodeType === 8) {\n      // hold nodes\n      this.nodes = [];\n      // replace the placeholder with proper anchor\n      this.anchor = createAnchor('v-html');\n      replace(this.el, this.anchor);\n    }\n  },\n\n  update: function update(value) {\n    value = _toString(value);\n    if (this.nodes) {\n      this.swap(value);\n    } else {\n      this.el.innerHTML = value;\n    }\n  },\n\n  swap: function swap(value) {\n    // remove old nodes\n    var i = this.nodes.length;\n    while (i--) {\n      remove(this.nodes[i]);\n    }\n    // convert new value to a fragment\n    // do not attempt to retrieve from id selector\n    var frag = parseTemplate(value, true, true);\n    // save a reference to these nodes so we can remove later\n    this.nodes = toArray(frag.childNodes);\n    before(frag, this.anchor);\n  }\n};\n\n/**\n * Abstraction for a partially-compiled fragment.\n * Can optionally compile content with a child scope.\n *\n * @param {Function} linker\n * @param {Vue} vm\n * @param {DocumentFragment} frag\n * @param {Vue} [host]\n * @param {Object} [scope]\n * @param {Fragment} [parentFrag]\n */\nfunction Fragment(linker, vm, frag, host, scope, parentFrag) {\n  this.children = [];\n  this.childFrags = [];\n  this.vm = vm;\n  this.scope = scope;\n  this.inserted = false;\n  this.parentFrag = parentFrag;\n  if (parentFrag) {\n    parentFrag.childFrags.push(this);\n  }\n  this.unlink = linker(vm, frag, host, scope, this);\n  var single = this.single = frag.childNodes.length === 1 &&\n  // do not go single mode if the only node is an anchor\n  !frag.childNodes[0].__v_anchor;\n  if (single) {\n    this.node = frag.childNodes[0];\n    this.before = singleBefore;\n    this.remove = singleRemove;\n  } else {\n    this.node = createAnchor('fragment-start');\n    this.end = createAnchor('fragment-end');\n    this.frag = frag;\n    prepend(this.node, frag);\n    frag.appendChild(this.end);\n    this.before = multiBefore;\n    this.remove = multiRemove;\n  }\n  this.node.__v_frag = this;\n}\n\n/**\n * Call attach/detach for all components contained within\n * this fragment. Also do so recursively for all child\n * fragments.\n *\n * @param {Function} hook\n */\n\nFragment.prototype.callHook = function (hook) {\n  var i, l;\n  for (i = 0, l = this.childFrags.length; i < l; i++) {\n    this.childFrags[i].callHook(hook);\n  }\n  for (i = 0, l = this.children.length; i < l; i++) {\n    hook(this.children[i]);\n  }\n};\n\n/**\n * Insert fragment before target, single node version\n *\n * @param {Node} target\n * @param {Boolean} withTransition\n */\n\nfunction singleBefore(target, withTransition) {\n  this.inserted = true;\n  var method = withTransition !== false ? beforeWithTransition : before;\n  method(this.node, target, this.vm);\n  if (inDoc(this.node)) {\n    this.callHook(attach);\n  }\n}\n\n/**\n * Remove fragment, single node version\n */\n\nfunction singleRemove() {\n  this.inserted = false;\n  var shouldCallRemove = inDoc(this.node);\n  var self = this;\n  this.beforeRemove();\n  removeWithTransition(this.node, this.vm, function () {\n    if (shouldCallRemove) {\n      self.callHook(detach);\n    }\n    self.destroy();\n  });\n}\n\n/**\n * Insert fragment before target, multi-nodes version\n *\n * @param {Node} target\n * @param {Boolean} withTransition\n */\n\nfunction multiBefore(target, withTransition) {\n  this.inserted = true;\n  var vm = this.vm;\n  var method = withTransition !== false ? beforeWithTransition : before;\n  mapNodeRange(this.node, this.end, function (node) {\n    method(node, target, vm);\n  });\n  if (inDoc(this.node)) {\n    this.callHook(attach);\n  }\n}\n\n/**\n * Remove fragment, multi-nodes version\n */\n\nfunction multiRemove() {\n  this.inserted = false;\n  var self = this;\n  var shouldCallRemove = inDoc(this.node);\n  this.beforeRemove();\n  removeNodeRange(this.node, this.end, this.vm, this.frag, function () {\n    if (shouldCallRemove) {\n      self.callHook(detach);\n    }\n    self.destroy();\n  });\n}\n\n/**\n * Prepare the fragment for removal.\n */\n\nFragment.prototype.beforeRemove = function () {\n  var i, l;\n  for (i = 0, l = this.childFrags.length; i < l; i++) {\n    // call the same method recursively on child\n    // fragments, depth-first\n    this.childFrags[i].beforeRemove(false);\n  }\n  for (i = 0, l = this.children.length; i < l; i++) {\n    // Call destroy for all contained instances,\n    // with remove:false and defer:true.\n    // Defer is necessary because we need to\n    // keep the children to call detach hooks\n    // on them.\n    this.children[i].$destroy(false, true);\n  }\n  var dirs = this.unlink.dirs;\n  for (i = 0, l = dirs.length; i < l; i++) {\n    // disable the watchers on all the directives\n    // so that the rendered content stays the same\n    // during removal.\n    dirs[i]._watcher && dirs[i]._watcher.teardown();\n  }\n};\n\n/**\n * Destroy the fragment.\n */\n\nFragment.prototype.destroy = function () {\n  if (this.parentFrag) {\n    this.parentFrag.childFrags.$remove(this);\n  }\n  this.node.__v_frag = null;\n  this.unlink();\n};\n\n/**\n * Call attach hook for a Vue instance.\n *\n * @param {Vue} child\n */\n\nfunction attach(child) {\n  if (!child._isAttached && inDoc(child.$el)) {\n    child._callHook('attached');\n  }\n}\n\n/**\n * Call detach hook for a Vue instance.\n *\n * @param {Vue} child\n */\n\nfunction detach(child) {\n  if (child._isAttached && !inDoc(child.$el)) {\n    child._callHook('detached');\n  }\n}\n\nvar linkerCache = new Cache(5000);\n\n/**\n * A factory that can be used to create instances of a\n * fragment. Caches the compiled linker if possible.\n *\n * @param {Vue} vm\n * @param {Element|String} el\n */\nfunction FragmentFactory(vm, el) {\n  this.vm = vm;\n  var template;\n  var isString = typeof el === 'string';\n  if (isString || isTemplate(el) && !el.hasAttribute('v-if')) {\n    template = parseTemplate(el, true);\n  } else {\n    template = document.createDocumentFragment();\n    template.appendChild(el);\n  }\n  this.template = template;\n  // linker can be cached, but only for components\n  var linker;\n  var cid = vm.constructor.cid;\n  if (cid > 0) {\n    var cacheId = cid + (isString ? el : getOuterHTML(el));\n    linker = linkerCache.get(cacheId);\n    if (!linker) {\n      linker = compile(template, vm.$options, true);\n      linkerCache.put(cacheId, linker);\n    }\n  } else {\n    linker = compile(template, vm.$options, true);\n  }\n  this.linker = linker;\n}\n\n/**\n * Create a fragment instance with given host and scope.\n *\n * @param {Vue} host\n * @param {Object} scope\n * @param {Fragment} parentFrag\n */\n\nFragmentFactory.prototype.create = function (host, scope, parentFrag) {\n  var frag = cloneNode(this.template);\n  return new Fragment(this.linker, this.vm, frag, host, scope, parentFrag);\n};\n\nvar ON = 700;\nvar MODEL = 800;\nvar BIND = 850;\nvar TRANSITION = 1100;\nvar EL = 1500;\nvar COMPONENT = 1500;\nvar PARTIAL = 1750;\nvar IF = 2100;\nvar FOR = 2200;\nvar SLOT = 2300;\n\nvar uid$3 = 0;\n\nvar vFor = {\n\n  priority: FOR,\n  terminal: true,\n\n  params: ['track-by', 'stagger', 'enter-stagger', 'leave-stagger'],\n\n  bind: function bind() {\n    // support \"item in/of items\" syntax\n    var inMatch = this.expression.match(/(.*) (?:in|of) (.*)/);\n    if (inMatch) {\n      var itMatch = inMatch[1].match(/\\((.*),(.*)\\)/);\n      if (itMatch) {\n        this.iterator = itMatch[1].trim();\n        this.alias = itMatch[2].trim();\n      } else {\n        this.alias = inMatch[1].trim();\n      }\n      this.expression = inMatch[2];\n    }\n\n    if (!this.alias) {\n      'production' !== 'production' && warn('Invalid v-for expression \"' + this.descriptor.raw + '\": ' + 'alias is required.', this.vm);\n      return;\n    }\n\n    // uid as a cache identifier\n    this.id = '__v-for__' + ++uid$3;\n\n    // check if this is an option list,\n    // so that we know if we need to update the <select>'s\n    // v-model when the option list has changed.\n    // because v-model has a lower priority than v-for,\n    // the v-model is not bound here yet, so we have to\n    // retrive it in the actual updateModel() function.\n    var tag = this.el.tagName;\n    this.isOption = (tag === 'OPTION' || tag === 'OPTGROUP') && this.el.parentNode.tagName === 'SELECT';\n\n    // setup anchor nodes\n    this.start = createAnchor('v-for-start');\n    this.end = createAnchor('v-for-end');\n    replace(this.el, this.end);\n    before(this.start, this.end);\n\n    // cache\n    this.cache = Object.create(null);\n\n    // fragment factory\n    this.factory = new FragmentFactory(this.vm, this.el);\n  },\n\n  update: function update(data) {\n    this.diff(data);\n    this.updateRef();\n    this.updateModel();\n  },\n\n  /**\n   * Diff, based on new data and old data, determine the\n   * minimum amount of DOM manipulations needed to make the\n   * DOM reflect the new data Array.\n   *\n   * The algorithm diffs the new data Array by storing a\n   * hidden reference to an owner vm instance on previously\n   * seen data. This allows us to achieve O(n) which is\n   * better than a levenshtein distance based algorithm,\n   * which is O(m * n).\n   *\n   * @param {Array} data\n   */\n\n  diff: function diff(data) {\n    // check if the Array was converted from an Object\n    var item = data[0];\n    var convertedFromObject = this.fromObject = isObject(item) && hasOwn(item, '$key') && hasOwn(item, '$value');\n\n    var trackByKey = this.params.trackBy;\n    var oldFrags = this.frags;\n    var frags = this.frags = new Array(data.length);\n    var alias = this.alias;\n    var iterator = this.iterator;\n    var start = this.start;\n    var end = this.end;\n    var inDocument = inDoc(start);\n    var init = !oldFrags;\n    var i, l, frag, key, value, primitive;\n\n    // First pass, go through the new Array and fill up\n    // the new frags array. If a piece of data has a cached\n    // instance for it, we reuse it. Otherwise build a new\n    // instance.\n    for (i = 0, l = data.length; i < l; i++) {\n      item = data[i];\n      key = convertedFromObject ? item.$key : null;\n      value = convertedFromObject ? item.$value : item;\n      primitive = !isObject(value);\n      frag = !init && this.getCachedFrag(value, i, key);\n      if (frag) {\n        // reusable fragment\n        frag.reused = true;\n        // update $index\n        frag.scope.$index = i;\n        // update $key\n        if (key) {\n          frag.scope.$key = key;\n        }\n        // update iterator\n        if (iterator) {\n          frag.scope[iterator] = key !== null ? key : i;\n        }\n        // update data for track-by, object repeat &\n        // primitive values.\n        if (trackByKey || convertedFromObject || primitive) {\n          withoutConversion(function () {\n            frag.scope[alias] = value;\n          });\n        }\n      } else {\n        // new instance\n        frag = this.create(value, alias, i, key);\n        frag.fresh = !init;\n      }\n      frags[i] = frag;\n      if (init) {\n        frag.before(end);\n      }\n    }\n\n    // we're done for the initial render.\n    if (init) {\n      return;\n    }\n\n    // Second pass, go through the old fragments and\n    // destroy those who are not reused (and remove them\n    // from cache)\n    var removalIndex = 0;\n    var totalRemoved = oldFrags.length - frags.length;\n    // when removing a large number of fragments, watcher removal\n    // turns out to be a perf bottleneck, so we batch the watcher\n    // removals into a single filter call!\n    this.vm._vForRemoving = true;\n    for (i = 0, l = oldFrags.length; i < l; i++) {\n      frag = oldFrags[i];\n      if (!frag.reused) {\n        this.deleteCachedFrag(frag);\n        this.remove(frag, removalIndex++, totalRemoved, inDocument);\n      }\n    }\n    this.vm._vForRemoving = false;\n    if (removalIndex) {\n      this.vm._watchers = this.vm._watchers.filter(function (w) {\n        return w.active;\n      });\n    }\n\n    // Final pass, move/insert new fragments into the\n    // right place.\n    var targetPrev, prevEl, currentPrev;\n    var insertionIndex = 0;\n    for (i = 0, l = frags.length; i < l; i++) {\n      frag = frags[i];\n      // this is the frag that we should be after\n      targetPrev = frags[i - 1];\n      prevEl = targetPrev ? targetPrev.staggerCb ? targetPrev.staggerAnchor : targetPrev.end || targetPrev.node : start;\n      if (frag.reused && !frag.staggerCb) {\n        currentPrev = findPrevFrag(frag, start, this.id);\n        if (currentPrev !== targetPrev && (!currentPrev ||\n        // optimization for moving a single item.\n        // thanks to suggestions by @livoras in #1807\n        findPrevFrag(currentPrev, start, this.id) !== targetPrev)) {\n          this.move(frag, prevEl);\n        }\n      } else {\n        // new instance, or still in stagger.\n        // insert with updated stagger index.\n        this.insert(frag, insertionIndex++, prevEl, inDocument);\n      }\n      frag.reused = frag.fresh = false;\n    }\n  },\n\n  /**\n   * Create a new fragment instance.\n   *\n   * @param {*} value\n   * @param {String} alias\n   * @param {Number} index\n   * @param {String} [key]\n   * @return {Fragment}\n   */\n\n  create: function create(value, alias, index, key) {\n    var host = this._host;\n    // create iteration scope\n    var parentScope = this._scope || this.vm;\n    var scope = Object.create(parentScope);\n    // ref holder for the scope\n    scope.$refs = Object.create(parentScope.$refs);\n    scope.$els = Object.create(parentScope.$els);\n    // make sure point $parent to parent scope\n    scope.$parent = parentScope;\n    // for two-way binding on alias\n    scope.$forContext = this;\n    // define scope properties\n    // important: define the scope alias without forced conversion\n    // so that frozen data structures remain non-reactive.\n    withoutConversion(function () {\n      defineReactive(scope, alias, value);\n    });\n    defineReactive(scope, '$index', index);\n    if (key) {\n      defineReactive(scope, '$key', key);\n    } else if (scope.$key) {\n      // avoid accidental fallback\n      def(scope, '$key', null);\n    }\n    if (this.iterator) {\n      defineReactive(scope, this.iterator, key !== null ? key : index);\n    }\n    var frag = this.factory.create(host, scope, this._frag);\n    frag.forId = this.id;\n    this.cacheFrag(value, frag, index, key);\n    return frag;\n  },\n\n  /**\n   * Update the v-ref on owner vm.\n   */\n\n  updateRef: function updateRef() {\n    var ref = this.descriptor.ref;\n    if (!ref) return;\n    var hash = (this._scope || this.vm).$refs;\n    var refs;\n    if (!this.fromObject) {\n      refs = this.frags.map(findVmFromFrag);\n    } else {\n      refs = {};\n      this.frags.forEach(function (frag) {\n        refs[frag.scope.$key] = findVmFromFrag(frag);\n      });\n    }\n    hash[ref] = refs;\n  },\n\n  /**\n   * For option lists, update the containing v-model on\n   * parent <select>.\n   */\n\n  updateModel: function updateModel() {\n    if (this.isOption) {\n      var parent = this.start.parentNode;\n      var model = parent && parent.__v_model;\n      if (model) {\n        model.forceUpdate();\n      }\n    }\n  },\n\n  /**\n   * Insert a fragment. Handles staggering.\n   *\n   * @param {Fragment} frag\n   * @param {Number} index\n   * @param {Node} prevEl\n   * @param {Boolean} inDocument\n   */\n\n  insert: function insert(frag, index, prevEl, inDocument) {\n    if (frag.staggerCb) {\n      frag.staggerCb.cancel();\n      frag.staggerCb = null;\n    }\n    var staggerAmount = this.getStagger(frag, index, null, 'enter');\n    if (inDocument && staggerAmount) {\n      // create an anchor and insert it synchronously,\n      // so that we can resolve the correct order without\n      // worrying about some elements not inserted yet\n      var anchor = frag.staggerAnchor;\n      if (!anchor) {\n        anchor = frag.staggerAnchor = createAnchor('stagger-anchor');\n        anchor.__v_frag = frag;\n      }\n      after(anchor, prevEl);\n      var op = frag.staggerCb = cancellable(function () {\n        frag.staggerCb = null;\n        frag.before(anchor);\n        remove(anchor);\n      });\n      setTimeout(op, staggerAmount);\n    } else {\n      var target = prevEl.nextSibling;\n      /* istanbul ignore if */\n      if (!target) {\n        // reset end anchor position in case the position was messed up\n        // by an external drag-n-drop library.\n        after(this.end, prevEl);\n        target = this.end;\n      }\n      frag.before(target);\n    }\n  },\n\n  /**\n   * Remove a fragment. Handles staggering.\n   *\n   * @param {Fragment} frag\n   * @param {Number} index\n   * @param {Number} total\n   * @param {Boolean} inDocument\n   */\n\n  remove: function remove(frag, index, total, inDocument) {\n    if (frag.staggerCb) {\n      frag.staggerCb.cancel();\n      frag.staggerCb = null;\n      // it's not possible for the same frag to be removed\n      // twice, so if we have a pending stagger callback,\n      // it means this frag is queued for enter but removed\n      // before its transition started. Since it is already\n      // destroyed, we can just leave it in detached state.\n      return;\n    }\n    var staggerAmount = this.getStagger(frag, index, total, 'leave');\n    if (inDocument && staggerAmount) {\n      var op = frag.staggerCb = cancellable(function () {\n        frag.staggerCb = null;\n        frag.remove();\n      });\n      setTimeout(op, staggerAmount);\n    } else {\n      frag.remove();\n    }\n  },\n\n  /**\n   * Move a fragment to a new position.\n   * Force no transition.\n   *\n   * @param {Fragment} frag\n   * @param {Node} prevEl\n   */\n\n  move: function move(frag, prevEl) {\n    // fix a common issue with Sortable:\n    // if prevEl doesn't have nextSibling, this means it's\n    // been dragged after the end anchor. Just re-position\n    // the end anchor to the end of the container.\n    /* istanbul ignore if */\n    if (!prevEl.nextSibling) {\n      this.end.parentNode.appendChild(this.end);\n    }\n    frag.before(prevEl.nextSibling, false);\n  },\n\n  /**\n   * Cache a fragment using track-by or the object key.\n   *\n   * @param {*} value\n   * @param {Fragment} frag\n   * @param {Number} index\n   * @param {String} [key]\n   */\n\n  cacheFrag: function cacheFrag(value, frag, index, key) {\n    var trackByKey = this.params.trackBy;\n    var cache = this.cache;\n    var primitive = !isObject(value);\n    var id;\n    if (key || trackByKey || primitive) {\n      id = getTrackByKey(index, key, value, trackByKey);\n      if (!cache[id]) {\n        cache[id] = frag;\n      } else if (trackByKey !== '$index') {\n        'production' !== 'production' && this.warnDuplicate(value);\n      }\n    } else {\n      id = this.id;\n      if (hasOwn(value, id)) {\n        if (value[id] === null) {\n          value[id] = frag;\n        } else {\n          'production' !== 'production' && this.warnDuplicate(value);\n        }\n      } else if (Object.isExtensible(value)) {\n        def(value, id, frag);\n      } else if ('production' !== 'production') {}\n    }\n    frag.raw = value;\n  },\n\n  /**\n   * Get a cached fragment from the value/index/key\n   *\n   * @param {*} value\n   * @param {Number} index\n   * @param {String} key\n   * @return {Fragment}\n   */\n\n  getCachedFrag: function getCachedFrag(value, index, key) {\n    var trackByKey = this.params.trackBy;\n    var primitive = !isObject(value);\n    var frag;\n    if (key || trackByKey || primitive) {\n      var id = getTrackByKey(index, key, value, trackByKey);\n      frag = this.cache[id];\n    } else {\n      frag = value[this.id];\n    }\n    if (frag && (frag.reused || frag.fresh)) {\n      'production' !== 'production' && this.warnDuplicate(value);\n    }\n    return frag;\n  },\n\n  /**\n   * Delete a fragment from cache.\n   *\n   * @param {Fragment} frag\n   */\n\n  deleteCachedFrag: function deleteCachedFrag(frag) {\n    var value = frag.raw;\n    var trackByKey = this.params.trackBy;\n    var scope = frag.scope;\n    var index = scope.$index;\n    // fix #948: avoid accidentally fall through to\n    // a parent repeater which happens to have $key.\n    var key = hasOwn(scope, '$key') && scope.$key;\n    var primitive = !isObject(value);\n    if (trackByKey || key || primitive) {\n      var id = getTrackByKey(index, key, value, trackByKey);\n      this.cache[id] = null;\n    } else {\n      value[this.id] = null;\n      frag.raw = null;\n    }\n  },\n\n  /**\n   * Get the stagger amount for an insertion/removal.\n   *\n   * @param {Fragment} frag\n   * @param {Number} index\n   * @param {Number} total\n   * @param {String} type\n   */\n\n  getStagger: function getStagger(frag, index, total, type) {\n    type = type + 'Stagger';\n    var trans = frag.node.__v_trans;\n    var hooks = trans && trans.hooks;\n    var hook = hooks && (hooks[type] || hooks.stagger);\n    return hook ? hook.call(frag, index, total) : index * parseInt(this.params[type] || this.params.stagger, 10);\n  },\n\n  /**\n   * Pre-process the value before piping it through the\n   * filters. This is passed to and called by the watcher.\n   */\n\n  _preProcess: function _preProcess(value) {\n    // regardless of type, store the un-filtered raw value.\n    this.rawValue = value;\n    return value;\n  },\n\n  /**\n   * Post-process the value after it has been piped through\n   * the filters. This is passed to and called by the watcher.\n   *\n   * It is necessary for this to be called during the\n   * watcher's dependency collection phase because we want\n   * the v-for to update when the source Object is mutated.\n   */\n\n  _postProcess: function _postProcess(value) {\n    if (isArray(value)) {\n      return value;\n    } else if (isPlainObject(value)) {\n      // convert plain object to array.\n      var keys = Object.keys(value);\n      var i = keys.length;\n      var res = new Array(i);\n      var key;\n      while (i--) {\n        key = keys[i];\n        res[i] = {\n          $key: key,\n          $value: value[key]\n        };\n      }\n      return res;\n    } else {\n      if (typeof value === 'number' && !isNaN(value)) {\n        value = range(value);\n      }\n      return value || [];\n    }\n  },\n\n  unbind: function unbind() {\n    if (this.descriptor.ref) {\n      (this._scope || this.vm).$refs[this.descriptor.ref] = null;\n    }\n    if (this.frags) {\n      var i = this.frags.length;\n      var frag;\n      while (i--) {\n        frag = this.frags[i];\n        this.deleteCachedFrag(frag);\n        frag.destroy();\n      }\n    }\n  }\n};\n\n/**\n * Helper to find the previous element that is a fragment\n * anchor. This is necessary because a destroyed frag's\n * element could still be lingering in the DOM before its\n * leaving transition finishes, but its inserted flag\n * should have been set to false so we can skip them.\n *\n * If this is a block repeat, we want to make sure we only\n * return frag that is bound to this v-for. (see #929)\n *\n * @param {Fragment} frag\n * @param {Comment|Text} anchor\n * @param {String} id\n * @return {Fragment}\n */\n\nfunction findPrevFrag(frag, anchor, id) {\n  var el = frag.node.previousSibling;\n  /* istanbul ignore if */\n  if (!el) return;\n  frag = el.__v_frag;\n  while ((!frag || frag.forId !== id || !frag.inserted) && el !== anchor) {\n    el = el.previousSibling;\n    /* istanbul ignore if */\n    if (!el) return;\n    frag = el.__v_frag;\n  }\n  return frag;\n}\n\n/**\n * Create a range array from given number.\n *\n * @param {Number} n\n * @return {Array}\n */\n\nfunction range(n) {\n  var i = -1;\n  var ret = new Array(Math.floor(n));\n  while (++i < n) {\n    ret[i] = i;\n  }\n  return ret;\n}\n\n/**\n * Get the track by key for an item.\n *\n * @param {Number} index\n * @param {String} key\n * @param {*} value\n * @param {String} [trackByKey]\n */\n\nfunction getTrackByKey(index, key, value, trackByKey) {\n  return trackByKey ? trackByKey === '$index' ? index : trackByKey.charAt(0).match(/\\w/) ? getPath(value, trackByKey) : value[trackByKey] : key || value;\n}\n\nvar vIf = {\n\n  priority: IF,\n  terminal: true,\n\n  bind: function bind() {\n    var el = this.el;\n    if (!el.__vue__) {\n      // check else block\n      var next = el.nextElementSibling;\n      if (next && getAttr(next, 'v-else') !== null) {\n        remove(next);\n        this.elseEl = next;\n      }\n      // check main block\n      this.anchor = createAnchor('v-if');\n      replace(el, this.anchor);\n    } else {\n      'production' !== 'production' && warn('v-if=\"' + this.expression + '\" cannot be ' + 'used on an instance root element.', this.vm);\n      this.invalid = true;\n    }\n  },\n\n  update: function update(value) {\n    if (this.invalid) return;\n    if (value) {\n      if (!this.frag) {\n        this.insert();\n        this.updateRef(value);\n      }\n    } else {\n      this.updateRef(value);\n      this.remove();\n    }\n  },\n\n  insert: function insert() {\n    if (this.elseFrag) {\n      this.elseFrag.remove();\n      this.elseFrag = null;\n    }\n    // lazy init factory\n    if (!this.factory) {\n      this.factory = new FragmentFactory(this.vm, this.el);\n    }\n    this.frag = this.factory.create(this._host, this._scope, this._frag);\n    this.frag.before(this.anchor);\n  },\n\n  remove: function remove() {\n    if (this.frag) {\n      this.frag.remove();\n      this.frag = null;\n    }\n    if (this.elseEl && !this.elseFrag) {\n      if (!this.elseFactory) {\n        this.elseFactory = new FragmentFactory(this.elseEl._context || this.vm, this.elseEl);\n      }\n      this.elseFrag = this.elseFactory.create(this._host, this._scope, this._frag);\n      this.elseFrag.before(this.anchor);\n    }\n  },\n\n  updateRef: function updateRef(value) {\n    var ref = this.descriptor.ref;\n    if (!ref) return;\n    var hash = (this.vm || this._scope).$refs;\n    var refs = hash[ref];\n    var key = this._frag.scope.$key;\n    if (!refs) return;\n    if (value) {\n      if (Array.isArray(refs)) {\n        refs.push(findVmFromFrag(this._frag));\n      } else {\n        refs[key] = findVmFromFrag(this._frag);\n      }\n    } else {\n      if (Array.isArray(refs)) {\n        refs.$remove(findVmFromFrag(this._frag));\n      } else {\n        refs[key] = null;\n        delete refs[key];\n      }\n    }\n  },\n\n  unbind: function unbind() {\n    if (this.frag) {\n      this.frag.destroy();\n    }\n    if (this.elseFrag) {\n      this.elseFrag.destroy();\n    }\n  }\n};\n\nvar show = {\n\n  bind: function bind() {\n    // check else block\n    var next = this.el.nextElementSibling;\n    if (next && getAttr(next, 'v-else') !== null) {\n      this.elseEl = next;\n    }\n  },\n\n  update: function update(value) {\n    this.apply(this.el, value);\n    if (this.elseEl) {\n      this.apply(this.elseEl, !value);\n    }\n  },\n\n  apply: function apply(el, value) {\n    if (inDoc(el)) {\n      applyTransition(el, value ? 1 : -1, toggle, this.vm);\n    } else {\n      toggle();\n    }\n    function toggle() {\n      el.style.display = value ? '' : 'none';\n    }\n  }\n};\n\nvar text$2 = {\n\n  bind: function bind() {\n    var self = this;\n    var el = this.el;\n    var isRange = el.type === 'range';\n    var lazy = this.params.lazy;\n    var number = this.params.number;\n    var debounce = this.params.debounce;\n\n    // handle composition events.\n    //   http://blog.evanyou.me/2014/01/03/composition-event/\n    // skip this for Android because it handles composition\n    // events quite differently. Android doesn't trigger\n    // composition events for language input methods e.g.\n    // Chinese, but instead triggers them for spelling\n    // suggestions... (see Discussion/#162)\n    var composing = false;\n    if (!isAndroid && !isRange) {\n      this.on('compositionstart', function () {\n        composing = true;\n      });\n      this.on('compositionend', function () {\n        composing = false;\n        // in IE11 the \"compositionend\" event fires AFTER\n        // the \"input\" event, so the input handler is blocked\n        // at the end... have to call it here.\n        //\n        // #1327: in lazy mode this is unecessary.\n        if (!lazy) {\n          self.listener();\n        }\n      });\n    }\n\n    // prevent messing with the input when user is typing,\n    // and force update on blur.\n    this.focused = false;\n    if (!isRange && !lazy) {\n      this.on('focus', function () {\n        self.focused = true;\n      });\n      this.on('blur', function () {\n        self.focused = false;\n        // do not sync value after fragment removal (#2017)\n        if (!self._frag || self._frag.inserted) {\n          self.rawListener();\n        }\n      });\n    }\n\n    // Now attach the main listener\n    this.listener = this.rawListener = function () {\n      if (composing || !self._bound) {\n        return;\n      }\n      var val = number || isRange ? toNumber(el.value) : el.value;\n      self.set(val);\n      // force update on next tick to avoid lock & same value\n      // also only update when user is not typing\n      nextTick(function () {\n        if (self._bound && !self.focused) {\n          self.update(self._watcher.value);\n        }\n      });\n    };\n\n    // apply debounce\n    if (debounce) {\n      this.listener = _debounce(this.listener, debounce);\n    }\n\n    // Support jQuery events, since jQuery.trigger() doesn't\n    // trigger native events in some cases and some plugins\n    // rely on $.trigger()\n    //\n    // We want to make sure if a listener is attached using\n    // jQuery, it is also removed with jQuery, that's why\n    // we do the check for each directive instance and\n    // store that check result on itself. This also allows\n    // easier test coverage control by unsetting the global\n    // jQuery variable in tests.\n    this.hasjQuery = typeof jQuery === 'function';\n    if (this.hasjQuery) {\n      var method = jQuery.fn.on ? 'on' : 'bind';\n      jQuery(el)[method]('change', this.rawListener);\n      if (!lazy) {\n        jQuery(el)[method]('input', this.listener);\n      }\n    } else {\n      this.on('change', this.rawListener);\n      if (!lazy) {\n        this.on('input', this.listener);\n      }\n    }\n\n    // IE9 doesn't fire input event on backspace/del/cut\n    if (!lazy && isIE9) {\n      this.on('cut', function () {\n        nextTick(self.listener);\n      });\n      this.on('keyup', function (e) {\n        if (e.keyCode === 46 || e.keyCode === 8) {\n          self.listener();\n        }\n      });\n    }\n\n    // set initial value if present\n    if (el.hasAttribute('value') || el.tagName === 'TEXTAREA' && el.value.trim()) {\n      this.afterBind = this.listener;\n    }\n  },\n\n  update: function update(value) {\n    // #3029 only update when the value changes. This prevent\n    // browsers from overwriting values like selectionStart\n    value = _toString(value);\n    if (value !== this.el.value) this.el.value = value;\n  },\n\n  unbind: function unbind() {\n    var el = this.el;\n    if (this.hasjQuery) {\n      var method = jQuery.fn.off ? 'off' : 'unbind';\n      jQuery(el)[method]('change', this.listener);\n      jQuery(el)[method]('input', this.listener);\n    }\n  }\n};\n\nvar radio = {\n\n  bind: function bind() {\n    var self = this;\n    var el = this.el;\n\n    this.getValue = function () {\n      // value overwrite via v-bind:value\n      if (el.hasOwnProperty('_value')) {\n        return el._value;\n      }\n      var val = el.value;\n      if (self.params.number) {\n        val = toNumber(val);\n      }\n      return val;\n    };\n\n    this.listener = function () {\n      self.set(self.getValue());\n    };\n    this.on('change', this.listener);\n\n    if (el.hasAttribute('checked')) {\n      this.afterBind = this.listener;\n    }\n  },\n\n  update: function update(value) {\n    this.el.checked = looseEqual(value, this.getValue());\n  }\n};\n\nvar select = {\n\n  bind: function bind() {\n    var _this = this;\n\n    var self = this;\n    var el = this.el;\n\n    // method to force update DOM using latest value.\n    this.forceUpdate = function () {\n      if (self._watcher) {\n        self.update(self._watcher.get());\n      }\n    };\n\n    // check if this is a multiple select\n    var multiple = this.multiple = el.hasAttribute('multiple');\n\n    // attach listener\n    this.listener = function () {\n      var value = getValue(el, multiple);\n      value = self.params.number ? isArray(value) ? value.map(toNumber) : toNumber(value) : value;\n      self.set(value);\n    };\n    this.on('change', this.listener);\n\n    // if has initial value, set afterBind\n    var initValue = getValue(el, multiple, true);\n    if (multiple && initValue.length || !multiple && initValue !== null) {\n      this.afterBind = this.listener;\n    }\n\n    // All major browsers except Firefox resets\n    // selectedIndex with value -1 to 0 when the element\n    // is appended to a new parent, therefore we have to\n    // force a DOM update whenever that happens...\n    this.vm.$on('hook:attached', function () {\n      nextTick(_this.forceUpdate);\n    });\n    if (!inDoc(el)) {\n      nextTick(this.forceUpdate);\n    }\n  },\n\n  update: function update(value) {\n    var el = this.el;\n    el.selectedIndex = -1;\n    var multi = this.multiple && isArray(value);\n    var options = el.options;\n    var i = options.length;\n    var op, val;\n    while (i--) {\n      op = options[i];\n      val = op.hasOwnProperty('_value') ? op._value : op.value;\n      /* eslint-disable eqeqeq */\n      op.selected = multi ? indexOf$1(value, val) > -1 : looseEqual(value, val);\n      /* eslint-enable eqeqeq */\n    }\n  },\n\n  unbind: function unbind() {\n    /* istanbul ignore next */\n    this.vm.$off('hook:attached', this.forceUpdate);\n  }\n};\n\n/**\n * Get select value\n *\n * @param {SelectElement} el\n * @param {Boolean} multi\n * @param {Boolean} init\n * @return {Array|*}\n */\n\nfunction getValue(el, multi, init) {\n  var res = multi ? [] : null;\n  var op, val, selected;\n  for (var i = 0, l = el.options.length; i < l; i++) {\n    op = el.options[i];\n    selected = init ? op.hasAttribute('selected') : op.selected;\n    if (selected) {\n      val = op.hasOwnProperty('_value') ? op._value : op.value;\n      if (multi) {\n        res.push(val);\n      } else {\n        return val;\n      }\n    }\n  }\n  return res;\n}\n\n/**\n * Native Array.indexOf uses strict equal, but in this\n * case we need to match string/numbers with custom equal.\n *\n * @param {Array} arr\n * @param {*} val\n */\n\nfunction indexOf$1(arr, val) {\n  var i = arr.length;\n  while (i--) {\n    if (looseEqual(arr[i], val)) {\n      return i;\n    }\n  }\n  return -1;\n}\n\nvar checkbox = {\n\n  bind: function bind() {\n    var self = this;\n    var el = this.el;\n\n    this.getValue = function () {\n      return el.hasOwnProperty('_value') ? el._value : self.params.number ? toNumber(el.value) : el.value;\n    };\n\n    function getBooleanValue() {\n      var val = el.checked;\n      if (val && el.hasOwnProperty('_trueValue')) {\n        return el._trueValue;\n      }\n      if (!val && el.hasOwnProperty('_falseValue')) {\n        return el._falseValue;\n      }\n      return val;\n    }\n\n    this.listener = function () {\n      var model = self._watcher.get();\n      if (isArray(model)) {\n        var val = self.getValue();\n        var i = indexOf(model, val);\n        if (el.checked) {\n          if (i < 0) {\n            self.set(model.concat(val));\n          }\n        } else if (i > -1) {\n          self.set(model.slice(0, i).concat(model.slice(i + 1)));\n        }\n      } else {\n        self.set(getBooleanValue());\n      }\n    };\n\n    this.on('change', this.listener);\n    if (el.hasAttribute('checked')) {\n      this.afterBind = this.listener;\n    }\n  },\n\n  update: function update(value) {\n    var el = this.el;\n    if (isArray(value)) {\n      el.checked = indexOf(value, this.getValue()) > -1;\n    } else {\n      if (el.hasOwnProperty('_trueValue')) {\n        el.checked = looseEqual(value, el._trueValue);\n      } else {\n        el.checked = !!value;\n      }\n    }\n  }\n};\n\nvar handlers = {\n  text: text$2,\n  radio: radio,\n  select: select,\n  checkbox: checkbox\n};\n\nvar model = {\n\n  priority: MODEL,\n  twoWay: true,\n  handlers: handlers,\n  params: ['lazy', 'number', 'debounce'],\n\n  /**\n   * Possible elements:\n   *   <select>\n   *   <textarea>\n   *   <input type=\"*\">\n   *     - text\n   *     - checkbox\n   *     - radio\n   *     - number\n   */\n\n  bind: function bind() {\n    // friendly warning...\n    this.checkFilters();\n    if (this.hasRead && !this.hasWrite) {\n      'production' !== 'production' && warn('It seems you are using a read-only filter with ' + 'v-model=\"' + this.descriptor.raw + '\". ' + 'You might want to use a two-way filter to ensure correct behavior.', this.vm);\n    }\n    var el = this.el;\n    var tag = el.tagName;\n    var handler;\n    if (tag === 'INPUT') {\n      handler = handlers[el.type] || handlers.text;\n    } else if (tag === 'SELECT') {\n      handler = handlers.select;\n    } else if (tag === 'TEXTAREA') {\n      handler = handlers.text;\n    } else {\n      'production' !== 'production' && warn('v-model does not support element type: ' + tag, this.vm);\n      return;\n    }\n    el.__v_model = this;\n    handler.bind.call(this);\n    this.update = handler.update;\n    this._unbind = handler.unbind;\n  },\n\n  /**\n   * Check read/write filter stats.\n   */\n\n  checkFilters: function checkFilters() {\n    var filters = this.filters;\n    if (!filters) return;\n    var i = filters.length;\n    while (i--) {\n      var filter = resolveAsset(this.vm.$options, 'filters', filters[i].name);\n      if (typeof filter === 'function' || filter.read) {\n        this.hasRead = true;\n      }\n      if (filter.write) {\n        this.hasWrite = true;\n      }\n    }\n  },\n\n  unbind: function unbind() {\n    this.el.__v_model = null;\n    this._unbind && this._unbind();\n  }\n};\n\n// keyCode aliases\nvar keyCodes = {\n  esc: 27,\n  tab: 9,\n  enter: 13,\n  space: 32,\n  'delete': [8, 46],\n  up: 38,\n  left: 37,\n  right: 39,\n  down: 40\n};\n\nfunction keyFilter(handler, keys) {\n  var codes = keys.map(function (key) {\n    var charCode = key.charCodeAt(0);\n    if (charCode > 47 && charCode < 58) {\n      return parseInt(key, 10);\n    }\n    if (key.length === 1) {\n      charCode = key.toUpperCase().charCodeAt(0);\n      if (charCode > 64 && charCode < 91) {\n        return charCode;\n      }\n    }\n    return keyCodes[key];\n  });\n  codes = [].concat.apply([], codes);\n  return function keyHandler(e) {\n    if (codes.indexOf(e.keyCode) > -1) {\n      return handler.call(this, e);\n    }\n  };\n}\n\nfunction stopFilter(handler) {\n  return function stopHandler(e) {\n    e.stopPropagation();\n    return handler.call(this, e);\n  };\n}\n\nfunction preventFilter(handler) {\n  return function preventHandler(e) {\n    e.preventDefault();\n    return handler.call(this, e);\n  };\n}\n\nfunction selfFilter(handler) {\n  return function selfHandler(e) {\n    if (e.target === e.currentTarget) {\n      return handler.call(this, e);\n    }\n  };\n}\n\nvar on$1 = {\n\n  priority: ON,\n  acceptStatement: true,\n  keyCodes: keyCodes,\n\n  bind: function bind() {\n    // deal with iframes\n    if (this.el.tagName === 'IFRAME' && this.arg !== 'load') {\n      var self = this;\n      this.iframeBind = function () {\n        on(self.el.contentWindow, self.arg, self.handler, self.modifiers.capture);\n      };\n      this.on('load', this.iframeBind);\n    }\n  },\n\n  update: function update(handler) {\n    // stub a noop for v-on with no value,\n    // e.g. @mousedown.prevent\n    if (!this.descriptor.raw) {\n      handler = function () {};\n    }\n\n    if (typeof handler !== 'function') {\n      'production' !== 'production' && warn('v-on:' + this.arg + '=\"' + this.expression + '\" expects a function value, ' + 'got ' + handler, this.vm);\n      return;\n    }\n\n    // apply modifiers\n    if (this.modifiers.stop) {\n      handler = stopFilter(handler);\n    }\n    if (this.modifiers.prevent) {\n      handler = preventFilter(handler);\n    }\n    if (this.modifiers.self) {\n      handler = selfFilter(handler);\n    }\n    // key filter\n    var keys = Object.keys(this.modifiers).filter(function (key) {\n      return key !== 'stop' && key !== 'prevent' && key !== 'self' && key !== 'capture';\n    });\n    if (keys.length) {\n      handler = keyFilter(handler, keys);\n    }\n\n    this.reset();\n    this.handler = handler;\n\n    if (this.iframeBind) {\n      this.iframeBind();\n    } else {\n      on(this.el, this.arg, this.handler, this.modifiers.capture);\n    }\n  },\n\n  reset: function reset() {\n    var el = this.iframeBind ? this.el.contentWindow : this.el;\n    if (this.handler) {\n      off(el, this.arg, this.handler);\n    }\n  },\n\n  unbind: function unbind() {\n    this.reset();\n  }\n};\n\nvar prefixes = ['-webkit-', '-moz-', '-ms-'];\nvar camelPrefixes = ['Webkit', 'Moz', 'ms'];\nvar importantRE = /!important;?$/;\nvar propCache = Object.create(null);\n\nvar testEl = null;\n\nvar style = {\n\n  deep: true,\n\n  update: function update(value) {\n    if (typeof value === 'string') {\n      this.el.style.cssText = value;\n    } else if (isArray(value)) {\n      this.handleObject(value.reduce(extend, {}));\n    } else {\n      this.handleObject(value || {});\n    }\n  },\n\n  handleObject: function handleObject(value) {\n    // cache object styles so that only changed props\n    // are actually updated.\n    var cache = this.cache || (this.cache = {});\n    var name, val;\n    for (name in cache) {\n      if (!(name in value)) {\n        this.handleSingle(name, null);\n        delete cache[name];\n      }\n    }\n    for (name in value) {\n      val = value[name];\n      if (val !== cache[name]) {\n        cache[name] = val;\n        this.handleSingle(name, val);\n      }\n    }\n  },\n\n  handleSingle: function handleSingle(prop, value) {\n    prop = normalize(prop);\n    if (!prop) return; // unsupported prop\n    // cast possible numbers/booleans into strings\n    if (value != null) value += '';\n    if (value) {\n      var isImportant = importantRE.test(value) ? 'important' : '';\n      if (isImportant) {\n        /* istanbul ignore if */\n        if ('production' !== 'production') {}\n        value = value.replace(importantRE, '').trim();\n        this.el.style.setProperty(prop.kebab, value, isImportant);\n      } else {\n        this.el.style[prop.camel] = value;\n      }\n    } else {\n      this.el.style[prop.camel] = '';\n    }\n  }\n\n};\n\n/**\n * Normalize a CSS property name.\n * - cache result\n * - auto prefix\n * - camelCase -> dash-case\n *\n * @param {String} prop\n * @return {String}\n */\n\nfunction normalize(prop) {\n  if (propCache[prop]) {\n    return propCache[prop];\n  }\n  var res = prefix(prop);\n  propCache[prop] = propCache[res] = res;\n  return res;\n}\n\n/**\n * Auto detect the appropriate prefix for a CSS property.\n * https://gist.github.com/paulirish/523692\n *\n * @param {String} prop\n * @return {String}\n */\n\nfunction prefix(prop) {\n  prop = hyphenate(prop);\n  var camel = camelize(prop);\n  var upper = camel.charAt(0).toUpperCase() + camel.slice(1);\n  if (!testEl) {\n    testEl = document.createElement('div');\n  }\n  var i = prefixes.length;\n  var prefixed;\n  if (camel !== 'filter' && camel in testEl.style) {\n    return {\n      kebab: prop,\n      camel: camel\n    };\n  }\n  while (i--) {\n    prefixed = camelPrefixes[i] + upper;\n    if (prefixed in testEl.style) {\n      return {\n        kebab: prefixes[i] + prop,\n        camel: prefixed\n      };\n    }\n  }\n}\n\n// xlink\nvar xlinkNS = 'http://www.w3.org/1999/xlink';\nvar xlinkRE = /^xlink:/;\n\n// check for attributes that prohibit interpolations\nvar disallowedInterpAttrRE = /^v-|^:|^@|^(?:is|transition|transition-mode|debounce|track-by|stagger|enter-stagger|leave-stagger)$/;\n// these attributes should also set their corresponding properties\n// because they only affect the initial state of the element\nvar attrWithPropsRE = /^(?:value|checked|selected|muted)$/;\n// these attributes expect enumrated values of \"true\" or \"false\"\n// but are not boolean attributes\nvar enumeratedAttrRE = /^(?:draggable|contenteditable|spellcheck)$/;\n\n// these attributes should set a hidden property for\n// binding v-model to object values\nvar modelProps = {\n  value: '_value',\n  'true-value': '_trueValue',\n  'false-value': '_falseValue'\n};\n\nvar bind$1 = {\n\n  priority: BIND,\n\n  bind: function bind() {\n    var attr = this.arg;\n    var tag = this.el.tagName;\n    // should be deep watch on object mode\n    if (!attr) {\n      this.deep = true;\n    }\n    // handle interpolation bindings\n    var descriptor = this.descriptor;\n    var tokens = descriptor.interp;\n    if (tokens) {\n      // handle interpolations with one-time tokens\n      if (descriptor.hasOneTime) {\n        this.expression = tokensToExp(tokens, this._scope || this.vm);\n      }\n\n      // only allow binding on native attributes\n      if (disallowedInterpAttrRE.test(attr) || attr === 'name' && (tag === 'PARTIAL' || tag === 'SLOT')) {\n        'production' !== 'production' && warn(attr + '=\"' + descriptor.raw + '\": ' + 'attribute interpolation is not allowed in Vue.js ' + 'directives and special attributes.', this.vm);\n        this.el.removeAttribute(attr);\n        this.invalid = true;\n      }\n\n      /* istanbul ignore if */\n      if ('production' !== 'production') {}\n    }\n  },\n\n  update: function update(value) {\n    if (this.invalid) {\n      return;\n    }\n    var attr = this.arg;\n    if (this.arg) {\n      this.handleSingle(attr, value);\n    } else {\n      this.handleObject(value || {});\n    }\n  },\n\n  // share object handler with v-bind:class\n  handleObject: style.handleObject,\n\n  handleSingle: function handleSingle(attr, value) {\n    var el = this.el;\n    var interp = this.descriptor.interp;\n    if (this.modifiers.camel) {\n      attr = camelize(attr);\n    }\n    if (!interp && attrWithPropsRE.test(attr) && attr in el) {\n      var attrValue = attr === 'value' ? value == null // IE9 will set input.value to \"null\" for null...\n      ? '' : value : value;\n\n      if (el[attr] !== attrValue) {\n        el[attr] = attrValue;\n      }\n    }\n    // set model props\n    var modelProp = modelProps[attr];\n    if (!interp && modelProp) {\n      el[modelProp] = value;\n      // update v-model if present\n      var model = el.__v_model;\n      if (model) {\n        model.listener();\n      }\n    }\n    // do not set value attribute for textarea\n    if (attr === 'value' && el.tagName === 'TEXTAREA') {\n      el.removeAttribute(attr);\n      return;\n    }\n    // update attribute\n    if (enumeratedAttrRE.test(attr)) {\n      el.setAttribute(attr, value ? 'true' : 'false');\n    } else if (value != null && value !== false) {\n      if (attr === 'class') {\n        // handle edge case #1960:\n        // class interpolation should not overwrite Vue transition class\n        if (el.__v_trans) {\n          value += ' ' + el.__v_trans.id + '-transition';\n        }\n        setClass(el, value);\n      } else if (xlinkRE.test(attr)) {\n        el.setAttributeNS(xlinkNS, attr, value === true ? '' : value);\n      } else {\n        el.setAttribute(attr, value === true ? '' : value);\n      }\n    } else {\n      el.removeAttribute(attr);\n    }\n  }\n};\n\nvar el = {\n\n  priority: EL,\n\n  bind: function bind() {\n    /* istanbul ignore if */\n    if (!this.arg) {\n      return;\n    }\n    var id = this.id = camelize(this.arg);\n    var refs = (this._scope || this.vm).$els;\n    if (hasOwn(refs, id)) {\n      refs[id] = this.el;\n    } else {\n      defineReactive(refs, id, this.el);\n    }\n  },\n\n  unbind: function unbind() {\n    var refs = (this._scope || this.vm).$els;\n    if (refs[this.id] === this.el) {\n      refs[this.id] = null;\n    }\n  }\n};\n\nvar ref = {\n  bind: function bind() {\n    'production' !== 'production' && warn('v-ref:' + this.arg + ' must be used on a child ' + 'component. Found on <' + this.el.tagName.toLowerCase() + '>.', this.vm);\n  }\n};\n\nvar cloak = {\n  bind: function bind() {\n    var el = this.el;\n    this.vm.$once('pre-hook:compiled', function () {\n      el.removeAttribute('v-cloak');\n    });\n  }\n};\n\n// logic control\n// two-way binding\n// event handling\n// attributes\n// ref & el\n// cloak\n// must export plain object\nvar directives = {\n  text: text$1,\n  html: html,\n  'for': vFor,\n  'if': vIf,\n  show: show,\n  model: model,\n  on: on$1,\n  bind: bind$1,\n  el: el,\n  ref: ref,\n  cloak: cloak\n};\n\nvar vClass = {\n\n  deep: true,\n\n  update: function update(value) {\n    if (!value) {\n      this.cleanup();\n    } else if (typeof value === 'string') {\n      this.setClass(value.trim().split(/\\s+/));\n    } else {\n      this.setClass(normalize$1(value));\n    }\n  },\n\n  setClass: function setClass(value) {\n    this.cleanup(value);\n    for (var i = 0, l = value.length; i < l; i++) {\n      var val = value[i];\n      if (val) {\n        apply(this.el, val, addClass);\n      }\n    }\n    this.prevKeys = value;\n  },\n\n  cleanup: function cleanup(value) {\n    var prevKeys = this.prevKeys;\n    if (!prevKeys) return;\n    var i = prevKeys.length;\n    while (i--) {\n      var key = prevKeys[i];\n      if (!value || value.indexOf(key) < 0) {\n        apply(this.el, key, removeClass);\n      }\n    }\n  }\n};\n\n/**\n * Normalize objects and arrays (potentially containing objects)\n * into array of strings.\n *\n * @param {Object|Array<String|Object>} value\n * @return {Array<String>}\n */\n\nfunction normalize$1(value) {\n  var res = [];\n  if (isArray(value)) {\n    for (var i = 0, l = value.length; i < l; i++) {\n      var _key = value[i];\n      if (_key) {\n        if (typeof _key === 'string') {\n          res.push(_key);\n        } else {\n          for (var k in _key) {\n            if (_key[k]) res.push(k);\n          }\n        }\n      }\n    }\n  } else if (isObject(value)) {\n    for (var key in value) {\n      if (value[key]) res.push(key);\n    }\n  }\n  return res;\n}\n\n/**\n * Add or remove a class/classes on an element\n *\n * @param {Element} el\n * @param {String} key The class name. This may or may not\n *                     contain a space character, in such a\n *                     case we'll deal with multiple class\n *                     names at once.\n * @param {Function} fn\n */\n\nfunction apply(el, key, fn) {\n  key = key.trim();\n  if (key.indexOf(' ') === -1) {\n    fn(el, key);\n    return;\n  }\n  // The key contains one or more space characters.\n  // Since a class name doesn't accept such characters, we\n  // treat it as multiple classes.\n  var keys = key.split(/\\s+/);\n  for (var i = 0, l = keys.length; i < l; i++) {\n    fn(el, keys[i]);\n  }\n}\n\nvar component = {\n\n  priority: COMPONENT,\n\n  params: ['keep-alive', 'transition-mode', 'inline-template'],\n\n  /**\n   * Setup. Two possible usages:\n   *\n   * - static:\n   *   <comp> or <div v-component=\"comp\">\n   *\n   * - dynamic:\n   *   <component :is=\"view\">\n   */\n\n  bind: function bind() {\n    if (!this.el.__vue__) {\n      // keep-alive cache\n      this.keepAlive = this.params.keepAlive;\n      if (this.keepAlive) {\n        this.cache = {};\n      }\n      // check inline-template\n      if (this.params.inlineTemplate) {\n        // extract inline template as a DocumentFragment\n        this.inlineTemplate = extractContent(this.el, true);\n      }\n      // component resolution related state\n      this.pendingComponentCb = this.Component = null;\n      // transition related state\n      this.pendingRemovals = 0;\n      this.pendingRemovalCb = null;\n      // create a ref anchor\n      this.anchor = createAnchor('v-component');\n      replace(this.el, this.anchor);\n      // remove is attribute.\n      // this is removed during compilation, but because compilation is\n      // cached, when the component is used elsewhere this attribute\n      // will remain at link time.\n      this.el.removeAttribute('is');\n      this.el.removeAttribute(':is');\n      // remove ref, same as above\n      if (this.descriptor.ref) {\n        this.el.removeAttribute('v-ref:' + hyphenate(this.descriptor.ref));\n      }\n      // if static, build right now.\n      if (this.literal) {\n        this.setComponent(this.expression);\n      }\n    } else {\n      'production' !== 'production' && warn('cannot mount component \"' + this.expression + '\" ' + 'on already mounted element: ' + this.el);\n    }\n  },\n\n  /**\n   * Public update, called by the watcher in the dynamic\n   * literal scenario, e.g. <component :is=\"view\">\n   */\n\n  update: function update(value) {\n    if (!this.literal) {\n      this.setComponent(value);\n    }\n  },\n\n  /**\n   * Switch dynamic components. May resolve the component\n   * asynchronously, and perform transition based on\n   * specified transition mode. Accepts a few additional\n   * arguments specifically for vue-router.\n   *\n   * The callback is called when the full transition is\n   * finished.\n   *\n   * @param {String} value\n   * @param {Function} [cb]\n   */\n\n  setComponent: function setComponent(value, cb) {\n    this.invalidatePending();\n    if (!value) {\n      // just remove current\n      this.unbuild(true);\n      this.remove(this.childVM, cb);\n      this.childVM = null;\n    } else {\n      var self = this;\n      this.resolveComponent(value, function () {\n        self.mountComponent(cb);\n      });\n    }\n  },\n\n  /**\n   * Resolve the component constructor to use when creating\n   * the child vm.\n   *\n   * @param {String|Function} value\n   * @param {Function} cb\n   */\n\n  resolveComponent: function resolveComponent(value, cb) {\n    var self = this;\n    this.pendingComponentCb = cancellable(function (Component) {\n      self.ComponentName = Component.options.name || (typeof value === 'string' ? value : null);\n      self.Component = Component;\n      cb();\n    });\n    this.vm._resolveComponent(value, this.pendingComponentCb);\n  },\n\n  /**\n   * Create a new instance using the current constructor and\n   * replace the existing instance. This method doesn't care\n   * whether the new component and the old one are actually\n   * the same.\n   *\n   * @param {Function} [cb]\n   */\n\n  mountComponent: function mountComponent(cb) {\n    // actual mount\n    this.unbuild(true);\n    var self = this;\n    var activateHooks = this.Component.options.activate;\n    var cached = this.getCached();\n    var newComponent = this.build();\n    if (activateHooks && !cached) {\n      this.waitingFor = newComponent;\n      callActivateHooks(activateHooks, newComponent, function () {\n        if (self.waitingFor !== newComponent) {\n          return;\n        }\n        self.waitingFor = null;\n        self.transition(newComponent, cb);\n      });\n    } else {\n      // update ref for kept-alive component\n      if (cached) {\n        newComponent._updateRef();\n      }\n      this.transition(newComponent, cb);\n    }\n  },\n\n  /**\n   * When the component changes or unbinds before an async\n   * constructor is resolved, we need to invalidate its\n   * pending callback.\n   */\n\n  invalidatePending: function invalidatePending() {\n    if (this.pendingComponentCb) {\n      this.pendingComponentCb.cancel();\n      this.pendingComponentCb = null;\n    }\n  },\n\n  /**\n   * Instantiate/insert a new child vm.\n   * If keep alive and has cached instance, insert that\n   * instance; otherwise build a new one and cache it.\n   *\n   * @param {Object} [extraOptions]\n   * @return {Vue} - the created instance\n   */\n\n  build: function build(extraOptions) {\n    var cached = this.getCached();\n    if (cached) {\n      return cached;\n    }\n    if (this.Component) {\n      // default options\n      var options = {\n        name: this.ComponentName,\n        el: cloneNode(this.el),\n        template: this.inlineTemplate,\n        // make sure to add the child with correct parent\n        // if this is a transcluded component, its parent\n        // should be the transclusion host.\n        parent: this._host || this.vm,\n        // if no inline-template, then the compiled\n        // linker can be cached for better performance.\n        _linkerCachable: !this.inlineTemplate,\n        _ref: this.descriptor.ref,\n        _asComponent: true,\n        _isRouterView: this._isRouterView,\n        // if this is a transcluded component, context\n        // will be the common parent vm of this instance\n        // and its host.\n        _context: this.vm,\n        // if this is inside an inline v-for, the scope\n        // will be the intermediate scope created for this\n        // repeat fragment. this is used for linking props\n        // and container directives.\n        _scope: this._scope,\n        // pass in the owner fragment of this component.\n        // this is necessary so that the fragment can keep\n        // track of its contained components in order to\n        // call attach/detach hooks for them.\n        _frag: this._frag\n      };\n      // extra options\n      // in 1.0.0 this is used by vue-router only\n      /* istanbul ignore if */\n      if (extraOptions) {\n        extend(options, extraOptions);\n      }\n      var child = new this.Component(options);\n      if (this.keepAlive) {\n        this.cache[this.Component.cid] = child;\n      }\n      /* istanbul ignore if */\n      if ('production' !== 'production' && this.el.hasAttribute('transition') && child._isFragment) {}\n      return child;\n    }\n  },\n\n  /**\n   * Try to get a cached instance of the current component.\n   *\n   * @return {Vue|undefined}\n   */\n\n  getCached: function getCached() {\n    return this.keepAlive && this.cache[this.Component.cid];\n  },\n\n  /**\n   * Teardown the current child, but defers cleanup so\n   * that we can separate the destroy and removal steps.\n   *\n   * @param {Boolean} defer\n   */\n\n  unbuild: function unbuild(defer) {\n    if (this.waitingFor) {\n      if (!this.keepAlive) {\n        this.waitingFor.$destroy();\n      }\n      this.waitingFor = null;\n    }\n    var child = this.childVM;\n    if (!child || this.keepAlive) {\n      if (child) {\n        // remove ref\n        child._inactive = true;\n        child._updateRef(true);\n      }\n      return;\n    }\n    // the sole purpose of `deferCleanup` is so that we can\n    // \"deactivate\" the vm right now and perform DOM removal\n    // later.\n    child.$destroy(false, defer);\n  },\n\n  /**\n   * Remove current destroyed child and manually do\n   * the cleanup after removal.\n   *\n   * @param {Function} cb\n   */\n\n  remove: function remove(child, cb) {\n    var keepAlive = this.keepAlive;\n    if (child) {\n      // we may have a component switch when a previous\n      // component is still being transitioned out.\n      // we want to trigger only one lastest insertion cb\n      // when the existing transition finishes. (#1119)\n      this.pendingRemovals++;\n      this.pendingRemovalCb = cb;\n      var self = this;\n      child.$remove(function () {\n        self.pendingRemovals--;\n        if (!keepAlive) child._cleanup();\n        if (!self.pendingRemovals && self.pendingRemovalCb) {\n          self.pendingRemovalCb();\n          self.pendingRemovalCb = null;\n        }\n      });\n    } else if (cb) {\n      cb();\n    }\n  },\n\n  /**\n   * Actually swap the components, depending on the\n   * transition mode. Defaults to simultaneous.\n   *\n   * @param {Vue} target\n   * @param {Function} [cb]\n   */\n\n  transition: function transition(target, cb) {\n    var self = this;\n    var current = this.childVM;\n    // for devtool inspection\n    if (current) current._inactive = true;\n    target._inactive = false;\n    this.childVM = target;\n    switch (self.params.transitionMode) {\n      case 'in-out':\n        target.$before(self.anchor, function () {\n          self.remove(current, cb);\n        });\n        break;\n      case 'out-in':\n        self.remove(current, function () {\n          target.$before(self.anchor, cb);\n        });\n        break;\n      default:\n        self.remove(current);\n        target.$before(self.anchor, cb);\n    }\n  },\n\n  /**\n   * Unbind.\n   */\n\n  unbind: function unbind() {\n    this.invalidatePending();\n    // Do not defer cleanup when unbinding\n    this.unbuild();\n    // destroy all keep-alive cached instances\n    if (this.cache) {\n      for (var key in this.cache) {\n        this.cache[key].$destroy();\n      }\n      this.cache = null;\n    }\n  }\n};\n\n/**\n * Call activate hooks in order (asynchronous)\n *\n * @param {Array} hooks\n * @param {Vue} vm\n * @param {Function} cb\n */\n\nfunction callActivateHooks(hooks, vm, cb) {\n  var total = hooks.length;\n  var called = 0;\n  hooks[0].call(vm, next);\n  function next() {\n    if (++called >= total) {\n      cb();\n    } else {\n      hooks[called].call(vm, next);\n    }\n  }\n}\n\nvar propBindingModes = config._propBindingModes;\nvar empty = {};\n\n// regexes\nvar identRE$1 = /^[$_a-zA-Z]+[\\w$]*$/;\nvar settablePathRE = /^[A-Za-z_$][\\w$]*(\\.[A-Za-z_$][\\w$]*|\\[[^\\[\\]]+\\])*$/;\n\n/**\n * Compile props on a root element and return\n * a props link function.\n *\n * @param {Element|DocumentFragment} el\n * @param {Array} propOptions\n * @param {Vue} vm\n * @return {Function} propsLinkFn\n */\n\nfunction compileProps(el, propOptions, vm) {\n  var props = [];\n  var propsData = vm.$options.propsData;\n  var names = Object.keys(propOptions);\n  var i = names.length;\n  var options, name, attr, value, path, parsed, prop;\n  while (i--) {\n    name = names[i];\n    options = propOptions[name] || empty;\n\n    if ('production' !== 'production' && name === '$data') {}\n\n    // props could contain dashes, which will be\n    // interpreted as minus calculations by the parser\n    // so we need to camelize the path here\n    path = camelize(name);\n    if (!identRE$1.test(path)) {\n      'production' !== 'production' && warn('Invalid prop key: \"' + name + '\". Prop keys ' + 'must be valid identifiers.', vm);\n      continue;\n    }\n\n    prop = {\n      name: name,\n      path: path,\n      options: options,\n      mode: propBindingModes.ONE_WAY,\n      raw: null\n    };\n\n    attr = hyphenate(name);\n    // first check dynamic version\n    if ((value = getBindAttr(el, attr)) === null) {\n      if ((value = getBindAttr(el, attr + '.sync')) !== null) {\n        prop.mode = propBindingModes.TWO_WAY;\n      } else if ((value = getBindAttr(el, attr + '.once')) !== null) {\n        prop.mode = propBindingModes.ONE_TIME;\n      }\n    }\n    if (value !== null) {\n      // has dynamic binding!\n      prop.raw = value;\n      parsed = parseDirective(value);\n      value = parsed.expression;\n      prop.filters = parsed.filters;\n      // check binding type\n      if (isLiteral(value) && !parsed.filters) {\n        // for expressions containing literal numbers and\n        // booleans, there's no need to setup a prop binding,\n        // so we can optimize them as a one-time set.\n        prop.optimizedLiteral = true;\n      } else {\n        prop.dynamic = true;\n        // check non-settable path for two-way bindings\n        if ('production' !== 'production' && prop.mode === propBindingModes.TWO_WAY && !settablePathRE.test(value)) {}\n      }\n      prop.parentPath = value;\n\n      // warn required two-way\n      if ('production' !== 'production' && options.twoWay && prop.mode !== propBindingModes.TWO_WAY) {}\n    } else if ((value = getAttr(el, attr)) !== null) {\n      // has literal binding!\n      prop.raw = value;\n    } else if (propsData && (value = propsData[name] || propsData[path]) !== null) {\n      // has propsData\n      prop.raw = value;\n    } else if ('production' !== 'production') {}\n    // push prop\n    props.push(prop);\n  }\n  return makePropsLinkFn(props);\n}\n\n/**\n * Build a function that applies props to a vm.\n *\n * @param {Array} props\n * @return {Function} propsLinkFn\n */\n\nfunction makePropsLinkFn(props) {\n  return function propsLinkFn(vm, scope) {\n    // store resolved props info\n    vm._props = {};\n    var inlineProps = vm.$options.propsData;\n    var i = props.length;\n    var prop, path, options, value, raw;\n    while (i--) {\n      prop = props[i];\n      raw = prop.raw;\n      path = prop.path;\n      options = prop.options;\n      vm._props[path] = prop;\n      if (inlineProps && hasOwn(inlineProps, path)) {\n        initProp(vm, prop, inlineProps[path]);\n      }if (raw === null) {\n        // initialize absent prop\n        initProp(vm, prop, undefined);\n      } else if (prop.dynamic) {\n        // dynamic prop\n        if (prop.mode === propBindingModes.ONE_TIME) {\n          // one time binding\n          value = (scope || vm._context || vm).$get(prop.parentPath);\n          initProp(vm, prop, value);\n        } else {\n          if (vm._context) {\n            // dynamic binding\n            vm._bindDir({\n              name: 'prop',\n              def: propDef,\n              prop: prop\n            }, null, null, scope); // el, host, scope\n          } else {\n              // root instance\n              initProp(vm, prop, vm.$get(prop.parentPath));\n            }\n        }\n      } else if (prop.optimizedLiteral) {\n        // optimized literal, cast it and just set once\n        var stripped = stripQuotes(raw);\n        value = stripped === raw ? toBoolean(toNumber(raw)) : stripped;\n        initProp(vm, prop, value);\n      } else {\n        // string literal, but we need to cater for\n        // Boolean props with no value, or with same\n        // literal value (e.g. disabled=\"disabled\")\n        // see https://github.com/vuejs/vue-loader/issues/182\n        value = options.type === Boolean && (raw === '' || raw === hyphenate(prop.name)) ? true : raw;\n        initProp(vm, prop, value);\n      }\n    }\n  };\n}\n\n/**\n * Process a prop with a rawValue, applying necessary coersions,\n * default values & assertions and call the given callback with\n * processed value.\n *\n * @param {Vue} vm\n * @param {Object} prop\n * @param {*} rawValue\n * @param {Function} fn\n */\n\nfunction processPropValue(vm, prop, rawValue, fn) {\n  var isSimple = prop.dynamic && isSimplePath(prop.parentPath);\n  var value = rawValue;\n  if (value === undefined) {\n    value = getPropDefaultValue(vm, prop);\n  }\n  value = coerceProp(prop, value, vm);\n  var coerced = value !== rawValue;\n  if (!assertProp(prop, value, vm)) {\n    value = undefined;\n  }\n  if (isSimple && !coerced) {\n    withoutConversion(function () {\n      fn(value);\n    });\n  } else {\n    fn(value);\n  }\n}\n\n/**\n * Set a prop's initial value on a vm and its data object.\n *\n * @param {Vue} vm\n * @param {Object} prop\n * @param {*} value\n */\n\nfunction initProp(vm, prop, value) {\n  processPropValue(vm, prop, value, function (value) {\n    defineReactive(vm, prop.path, value);\n  });\n}\n\n/**\n * Update a prop's value on a vm.\n *\n * @param {Vue} vm\n * @param {Object} prop\n * @param {*} value\n */\n\nfunction updateProp(vm, prop, value) {\n  processPropValue(vm, prop, value, function (value) {\n    vm[prop.path] = value;\n  });\n}\n\n/**\n * Get the default value of a prop.\n *\n * @param {Vue} vm\n * @param {Object} prop\n * @return {*}\n */\n\nfunction getPropDefaultValue(vm, prop) {\n  // no default, return undefined\n  var options = prop.options;\n  if (!hasOwn(options, 'default')) {\n    // absent boolean value defaults to false\n    return options.type === Boolean ? false : undefined;\n  }\n  var def = options['default'];\n  // warn against non-factory defaults for Object & Array\n  if (isObject(def)) {\n    'production' !== 'production' && warn('Invalid default value for prop \"' + prop.name + '\": ' + 'Props with type Object/Array must use a factory function ' + 'to return the default value.', vm);\n  }\n  // call factory function for non-Function types\n  return typeof def === 'function' && options.type !== Function ? def.call(vm) : def;\n}\n\n/**\n * Assert whether a prop is valid.\n *\n * @param {Object} prop\n * @param {*} value\n * @param {Vue} vm\n */\n\nfunction assertProp(prop, value, vm) {\n  if (!prop.options.required && ( // non-required\n  prop.raw === null || // abscent\n  value == null) // null or undefined\n  ) {\n      return true;\n    }\n  var options = prop.options;\n  var type = options.type;\n  var valid = !type;\n  var expectedTypes = [];\n  if (type) {\n    if (!isArray(type)) {\n      type = [type];\n    }\n    for (var i = 0; i < type.length && !valid; i++) {\n      var assertedType = assertType(value, type[i]);\n      expectedTypes.push(assertedType.expectedType);\n      valid = assertedType.valid;\n    }\n  }\n  if (!valid) {\n    if ('production' !== 'production') {}\n    return false;\n  }\n  var validator = options.validator;\n  if (validator) {\n    if (!validator(value)) {\n      'production' !== 'production' && warn('Invalid prop: custom validator check failed for prop \"' + prop.name + '\".', vm);\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * Force parsing value with coerce option.\n *\n * @param {*} value\n * @param {Object} options\n * @return {*}\n */\n\nfunction coerceProp(prop, value, vm) {\n  var coerce = prop.options.coerce;\n  if (!coerce) {\n    return value;\n  }\n  if (typeof coerce === 'function') {\n    return coerce(value);\n  } else {\n    'production' !== 'production' && warn('Invalid coerce for prop \"' + prop.name + '\": expected function, got ' + typeof coerce + '.', vm);\n    return value;\n  }\n}\n\n/**\n * Assert the type of a value\n *\n * @param {*} value\n * @param {Function} type\n * @return {Object}\n */\n\nfunction assertType(value, type) {\n  var valid;\n  var expectedType;\n  if (type === String) {\n    expectedType = 'string';\n    valid = typeof value === expectedType;\n  } else if (type === Number) {\n    expectedType = 'number';\n    valid = typeof value === expectedType;\n  } else if (type === Boolean) {\n    expectedType = 'boolean';\n    valid = typeof value === expectedType;\n  } else if (type === Function) {\n    expectedType = 'function';\n    valid = typeof value === expectedType;\n  } else if (type === Object) {\n    expectedType = 'object';\n    valid = isPlainObject(value);\n  } else if (type === Array) {\n    expectedType = 'array';\n    valid = isArray(value);\n  } else {\n    valid = value instanceof type;\n  }\n  return {\n    valid: valid,\n    expectedType: expectedType\n  };\n}\n\nvar bindingModes = config._propBindingModes;\n\nvar propDef = {\n\n  bind: function bind() {\n    var child = this.vm;\n    var parent = child._context;\n    // passed in from compiler directly\n    var prop = this.descriptor.prop;\n    var childKey = prop.path;\n    var parentKey = prop.parentPath;\n    var twoWay = prop.mode === bindingModes.TWO_WAY;\n\n    var parentWatcher = this.parentWatcher = new Watcher(parent, parentKey, function (val) {\n      updateProp(child, prop, val);\n    }, {\n      twoWay: twoWay,\n      filters: prop.filters,\n      // important: props need to be observed on the\n      // v-for scope if present\n      scope: this._scope\n    });\n\n    // set the child initial value.\n    initProp(child, prop, parentWatcher.value);\n\n    // setup two-way binding\n    if (twoWay) {\n      // important: defer the child watcher creation until\n      // the created hook (after data observation)\n      var self = this;\n      child.$once('pre-hook:created', function () {\n        self.childWatcher = new Watcher(child, childKey, function (val) {\n          parentWatcher.set(val);\n        }, {\n          // ensure sync upward before parent sync down.\n          // this is necessary in cases e.g. the child\n          // mutates a prop array, then replaces it. (#1683)\n          sync: true\n        });\n      });\n    }\n  },\n\n  unbind: function unbind() {\n    this.parentWatcher.teardown();\n    if (this.childWatcher) {\n      this.childWatcher.teardown();\n    }\n  }\n};\n\nvar queue$1 = [];\nvar queued = false;\n\n/**\n * Push a job into the queue.\n *\n * @param {Function} job\n */\n\nfunction pushJob(job) {\n  queue$1.push(job);\n  if (!queued) {\n    queued = true;\n    nextTick(flush);\n  }\n}\n\n/**\n * Flush the queue, and do one forced reflow before\n * triggering transitions.\n */\n\nfunction flush() {\n  // Force layout\n  var f = document.documentElement.offsetHeight;\n  for (var i = 0; i < queue$1.length; i++) {\n    queue$1[i]();\n  }\n  queue$1 = [];\n  queued = false;\n  // dummy return, so js linters don't complain about\n  // unused variable f\n  return f;\n}\n\nvar TYPE_TRANSITION = 'transition';\nvar TYPE_ANIMATION = 'animation';\nvar transDurationProp = transitionProp + 'Duration';\nvar animDurationProp = animationProp + 'Duration';\n\n/**\n * If a just-entered element is applied the\n * leave class while its enter transition hasn't started yet,\n * and the transitioned property has the same value for both\n * enter/leave, then the leave transition will be skipped and\n * the transitionend event never fires. This function ensures\n * its callback to be called after a transition has started\n * by waiting for double raf.\n *\n * It falls back to setTimeout on devices that support CSS\n * transitions but not raf (e.g. Android 4.2 browser) - since\n * these environments are usually slow, we are giving it a\n * relatively large timeout.\n */\n\nvar raf = inBrowser && window.requestAnimationFrame;\nvar waitForTransitionStart = raf\n/* istanbul ignore next */\n? function (fn) {\n  raf(function () {\n    raf(fn);\n  });\n} : function (fn) {\n  setTimeout(fn, 50);\n};\n\n/**\n * A Transition object that encapsulates the state and logic\n * of the transition.\n *\n * @param {Element} el\n * @param {String} id\n * @param {Object} hooks\n * @param {Vue} vm\n */\nfunction Transition(el, id, hooks, vm) {\n  this.id = id;\n  this.el = el;\n  this.enterClass = hooks && hooks.enterClass || id + '-enter';\n  this.leaveClass = hooks && hooks.leaveClass || id + '-leave';\n  this.hooks = hooks;\n  this.vm = vm;\n  // async state\n  this.pendingCssEvent = this.pendingCssCb = this.cancel = this.pendingJsCb = this.op = this.cb = null;\n  this.justEntered = false;\n  this.entered = this.left = false;\n  this.typeCache = {};\n  // check css transition type\n  this.type = hooks && hooks.type;\n  /* istanbul ignore if */\n  if ('production' !== 'production') {}\n  // bind\n  var self = this;['enterNextTick', 'enterDone', 'leaveNextTick', 'leaveDone'].forEach(function (m) {\n    self[m] = bind(self[m], self);\n  });\n}\n\nvar p$1 = Transition.prototype;\n\n/**\n * Start an entering transition.\n *\n * 1. enter transition triggered\n * 2. call beforeEnter hook\n * 3. add enter class\n * 4. insert/show element\n * 5. call enter hook (with possible explicit js callback)\n * 6. reflow\n * 7. based on transition type:\n *    - transition:\n *        remove class now, wait for transitionend,\n *        then done if there's no explicit js callback.\n *    - animation:\n *        wait for animationend, remove class,\n *        then done if there's no explicit js callback.\n *    - no css transition:\n *        done now if there's no explicit js callback.\n * 8. wait for either done or js callback, then call\n *    afterEnter hook.\n *\n * @param {Function} op - insert/show the element\n * @param {Function} [cb]\n */\n\np$1.enter = function (op, cb) {\n  this.cancelPending();\n  this.callHook('beforeEnter');\n  this.cb = cb;\n  addClass(this.el, this.enterClass);\n  op();\n  this.entered = false;\n  this.callHookWithCb('enter');\n  if (this.entered) {\n    return; // user called done synchronously.\n  }\n  this.cancel = this.hooks && this.hooks.enterCancelled;\n  pushJob(this.enterNextTick);\n};\n\n/**\n * The \"nextTick\" phase of an entering transition, which is\n * to be pushed into a queue and executed after a reflow so\n * that removing the class can trigger a CSS transition.\n */\n\np$1.enterNextTick = function () {\n  var _this = this;\n\n  // prevent transition skipping\n  this.justEntered = true;\n  waitForTransitionStart(function () {\n    _this.justEntered = false;\n  });\n  var enterDone = this.enterDone;\n  var type = this.getCssTransitionType(this.enterClass);\n  if (!this.pendingJsCb) {\n    if (type === TYPE_TRANSITION) {\n      // trigger transition by removing enter class now\n      removeClass(this.el, this.enterClass);\n      this.setupCssCb(transitionEndEvent, enterDone);\n    } else if (type === TYPE_ANIMATION) {\n      this.setupCssCb(animationEndEvent, enterDone);\n    } else {\n      enterDone();\n    }\n  } else if (type === TYPE_TRANSITION) {\n    removeClass(this.el, this.enterClass);\n  }\n};\n\n/**\n * The \"cleanup\" phase of an entering transition.\n */\n\np$1.enterDone = function () {\n  this.entered = true;\n  this.cancel = this.pendingJsCb = null;\n  removeClass(this.el, this.enterClass);\n  this.callHook('afterEnter');\n  if (this.cb) this.cb();\n};\n\n/**\n * Start a leaving transition.\n *\n * 1. leave transition triggered.\n * 2. call beforeLeave hook\n * 3. add leave class (trigger css transition)\n * 4. call leave hook (with possible explicit js callback)\n * 5. reflow if no explicit js callback is provided\n * 6. based on transition type:\n *    - transition or animation:\n *        wait for end event, remove class, then done if\n *        there's no explicit js callback.\n *    - no css transition:\n *        done if there's no explicit js callback.\n * 7. wait for either done or js callback, then call\n *    afterLeave hook.\n *\n * @param {Function} op - remove/hide the element\n * @param {Function} [cb]\n */\n\np$1.leave = function (op, cb) {\n  this.cancelPending();\n  this.callHook('beforeLeave');\n  this.op = op;\n  this.cb = cb;\n  addClass(this.el, this.leaveClass);\n  this.left = false;\n  this.callHookWithCb('leave');\n  if (this.left) {\n    return; // user called done synchronously.\n  }\n  this.cancel = this.hooks && this.hooks.leaveCancelled;\n  // only need to handle leaveDone if\n  // 1. the transition is already done (synchronously called\n  //    by the user, which causes this.op set to null)\n  // 2. there's no explicit js callback\n  if (this.op && !this.pendingJsCb) {\n    // if a CSS transition leaves immediately after enter,\n    // the transitionend event never fires. therefore we\n    // detect such cases and end the leave immediately.\n    if (this.justEntered) {\n      this.leaveDone();\n    } else {\n      pushJob(this.leaveNextTick);\n    }\n  }\n};\n\n/**\n * The \"nextTick\" phase of a leaving transition.\n */\n\np$1.leaveNextTick = function () {\n  var type = this.getCssTransitionType(this.leaveClass);\n  if (type) {\n    var event = type === TYPE_TRANSITION ? transitionEndEvent : animationEndEvent;\n    this.setupCssCb(event, this.leaveDone);\n  } else {\n    this.leaveDone();\n  }\n};\n\n/**\n * The \"cleanup\" phase of a leaving transition.\n */\n\np$1.leaveDone = function () {\n  this.left = true;\n  this.cancel = this.pendingJsCb = null;\n  this.op();\n  removeClass(this.el, this.leaveClass);\n  this.callHook('afterLeave');\n  if (this.cb) this.cb();\n  this.op = null;\n};\n\n/**\n * Cancel any pending callbacks from a previously running\n * but not finished transition.\n */\n\np$1.cancelPending = function () {\n  this.op = this.cb = null;\n  var hasPending = false;\n  if (this.pendingCssCb) {\n    hasPending = true;\n    off(this.el, this.pendingCssEvent, this.pendingCssCb);\n    this.pendingCssEvent = this.pendingCssCb = null;\n  }\n  if (this.pendingJsCb) {\n    hasPending = true;\n    this.pendingJsCb.cancel();\n    this.pendingJsCb = null;\n  }\n  if (hasPending) {\n    removeClass(this.el, this.enterClass);\n    removeClass(this.el, this.leaveClass);\n  }\n  if (this.cancel) {\n    this.cancel.call(this.vm, this.el);\n    this.cancel = null;\n  }\n};\n\n/**\n * Call a user-provided synchronous hook function.\n *\n * @param {String} type\n */\n\np$1.callHook = function (type) {\n  if (this.hooks && this.hooks[type]) {\n    this.hooks[type].call(this.vm, this.el);\n  }\n};\n\n/**\n * Call a user-provided, potentially-async hook function.\n * We check for the length of arguments to see if the hook\n * expects a `done` callback. If true, the transition's end\n * will be determined by when the user calls that callback;\n * otherwise, the end is determined by the CSS transition or\n * animation.\n *\n * @param {String} type\n */\n\np$1.callHookWithCb = function (type) {\n  var hook = this.hooks && this.hooks[type];\n  if (hook) {\n    if (hook.length > 1) {\n      this.pendingJsCb = cancellable(this[type + 'Done']);\n    }\n    hook.call(this.vm, this.el, this.pendingJsCb);\n  }\n};\n\n/**\n * Get an element's transition type based on the\n * calculated styles.\n *\n * @param {String} className\n * @return {Number}\n */\n\np$1.getCssTransitionType = function (className) {\n  /* istanbul ignore if */\n  if (!transitionEndEvent ||\n  // skip CSS transitions if page is not visible -\n  // this solves the issue of transitionend events not\n  // firing until the page is visible again.\n  // pageVisibility API is supported in IE10+, same as\n  // CSS transitions.\n  document.hidden ||\n  // explicit js-only transition\n  this.hooks && this.hooks.css === false ||\n  // element is hidden\n  isHidden(this.el)) {\n    return;\n  }\n  var type = this.type || this.typeCache[className];\n  if (type) return type;\n  var inlineStyles = this.el.style;\n  var computedStyles = window.getComputedStyle(this.el);\n  var transDuration = inlineStyles[transDurationProp] || computedStyles[transDurationProp];\n  if (transDuration && transDuration !== '0s') {\n    type = TYPE_TRANSITION;\n  } else {\n    var animDuration = inlineStyles[animDurationProp] || computedStyles[animDurationProp];\n    if (animDuration && animDuration !== '0s') {\n      type = TYPE_ANIMATION;\n    }\n  }\n  if (type) {\n    this.typeCache[className] = type;\n  }\n  return type;\n};\n\n/**\n * Setup a CSS transitionend/animationend callback.\n *\n * @param {String} event\n * @param {Function} cb\n */\n\np$1.setupCssCb = function (event, cb) {\n  this.pendingCssEvent = event;\n  var self = this;\n  var el = this.el;\n  var onEnd = this.pendingCssCb = function (e) {\n    if (e.target === el) {\n      off(el, event, onEnd);\n      self.pendingCssEvent = self.pendingCssCb = null;\n      if (!self.pendingJsCb && cb) {\n        cb();\n      }\n    }\n  };\n  on(el, event, onEnd);\n};\n\n/**\n * Check if an element is hidden - in that case we can just\n * skip the transition alltogether.\n *\n * @param {Element} el\n * @return {Boolean}\n */\n\nfunction isHidden(el) {\n  if (/svg$/.test(el.namespaceURI)) {\n    // SVG elements do not have offset(Width|Height)\n    // so we need to check the client rect\n    var rect = el.getBoundingClientRect();\n    return !(rect.width || rect.height);\n  } else {\n    return !(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n  }\n}\n\nvar transition$1 = {\n\n  priority: TRANSITION,\n\n  update: function update(id, oldId) {\n    var el = this.el;\n    // resolve on owner vm\n    var hooks = resolveAsset(this.vm.$options, 'transitions', id);\n    id = id || 'v';\n    oldId = oldId || 'v';\n    el.__v_trans = new Transition(el, id, hooks, this.vm);\n    removeClass(el, oldId + '-transition');\n    addClass(el, id + '-transition');\n  }\n};\n\nvar internalDirectives = {\n  style: style,\n  'class': vClass,\n  component: component,\n  prop: propDef,\n  transition: transition$1\n};\n\n// special binding prefixes\nvar bindRE = /^v-bind:|^:/;\nvar onRE = /^v-on:|^@/;\nvar dirAttrRE = /^v-([^:]+)(?:$|:(.*)$)/;\nvar modifierRE = /\\.[^\\.]+/g;\nvar transitionRE = /^(v-bind:|:)?transition$/;\n\n// default directive priority\nvar DEFAULT_PRIORITY = 1000;\nvar DEFAULT_TERMINAL_PRIORITY = 2000;\n\n/**\n * Compile a template and return a reusable composite link\n * function, which recursively contains more link functions\n * inside. This top level compile function would normally\n * be called on instance root nodes, but can also be used\n * for partial compilation if the partial argument is true.\n *\n * The returned composite link function, when called, will\n * return an unlink function that tearsdown all directives\n * created during the linking phase.\n *\n * @param {Element|DocumentFragment} el\n * @param {Object} options\n * @param {Boolean} partial\n * @return {Function}\n */\n\nfunction compile(el, options, partial) {\n  // link function for the node itself.\n  var nodeLinkFn = partial || !options._asComponent ? compileNode(el, options) : null;\n  // link function for the childNodes\n  var childLinkFn = !(nodeLinkFn && nodeLinkFn.terminal) && !isScript(el) && el.hasChildNodes() ? compileNodeList(el.childNodes, options) : null;\n\n  /**\n   * A composite linker function to be called on a already\n   * compiled piece of DOM, which instantiates all directive\n   * instances.\n   *\n   * @param {Vue} vm\n   * @param {Element|DocumentFragment} el\n   * @param {Vue} [host] - host vm of transcluded content\n   * @param {Object} [scope] - v-for scope\n   * @param {Fragment} [frag] - link context fragment\n   * @return {Function|undefined}\n   */\n\n  return function compositeLinkFn(vm, el, host, scope, frag) {\n    // cache childNodes before linking parent, fix #657\n    var childNodes = toArray(el.childNodes);\n    // link\n    var dirs = linkAndCapture(function compositeLinkCapturer() {\n      if (nodeLinkFn) nodeLinkFn(vm, el, host, scope, frag);\n      if (childLinkFn) childLinkFn(vm, childNodes, host, scope, frag);\n    }, vm);\n    return makeUnlinkFn(vm, dirs);\n  };\n}\n\n/**\n * Apply a linker to a vm/element pair and capture the\n * directives created during the process.\n *\n * @param {Function} linker\n * @param {Vue} vm\n */\n\nfunction linkAndCapture(linker, vm) {\n  /* istanbul ignore if */\n  if ('production' === 'production') {\n    // reset directives before every capture in production\n    // mode, so that when unlinking we don't need to splice\n    // them out (which turns out to be a perf hit).\n    // they are kept in development mode because they are\n    // useful for Vue's own tests.\n    vm._directives = [];\n  }\n  var originalDirCount = vm._directives.length;\n  linker();\n  var dirs = vm._directives.slice(originalDirCount);\n  sortDirectives(dirs);\n  for (var i = 0, l = dirs.length; i < l; i++) {\n    dirs[i]._bind();\n  }\n  return dirs;\n}\n\n/**\n * sort directives by priority (stable sort)\n *\n * @param {Array} dirs\n */\nfunction sortDirectives(dirs) {\n  if (dirs.length === 0) return;\n\n  var groupedMap = {};\n  var i, j, k, l;\n  for (i = 0, j = dirs.length; i < j; i++) {\n    var dir = dirs[i];\n    var priority = dir.descriptor.def.priority || DEFAULT_PRIORITY;\n    var array = groupedMap[priority];\n    if (!array) {\n      array = groupedMap[priority] = [];\n    }\n    array.push(dir);\n  }\n\n  var index = 0;\n  var priorities = Object.keys(groupedMap).sort(function (a, b) {\n    return a > b ? -1 : a === b ? 0 : 1;\n  });\n  for (i = 0, j = priorities.length; i < j; i++) {\n    var group = groupedMap[priorities[i]];\n    for (k = 0, l = group.length; k < l; k++) {\n      dirs[index++] = group[k];\n    }\n  }\n}\n\n/**\n * Linker functions return an unlink function that\n * tearsdown all directives instances generated during\n * the process.\n *\n * We create unlink functions with only the necessary\n * information to avoid retaining additional closures.\n *\n * @param {Vue} vm\n * @param {Array} dirs\n * @param {Vue} [context]\n * @param {Array} [contextDirs]\n * @return {Function}\n */\n\nfunction makeUnlinkFn(vm, dirs, context, contextDirs) {\n  function unlink(destroying) {\n    teardownDirs(vm, dirs, destroying);\n    if (context && contextDirs) {\n      teardownDirs(context, contextDirs);\n    }\n  }\n  // expose linked directives\n  unlink.dirs = dirs;\n  return unlink;\n}\n\n/**\n * Teardown partial linked directives.\n *\n * @param {Vue} vm\n * @param {Array} dirs\n * @param {Boolean} destroying\n */\n\nfunction teardownDirs(vm, dirs, destroying) {\n  var i = dirs.length;\n  while (i--) {\n    dirs[i]._teardown();\n    if ('production' !== 'production' && !destroying) {}\n  }\n}\n\n/**\n * Compile link props on an instance.\n *\n * @param {Vue} vm\n * @param {Element} el\n * @param {Object} props\n * @param {Object} [scope]\n * @return {Function}\n */\n\nfunction compileAndLinkProps(vm, el, props, scope) {\n  var propsLinkFn = compileProps(el, props, vm);\n  var propDirs = linkAndCapture(function () {\n    propsLinkFn(vm, scope);\n  }, vm);\n  return makeUnlinkFn(vm, propDirs);\n}\n\n/**\n * Compile the root element of an instance.\n *\n * 1. attrs on context container (context scope)\n * 2. attrs on the component template root node, if\n *    replace:true (child scope)\n *\n * If this is a fragment instance, we only need to compile 1.\n *\n * @param {Element} el\n * @param {Object} options\n * @param {Object} contextOptions\n * @return {Function}\n */\n\nfunction compileRoot(el, options, contextOptions) {\n  var containerAttrs = options._containerAttrs;\n  var replacerAttrs = options._replacerAttrs;\n  var contextLinkFn, replacerLinkFn;\n\n  // only need to compile other attributes for\n  // non-fragment instances\n  if (el.nodeType !== 11) {\n    // for components, container and replacer need to be\n    // compiled separately and linked in different scopes.\n    if (options._asComponent) {\n      // 2. container attributes\n      if (containerAttrs && contextOptions) {\n        contextLinkFn = compileDirectives(containerAttrs, contextOptions);\n      }\n      if (replacerAttrs) {\n        // 3. replacer attributes\n        replacerLinkFn = compileDirectives(replacerAttrs, options);\n      }\n    } else {\n      // non-component, just compile as a normal element.\n      replacerLinkFn = compileDirectives(el.attributes, options);\n    }\n  } else if ('production' !== 'production' && containerAttrs) {}\n\n  options._containerAttrs = options._replacerAttrs = null;\n  return function rootLinkFn(vm, el, scope) {\n    // link context scope dirs\n    var context = vm._context;\n    var contextDirs;\n    if (context && contextLinkFn) {\n      contextDirs = linkAndCapture(function () {\n        contextLinkFn(context, el, null, scope);\n      }, context);\n    }\n\n    // link self\n    var selfDirs = linkAndCapture(function () {\n      if (replacerLinkFn) replacerLinkFn(vm, el);\n    }, vm);\n\n    // return the unlink function that tearsdown context\n    // container directives.\n    return makeUnlinkFn(vm, selfDirs, context, contextDirs);\n  };\n}\n\n/**\n * Compile a node and return a nodeLinkFn based on the\n * node type.\n *\n * @param {Node} node\n * @param {Object} options\n * @return {Function|null}\n */\n\nfunction compileNode(node, options) {\n  var type = node.nodeType;\n  if (type === 1 && !isScript(node)) {\n    return compileElement(node, options);\n  } else if (type === 3 && node.data.trim()) {\n    return compileTextNode(node, options);\n  } else {\n    return null;\n  }\n}\n\n/**\n * Compile an element and return a nodeLinkFn.\n *\n * @param {Element} el\n * @param {Object} options\n * @return {Function|null}\n */\n\nfunction compileElement(el, options) {\n  // preprocess textareas.\n  // textarea treats its text content as the initial value.\n  // just bind it as an attr directive for value.\n  if (el.tagName === 'TEXTAREA') {\n    // a textarea which has v-pre attr should skip complie.\n    if (getAttr(el, 'v-pre') !== null) {\n      return skip;\n    }\n    var tokens = parseText(el.value);\n    if (tokens) {\n      el.setAttribute(':value', tokensToExp(tokens));\n      el.value = '';\n    }\n  }\n  var linkFn;\n  var hasAttrs = el.hasAttributes();\n  var attrs = hasAttrs && toArray(el.attributes);\n  // check terminal directives (for & if)\n  if (hasAttrs) {\n    linkFn = checkTerminalDirectives(el, attrs, options);\n  }\n  // check element directives\n  if (!linkFn) {\n    linkFn = checkElementDirectives(el, options);\n  }\n  // check component\n  if (!linkFn) {\n    linkFn = checkComponent(el, options);\n  }\n  // normal directives\n  if (!linkFn && hasAttrs) {\n    linkFn = compileDirectives(attrs, options);\n  }\n  return linkFn;\n}\n\n/**\n * Compile a textNode and return a nodeLinkFn.\n *\n * @param {TextNode} node\n * @param {Object} options\n * @return {Function|null} textNodeLinkFn\n */\n\nfunction compileTextNode(node, options) {\n  // skip marked text nodes\n  if (node._skip) {\n    return removeText;\n  }\n\n  var tokens = parseText(node.wholeText);\n  if (!tokens) {\n    return null;\n  }\n\n  // mark adjacent text nodes as skipped,\n  // because we are using node.wholeText to compile\n  // all adjacent text nodes together. This fixes\n  // issues in IE where sometimes it splits up a single\n  // text node into multiple ones.\n  var next = node.nextSibling;\n  while (next && next.nodeType === 3) {\n    next._skip = true;\n    next = next.nextSibling;\n  }\n\n  var frag = document.createDocumentFragment();\n  var el, token;\n  for (var i = 0, l = tokens.length; i < l; i++) {\n    token = tokens[i];\n    el = token.tag ? processTextToken(token, options) : document.createTextNode(token.value);\n    frag.appendChild(el);\n  }\n  return makeTextNodeLinkFn(tokens, frag, options);\n}\n\n/**\n * Linker for an skipped text node.\n *\n * @param {Vue} vm\n * @param {Text} node\n */\n\nfunction removeText(vm, node) {\n  remove(node);\n}\n\n/**\n * Process a single text token.\n *\n * @param {Object} token\n * @param {Object} options\n * @return {Node}\n */\n\nfunction processTextToken(token, options) {\n  var el;\n  if (token.oneTime) {\n    el = document.createTextNode(token.value);\n  } else {\n    if (token.html) {\n      el = document.createComment('v-html');\n      setTokenType('html');\n    } else {\n      // IE will clean up empty textNodes during\n      // frag.cloneNode(true), so we have to give it\n      // something here...\n      el = document.createTextNode(' ');\n      setTokenType('text');\n    }\n  }\n  function setTokenType(type) {\n    if (token.descriptor) return;\n    var parsed = parseDirective(token.value);\n    token.descriptor = {\n      name: type,\n      def: directives[type],\n      expression: parsed.expression,\n      filters: parsed.filters\n    };\n  }\n  return el;\n}\n\n/**\n * Build a function that processes a textNode.\n *\n * @param {Array<Object>} tokens\n * @param {DocumentFragment} frag\n */\n\nfunction makeTextNodeLinkFn(tokens, frag) {\n  return function textNodeLinkFn(vm, el, host, scope) {\n    var fragClone = frag.cloneNode(true);\n    var childNodes = toArray(fragClone.childNodes);\n    var token, value, node;\n    for (var i = 0, l = tokens.length; i < l; i++) {\n      token = tokens[i];\n      value = token.value;\n      if (token.tag) {\n        node = childNodes[i];\n        if (token.oneTime) {\n          value = (scope || vm).$eval(value);\n          if (token.html) {\n            replace(node, parseTemplate(value, true));\n          } else {\n            node.data = _toString(value);\n          }\n        } else {\n          vm._bindDir(token.descriptor, node, host, scope);\n        }\n      }\n    }\n    replace(el, fragClone);\n  };\n}\n\n/**\n * Compile a node list and return a childLinkFn.\n *\n * @param {NodeList} nodeList\n * @param {Object} options\n * @return {Function|undefined}\n */\n\nfunction compileNodeList(nodeList, options) {\n  var linkFns = [];\n  var nodeLinkFn, childLinkFn, node;\n  for (var i = 0, l = nodeList.length; i < l; i++) {\n    node = nodeList[i];\n    nodeLinkFn = compileNode(node, options);\n    childLinkFn = !(nodeLinkFn && nodeLinkFn.terminal) && node.tagName !== 'SCRIPT' && node.hasChildNodes() ? compileNodeList(node.childNodes, options) : null;\n    linkFns.push(nodeLinkFn, childLinkFn);\n  }\n  return linkFns.length ? makeChildLinkFn(linkFns) : null;\n}\n\n/**\n * Make a child link function for a node's childNodes.\n *\n * @param {Array<Function>} linkFns\n * @return {Function} childLinkFn\n */\n\nfunction makeChildLinkFn(linkFns) {\n  return function childLinkFn(vm, nodes, host, scope, frag) {\n    var node, nodeLinkFn, childrenLinkFn;\n    for (var i = 0, n = 0, l = linkFns.length; i < l; n++) {\n      node = nodes[n];\n      nodeLinkFn = linkFns[i++];\n      childrenLinkFn = linkFns[i++];\n      // cache childNodes before linking parent, fix #657\n      var childNodes = toArray(node.childNodes);\n      if (nodeLinkFn) {\n        nodeLinkFn(vm, node, host, scope, frag);\n      }\n      if (childrenLinkFn) {\n        childrenLinkFn(vm, childNodes, host, scope, frag);\n      }\n    }\n  };\n}\n\n/**\n * Check for element directives (custom elements that should\n * be resovled as terminal directives).\n *\n * @param {Element} el\n * @param {Object} options\n */\n\nfunction checkElementDirectives(el, options) {\n  var tag = el.tagName.toLowerCase();\n  if (commonTagRE.test(tag)) {\n    return;\n  }\n  var def = resolveAsset(options, 'elementDirectives', tag);\n  if (def) {\n    return makeTerminalNodeLinkFn(el, tag, '', options, def);\n  }\n}\n\n/**\n * Check if an element is a component. If yes, return\n * a component link function.\n *\n * @param {Element} el\n * @param {Object} options\n * @return {Function|undefined}\n */\n\nfunction checkComponent(el, options) {\n  var component = checkComponentAttr(el, options);\n  if (component) {\n    var ref = findRef(el);\n    var descriptor = {\n      name: 'component',\n      ref: ref,\n      expression: component.id,\n      def: internalDirectives.component,\n      modifiers: {\n        literal: !component.dynamic\n      }\n    };\n    var componentLinkFn = function componentLinkFn(vm, el, host, scope, frag) {\n      if (ref) {\n        defineReactive((scope || vm).$refs, ref, null);\n      }\n      vm._bindDir(descriptor, el, host, scope, frag);\n    };\n    componentLinkFn.terminal = true;\n    return componentLinkFn;\n  }\n}\n\n/**\n * Check an element for terminal directives in fixed order.\n * If it finds one, return a terminal link function.\n *\n * @param {Element} el\n * @param {Array} attrs\n * @param {Object} options\n * @return {Function} terminalLinkFn\n */\n\nfunction checkTerminalDirectives(el, attrs, options) {\n  // skip v-pre\n  if (getAttr(el, 'v-pre') !== null) {\n    return skip;\n  }\n  // skip v-else block, but only if following v-if\n  if (el.hasAttribute('v-else')) {\n    var prev = el.previousElementSibling;\n    if (prev && prev.hasAttribute('v-if')) {\n      return skip;\n    }\n  }\n\n  var attr, name, value, modifiers, matched, dirName, rawName, arg, def, termDef;\n  for (var i = 0, j = attrs.length; i < j; i++) {\n    attr = attrs[i];\n    name = attr.name.replace(modifierRE, '');\n    if (matched = name.match(dirAttrRE)) {\n      def = resolveAsset(options, 'directives', matched[1]);\n      if (def && def.terminal) {\n        if (!termDef || (def.priority || DEFAULT_TERMINAL_PRIORITY) > termDef.priority) {\n          termDef = def;\n          rawName = attr.name;\n          modifiers = parseModifiers(attr.name);\n          value = attr.value;\n          dirName = matched[1];\n          arg = matched[2];\n        }\n      }\n    }\n  }\n\n  if (termDef) {\n    return makeTerminalNodeLinkFn(el, dirName, value, options, termDef, rawName, arg, modifiers);\n  }\n}\n\nfunction skip() {}\nskip.terminal = true;\n\n/**\n * Build a node link function for a terminal directive.\n * A terminal link function terminates the current\n * compilation recursion and handles compilation of the\n * subtree in the directive.\n *\n * @param {Element} el\n * @param {String} dirName\n * @param {String} value\n * @param {Object} options\n * @param {Object} def\n * @param {String} [rawName]\n * @param {String} [arg]\n * @param {Object} [modifiers]\n * @return {Function} terminalLinkFn\n */\n\nfunction makeTerminalNodeLinkFn(el, dirName, value, options, def, rawName, arg, modifiers) {\n  var parsed = parseDirective(value);\n  var descriptor = {\n    name: dirName,\n    arg: arg,\n    expression: parsed.expression,\n    filters: parsed.filters,\n    raw: value,\n    attr: rawName,\n    modifiers: modifiers,\n    def: def\n  };\n  // check ref for v-for, v-if and router-view\n  if (dirName === 'for' || dirName === 'if' || dirName === 'router-view') {\n    descriptor.ref = findRef(el);\n  }\n  var fn = function terminalNodeLinkFn(vm, el, host, scope, frag) {\n    if (descriptor.ref) {\n      defineReactive((scope || vm).$refs, descriptor.ref, null);\n    }\n    vm._bindDir(descriptor, el, host, scope, frag);\n  };\n  fn.terminal = true;\n  return fn;\n}\n\n/**\n * Compile the directives on an element and return a linker.\n *\n * @param {Array|NamedNodeMap} attrs\n * @param {Object} options\n * @return {Function}\n */\n\nfunction compileDirectives(attrs, options) {\n  var i = attrs.length;\n  var dirs = [];\n  var attr, name, value, rawName, rawValue, dirName, arg, modifiers, dirDef, tokens, matched;\n  while (i--) {\n    attr = attrs[i];\n    name = rawName = attr.name;\n    value = rawValue = attr.value;\n    tokens = parseText(value);\n    // reset arg\n    arg = null;\n    // check modifiers\n    modifiers = parseModifiers(name);\n    name = name.replace(modifierRE, '');\n\n    // attribute interpolations\n    if (tokens) {\n      value = tokensToExp(tokens);\n      arg = name;\n      pushDir('bind', directives.bind, tokens);\n      // warn against mixing mustaches with v-bind\n      if ('production' !== 'production') {}\n    } else\n\n      // special attribute: transition\n      if (transitionRE.test(name)) {\n        modifiers.literal = !bindRE.test(name);\n        pushDir('transition', internalDirectives.transition);\n      } else\n\n        // event handlers\n        if (onRE.test(name)) {\n          arg = name.replace(onRE, '');\n          pushDir('on', directives.on);\n        } else\n\n          // attribute bindings\n          if (bindRE.test(name)) {\n            dirName = name.replace(bindRE, '');\n            if (dirName === 'style' || dirName === 'class') {\n              pushDir(dirName, internalDirectives[dirName]);\n            } else {\n              arg = dirName;\n              pushDir('bind', directives.bind);\n            }\n          } else\n\n            // normal directives\n            if (matched = name.match(dirAttrRE)) {\n              dirName = matched[1];\n              arg = matched[2];\n\n              // skip v-else (when used with v-show)\n              if (dirName === 'else') {\n                continue;\n              }\n\n              dirDef = resolveAsset(options, 'directives', dirName, true);\n              if (dirDef) {\n                pushDir(dirName, dirDef);\n              }\n            }\n  }\n\n  /**\n   * Push a directive.\n   *\n   * @param {String} dirName\n   * @param {Object|Function} def\n   * @param {Array} [interpTokens]\n   */\n\n  function pushDir(dirName, def, interpTokens) {\n    var hasOneTimeToken = interpTokens && hasOneTime(interpTokens);\n    var parsed = !hasOneTimeToken && parseDirective(value);\n    dirs.push({\n      name: dirName,\n      attr: rawName,\n      raw: rawValue,\n      def: def,\n      arg: arg,\n      modifiers: modifiers,\n      // conversion from interpolation strings with one-time token\n      // to expression is differed until directive bind time so that we\n      // have access to the actual vm context for one-time bindings.\n      expression: parsed && parsed.expression,\n      filters: parsed && parsed.filters,\n      interp: interpTokens,\n      hasOneTime: hasOneTimeToken\n    });\n  }\n\n  if (dirs.length) {\n    return makeNodeLinkFn(dirs);\n  }\n}\n\n/**\n * Parse modifiers from directive attribute name.\n *\n * @param {String} name\n * @return {Object}\n */\n\nfunction parseModifiers(name) {\n  var res = Object.create(null);\n  var match = name.match(modifierRE);\n  if (match) {\n    var i = match.length;\n    while (i--) {\n      res[match[i].slice(1)] = true;\n    }\n  }\n  return res;\n}\n\n/**\n * Build a link function for all directives on a single node.\n *\n * @param {Array} directives\n * @return {Function} directivesLinkFn\n */\n\nfunction makeNodeLinkFn(directives) {\n  return function nodeLinkFn(vm, el, host, scope, frag) {\n    // reverse apply because it's sorted low to high\n    var i = directives.length;\n    while (i--) {\n      vm._bindDir(directives[i], el, host, scope, frag);\n    }\n  };\n}\n\n/**\n * Check if an interpolation string contains one-time tokens.\n *\n * @param {Array} tokens\n * @return {Boolean}\n */\n\nfunction hasOneTime(tokens) {\n  var i = tokens.length;\n  while (i--) {\n    if (tokens[i].oneTime) return true;\n  }\n}\n\nfunction isScript(el) {\n  return el.tagName === 'SCRIPT' && (!el.hasAttribute('type') || el.getAttribute('type') === 'text/javascript');\n}\n\nvar specialCharRE = /[^\\w\\-:\\.]/;\n\n/**\n * Process an element or a DocumentFragment based on a\n * instance option object. This allows us to transclude\n * a template node/fragment before the instance is created,\n * so the processed fragment can then be cloned and reused\n * in v-for.\n *\n * @param {Element} el\n * @param {Object} options\n * @return {Element|DocumentFragment}\n */\n\nfunction transclude(el, options) {\n  // extract container attributes to pass them down\n  // to compiler, because they need to be compiled in\n  // parent scope. we are mutating the options object here\n  // assuming the same object will be used for compile\n  // right after this.\n  if (options) {\n    options._containerAttrs = extractAttrs(el);\n  }\n  // for template tags, what we want is its content as\n  // a documentFragment (for fragment instances)\n  if (isTemplate(el)) {\n    el = parseTemplate(el);\n  }\n  if (options) {\n    if (options._asComponent && !options.template) {\n      options.template = '<slot></slot>';\n    }\n    if (options.template) {\n      options._content = extractContent(el);\n      el = transcludeTemplate(el, options);\n    }\n  }\n  if (isFragment(el)) {\n    // anchors for fragment instance\n    // passing in `persist: true` to avoid them being\n    // discarded by IE during template cloning\n    prepend(createAnchor('v-start', true), el);\n    el.appendChild(createAnchor('v-end', true));\n  }\n  return el;\n}\n\n/**\n * Process the template option.\n * If the replace option is true this will swap the $el.\n *\n * @param {Element} el\n * @param {Object} options\n * @return {Element|DocumentFragment}\n */\n\nfunction transcludeTemplate(el, options) {\n  var template = options.template;\n  var frag = parseTemplate(template, true);\n  if (frag) {\n    var replacer = frag.firstChild;\n    if (!replacer) {\n      return frag;\n    }\n    var tag = replacer.tagName && replacer.tagName.toLowerCase();\n    if (options.replace) {\n      /* istanbul ignore if */\n      if (el === document.body) {\n        'production' !== 'production' && warn('You are mounting an instance with a template to ' + '<body>. This will replace <body> entirely. You ' + 'should probably use `replace: false` here.');\n      }\n      // there are many cases where the instance must\n      // become a fragment instance: basically anything that\n      // can create more than 1 root nodes.\n      if (\n      // multi-children template\n      frag.childNodes.length > 1 ||\n      // non-element template\n      replacer.nodeType !== 1 ||\n      // single nested component\n      tag === 'component' || resolveAsset(options, 'components', tag) || hasBindAttr(replacer, 'is') ||\n      // element directive\n      resolveAsset(options, 'elementDirectives', tag) ||\n      // for block\n      replacer.hasAttribute('v-for') ||\n      // if block\n      replacer.hasAttribute('v-if')) {\n        return frag;\n      } else {\n        options._replacerAttrs = extractAttrs(replacer);\n        mergeAttrs(el, replacer);\n        return replacer;\n      }\n    } else {\n      el.appendChild(frag);\n      return el;\n    }\n  } else {\n    'production' !== 'production' && warn('Invalid template option: ' + template);\n  }\n}\n\n/**\n * Helper to extract a component container's attributes\n * into a plain object array.\n *\n * @param {Element} el\n * @return {Array}\n */\n\nfunction extractAttrs(el) {\n  if (el.nodeType === 1 && el.hasAttributes()) {\n    return toArray(el.attributes);\n  }\n}\n\n/**\n * Merge the attributes of two elements, and make sure\n * the class names are merged properly.\n *\n * @param {Element} from\n * @param {Element} to\n */\n\nfunction mergeAttrs(from, to) {\n  var attrs = from.attributes;\n  var i = attrs.length;\n  var name, value;\n  while (i--) {\n    name = attrs[i].name;\n    value = attrs[i].value;\n    if (!to.hasAttribute(name) && !specialCharRE.test(name)) {\n      to.setAttribute(name, value);\n    } else if (name === 'class' && !parseText(value) && (value = value.trim())) {\n      value.split(/\\s+/).forEach(function (cls) {\n        addClass(to, cls);\n      });\n    }\n  }\n}\n\n/**\n * Scan and determine slot content distribution.\n * We do this during transclusion instead at compile time so that\n * the distribution is decoupled from the compilation order of\n * the slots.\n *\n * @param {Element|DocumentFragment} template\n * @param {Element} content\n * @param {Vue} vm\n */\n\nfunction resolveSlots(vm, content) {\n  if (!content) {\n    return;\n  }\n  var contents = vm._slotContents = Object.create(null);\n  var el, name;\n  for (var i = 0, l = content.children.length; i < l; i++) {\n    el = content.children[i];\n    /* eslint-disable no-cond-assign */\n    if (name = el.getAttribute('slot')) {\n      (contents[name] || (contents[name] = [])).push(el);\n    }\n    /* eslint-enable no-cond-assign */\n    if ('production' !== 'production' && getBindAttr(el, 'slot')) {}\n  }\n  for (name in contents) {\n    contents[name] = extractFragment(contents[name], content);\n  }\n  if (content.hasChildNodes()) {\n    var nodes = content.childNodes;\n    if (nodes.length === 1 && nodes[0].nodeType === 3 && !nodes[0].data.trim()) {\n      return;\n    }\n    contents['default'] = extractFragment(content.childNodes, content);\n  }\n}\n\n/**\n * Extract qualified content nodes from a node list.\n *\n * @param {NodeList} nodes\n * @return {DocumentFragment}\n */\n\nfunction extractFragment(nodes, parent) {\n  var frag = document.createDocumentFragment();\n  nodes = toArray(nodes);\n  for (var i = 0, l = nodes.length; i < l; i++) {\n    var node = nodes[i];\n    if (isTemplate(node) && !node.hasAttribute('v-if') && !node.hasAttribute('v-for')) {\n      parent.removeChild(node);\n      node = parseTemplate(node, true);\n    }\n    frag.appendChild(node);\n  }\n  return frag;\n}\n\n\n\nvar compiler = Object.freeze({\n\tcompile: compile,\n\tcompileAndLinkProps: compileAndLinkProps,\n\tcompileRoot: compileRoot,\n\ttransclude: transclude,\n\tresolveSlots: resolveSlots\n});\n\nfunction stateMixin (Vue) {\n  /**\n   * Accessor for `$data` property, since setting $data\n   * requires observing the new object and updating\n   * proxied properties.\n   */\n\n  Object.defineProperty(Vue.prototype, '$data', {\n    get: function get() {\n      return this._data;\n    },\n    set: function set(newData) {\n      if (newData !== this._data) {\n        this._setData(newData);\n      }\n    }\n  });\n\n  /**\n   * Setup the scope of an instance, which contains:\n   * - observed data\n   * - computed properties\n   * - user methods\n   * - meta properties\n   */\n\n  Vue.prototype._initState = function () {\n    this._initProps();\n    this._initMeta();\n    this._initMethods();\n    this._initData();\n    this._initComputed();\n  };\n\n  /**\n   * Initialize props.\n   */\n\n  Vue.prototype._initProps = function () {\n    var options = this.$options;\n    var el = options.el;\n    var props = options.props;\n    if (props && !el) {\n      'production' !== 'production' && warn('Props will not be compiled if no `el` option is ' + 'provided at instantiation.', this);\n    }\n    // make sure to convert string selectors into element now\n    el = options.el = query(el);\n    this._propsUnlinkFn = el && el.nodeType === 1 && props\n    // props must be linked in proper scope if inside v-for\n    ? compileAndLinkProps(this, el, props, this._scope) : null;\n  };\n\n  /**\n   * Initialize the data.\n   */\n\n  Vue.prototype._initData = function () {\n    var dataFn = this.$options.data;\n    var data = this._data = dataFn ? dataFn() : {};\n    if (!isPlainObject(data)) {\n      data = {};\n      'production' !== 'production' && warn('data functions should return an object.', this);\n    }\n    var props = this._props;\n    // proxy data on instance\n    var keys = Object.keys(data);\n    var i, key;\n    i = keys.length;\n    while (i--) {\n      key = keys[i];\n      // there are two scenarios where we can proxy a data key:\n      // 1. it's not already defined as a prop\n      // 2. it's provided via a instantiation option AND there are no\n      //    template prop present\n      if (!props || !hasOwn(props, key)) {\n        this._proxy(key);\n      } else if ('production' !== 'production') {}\n    }\n    // observe data\n    observe(data, this);\n  };\n\n  /**\n   * Swap the instance's $data. Called in $data's setter.\n   *\n   * @param {Object} newData\n   */\n\n  Vue.prototype._setData = function (newData) {\n    newData = newData || {};\n    var oldData = this._data;\n    this._data = newData;\n    var keys, key, i;\n    // unproxy keys not present in new data\n    keys = Object.keys(oldData);\n    i = keys.length;\n    while (i--) {\n      key = keys[i];\n      if (!(key in newData)) {\n        this._unproxy(key);\n      }\n    }\n    // proxy keys not already proxied,\n    // and trigger change for changed values\n    keys = Object.keys(newData);\n    i = keys.length;\n    while (i--) {\n      key = keys[i];\n      if (!hasOwn(this, key)) {\n        // new property\n        this._proxy(key);\n      }\n    }\n    oldData.__ob__.removeVm(this);\n    observe(newData, this);\n    this._digest();\n  };\n\n  /**\n   * Proxy a property, so that\n   * vm.prop === vm._data.prop\n   *\n   * @param {String} key\n   */\n\n  Vue.prototype._proxy = function (key) {\n    if (!isReserved(key)) {\n      // need to store ref to self here\n      // because these getter/setters might\n      // be called by child scopes via\n      // prototype inheritance.\n      var self = this;\n      Object.defineProperty(self, key, {\n        configurable: true,\n        enumerable: true,\n        get: function proxyGetter() {\n          return self._data[key];\n        },\n        set: function proxySetter(val) {\n          self._data[key] = val;\n        }\n      });\n    }\n  };\n\n  /**\n   * Unproxy a property.\n   *\n   * @param {String} key\n   */\n\n  Vue.prototype._unproxy = function (key) {\n    if (!isReserved(key)) {\n      delete this[key];\n    }\n  };\n\n  /**\n   * Force update on every watcher in scope.\n   */\n\n  Vue.prototype._digest = function () {\n    for (var i = 0, l = this._watchers.length; i < l; i++) {\n      this._watchers[i].update(true); // shallow updates\n    }\n  };\n\n  /**\n   * Setup computed properties. They are essentially\n   * special getter/setters\n   */\n\n  function noop() {}\n  Vue.prototype._initComputed = function () {\n    var computed = this.$options.computed;\n    if (computed) {\n      for (var key in computed) {\n        var userDef = computed[key];\n        var def = {\n          enumerable: true,\n          configurable: true\n        };\n        if (typeof userDef === 'function') {\n          def.get = makeComputedGetter(userDef, this);\n          def.set = noop;\n        } else {\n          def.get = userDef.get ? userDef.cache !== false ? makeComputedGetter(userDef.get, this) : bind(userDef.get, this) : noop;\n          def.set = userDef.set ? bind(userDef.set, this) : noop;\n        }\n        Object.defineProperty(this, key, def);\n      }\n    }\n  };\n\n  function makeComputedGetter(getter, owner) {\n    var watcher = new Watcher(owner, getter, null, {\n      lazy: true\n    });\n    return function computedGetter() {\n      if (watcher.dirty) {\n        watcher.evaluate();\n      }\n      if (Dep.target) {\n        watcher.depend();\n      }\n      return watcher.value;\n    };\n  }\n\n  /**\n   * Setup instance methods. Methods must be bound to the\n   * instance since they might be passed down as a prop to\n   * child components.\n   */\n\n  Vue.prototype._initMethods = function () {\n    var methods = this.$options.methods;\n    if (methods) {\n      for (var key in methods) {\n        this[key] = bind(methods[key], this);\n      }\n    }\n  };\n\n  /**\n   * Initialize meta information like $index, $key & $value.\n   */\n\n  Vue.prototype._initMeta = function () {\n    var metas = this.$options._meta;\n    if (metas) {\n      for (var key in metas) {\n        defineReactive(this, key, metas[key]);\n      }\n    }\n  };\n}\n\nvar eventRE = /^v-on:|^@/;\n\nfunction eventsMixin (Vue) {\n  /**\n   * Setup the instance's option events & watchers.\n   * If the value is a string, we pull it from the\n   * instance's methods by name.\n   */\n\n  Vue.prototype._initEvents = function () {\n    var options = this.$options;\n    if (options._asComponent) {\n      registerComponentEvents(this, options.el);\n    }\n    registerCallbacks(this, '$on', options.events);\n    registerCallbacks(this, '$watch', options.watch);\n  };\n\n  /**\n   * Register v-on events on a child component\n   *\n   * @param {Vue} vm\n   * @param {Element} el\n   */\n\n  function registerComponentEvents(vm, el) {\n    var attrs = el.attributes;\n    var name, value, handler;\n    for (var i = 0, l = attrs.length; i < l; i++) {\n      name = attrs[i].name;\n      if (eventRE.test(name)) {\n        name = name.replace(eventRE, '');\n        // force the expression into a statement so that\n        // it always dynamically resolves the method to call (#2670)\n        // kinda ugly hack, but does the job.\n        value = attrs[i].value;\n        if (isSimplePath(value)) {\n          value += '.apply(this, $arguments)';\n        }\n        handler = (vm._scope || vm._context).$eval(value, true);\n        handler._fromParent = true;\n        vm.$on(name.replace(eventRE), handler);\n      }\n    }\n  }\n\n  /**\n   * Register callbacks for option events and watchers.\n   *\n   * @param {Vue} vm\n   * @param {String} action\n   * @param {Object} hash\n   */\n\n  function registerCallbacks(vm, action, hash) {\n    if (!hash) return;\n    var handlers, key, i, j;\n    for (key in hash) {\n      handlers = hash[key];\n      if (isArray(handlers)) {\n        for (i = 0, j = handlers.length; i < j; i++) {\n          register(vm, action, key, handlers[i]);\n        }\n      } else {\n        register(vm, action, key, handlers);\n      }\n    }\n  }\n\n  /**\n   * Helper to register an event/watch callback.\n   *\n   * @param {Vue} vm\n   * @param {String} action\n   * @param {String} key\n   * @param {Function|String|Object} handler\n   * @param {Object} [options]\n   */\n\n  function register(vm, action, key, handler, options) {\n    var type = typeof handler;\n    if (type === 'function') {\n      vm[action](key, handler, options);\n    } else if (type === 'string') {\n      var methods = vm.$options.methods;\n      var method = methods && methods[handler];\n      if (method) {\n        vm[action](key, method, options);\n      } else {\n        'production' !== 'production' && warn('Unknown method: \"' + handler + '\" when ' + 'registering callback for ' + action + ': \"' + key + '\".', vm);\n      }\n    } else if (handler && type === 'object') {\n      register(vm, action, key, handler.handler, handler);\n    }\n  }\n\n  /**\n   * Setup recursive attached/detached calls\n   */\n\n  Vue.prototype._initDOMHooks = function () {\n    this.$on('hook:attached', onAttached);\n    this.$on('hook:detached', onDetached);\n  };\n\n  /**\n   * Callback to recursively call attached hook on children\n   */\n\n  function onAttached() {\n    if (!this._isAttached) {\n      this._isAttached = true;\n      this.$children.forEach(callAttach);\n    }\n  }\n\n  /**\n   * Iterator to call attached hook\n   *\n   * @param {Vue} child\n   */\n\n  function callAttach(child) {\n    if (!child._isAttached && inDoc(child.$el)) {\n      child._callHook('attached');\n    }\n  }\n\n  /**\n   * Callback to recursively call detached hook on children\n   */\n\n  function onDetached() {\n    if (this._isAttached) {\n      this._isAttached = false;\n      this.$children.forEach(callDetach);\n    }\n  }\n\n  /**\n   * Iterator to call detached hook\n   *\n   * @param {Vue} child\n   */\n\n  function callDetach(child) {\n    if (child._isAttached && !inDoc(child.$el)) {\n      child._callHook('detached');\n    }\n  }\n\n  /**\n   * Trigger all handlers for a hook\n   *\n   * @param {String} hook\n   */\n\n  Vue.prototype._callHook = function (hook) {\n    this.$emit('pre-hook:' + hook);\n    var handlers = this.$options[hook];\n    if (handlers) {\n      for (var i = 0, j = handlers.length; i < j; i++) {\n        handlers[i].call(this);\n      }\n    }\n    this.$emit('hook:' + hook);\n  };\n}\n\nfunction noop$1() {}\n\n/**\n * A directive links a DOM element with a piece of data,\n * which is the result of evaluating an expression.\n * It registers a watcher with the expression and calls\n * the DOM update function when a change is triggered.\n *\n * @param {Object} descriptor\n *                 - {String} name\n *                 - {Object} def\n *                 - {String} expression\n *                 - {Array<Object>} [filters]\n *                 - {Object} [modifiers]\n *                 - {Boolean} literal\n *                 - {String} attr\n *                 - {String} arg\n *                 - {String} raw\n *                 - {String} [ref]\n *                 - {Array<Object>} [interp]\n *                 - {Boolean} [hasOneTime]\n * @param {Vue} vm\n * @param {Node} el\n * @param {Vue} [host] - transclusion host component\n * @param {Object} [scope] - v-for scope\n * @param {Fragment} [frag] - owner fragment\n * @constructor\n */\nfunction Directive(descriptor, vm, el, host, scope, frag) {\n  this.vm = vm;\n  this.el = el;\n  // copy descriptor properties\n  this.descriptor = descriptor;\n  this.name = descriptor.name;\n  this.expression = descriptor.expression;\n  this.arg = descriptor.arg;\n  this.modifiers = descriptor.modifiers;\n  this.filters = descriptor.filters;\n  this.literal = this.modifiers && this.modifiers.literal;\n  // private\n  this._locked = false;\n  this._bound = false;\n  this._listeners = null;\n  // link context\n  this._host = host;\n  this._scope = scope;\n  this._frag = frag;\n  // store directives on node in dev mode\n  if ('production' !== 'production' && this.el) {}\n}\n\n/**\n * Initialize the directive, mixin definition properties,\n * setup the watcher, call definition bind() and update()\n * if present.\n */\n\nDirective.prototype._bind = function () {\n  var name = this.name;\n  var descriptor = this.descriptor;\n\n  // remove attribute\n  if ((name !== 'cloak' || this.vm._isCompiled) && this.el && this.el.removeAttribute) {\n    var attr = descriptor.attr || 'v-' + name;\n    this.el.removeAttribute(attr);\n  }\n\n  // copy def properties\n  var def = descriptor.def;\n  if (typeof def === 'function') {\n    this.update = def;\n  } else {\n    extend(this, def);\n  }\n\n  // setup directive params\n  this._setupParams();\n\n  // initial bind\n  if (this.bind) {\n    this.bind();\n  }\n  this._bound = true;\n\n  if (this.literal) {\n    this.update && this.update(descriptor.raw);\n  } else if ((this.expression || this.modifiers) && (this.update || this.twoWay) && !this._checkStatement()) {\n    // wrapped updater for context\n    var dir = this;\n    if (this.update) {\n      this._update = function (val, oldVal) {\n        if (!dir._locked) {\n          dir.update(val, oldVal);\n        }\n      };\n    } else {\n      this._update = noop$1;\n    }\n    var preProcess = this._preProcess ? bind(this._preProcess, this) : null;\n    var postProcess = this._postProcess ? bind(this._postProcess, this) : null;\n    var watcher = this._watcher = new Watcher(this.vm, this.expression, this._update, // callback\n    {\n      filters: this.filters,\n      twoWay: this.twoWay,\n      deep: this.deep,\n      preProcess: preProcess,\n      postProcess: postProcess,\n      scope: this._scope\n    });\n    // v-model with inital inline value need to sync back to\n    // model instead of update to DOM on init. They would\n    // set the afterBind hook to indicate that.\n    if (this.afterBind) {\n      this.afterBind();\n    } else if (this.update) {\n      this.update(watcher.value);\n    }\n  }\n};\n\n/**\n * Setup all param attributes, e.g. track-by,\n * transition-mode, etc...\n */\n\nDirective.prototype._setupParams = function () {\n  if (!this.params) {\n    return;\n  }\n  var params = this.params;\n  // swap the params array with a fresh object.\n  this.params = Object.create(null);\n  var i = params.length;\n  var key, val, mappedKey;\n  while (i--) {\n    key = hyphenate(params[i]);\n    mappedKey = camelize(key);\n    val = getBindAttr(this.el, key);\n    if (val != null) {\n      // dynamic\n      this._setupParamWatcher(mappedKey, val);\n    } else {\n      // static\n      val = getAttr(this.el, key);\n      if (val != null) {\n        this.params[mappedKey] = val === '' ? true : val;\n      }\n    }\n  }\n};\n\n/**\n * Setup a watcher for a dynamic param.\n *\n * @param {String} key\n * @param {String} expression\n */\n\nDirective.prototype._setupParamWatcher = function (key, expression) {\n  var self = this;\n  var called = false;\n  var unwatch = (this._scope || this.vm).$watch(expression, function (val, oldVal) {\n    self.params[key] = val;\n    // since we are in immediate mode,\n    // only call the param change callbacks if this is not the first update.\n    if (called) {\n      var cb = self.paramWatchers && self.paramWatchers[key];\n      if (cb) {\n        cb.call(self, val, oldVal);\n      }\n    } else {\n      called = true;\n    }\n  }, {\n    immediate: true,\n    user: false\n  });(this._paramUnwatchFns || (this._paramUnwatchFns = [])).push(unwatch);\n};\n\n/**\n * Check if the directive is a function caller\n * and if the expression is a callable one. If both true,\n * we wrap up the expression and use it as the event\n * handler.\n *\n * e.g. on-click=\"a++\"\n *\n * @return {Boolean}\n */\n\nDirective.prototype._checkStatement = function () {\n  var expression = this.expression;\n  if (expression && this.acceptStatement && !isSimplePath(expression)) {\n    var fn = parseExpression$1(expression).get;\n    var scope = this._scope || this.vm;\n    var handler = function handler(e) {\n      scope.$event = e;\n      fn.call(scope, scope);\n      scope.$event = null;\n    };\n    if (this.filters) {\n      handler = scope._applyFilters(handler, null, this.filters);\n    }\n    this.update(handler);\n    return true;\n  }\n};\n\n/**\n * Set the corresponding value with the setter.\n * This should only be used in two-way directives\n * e.g. v-model.\n *\n * @param {*} value\n * @public\n */\n\nDirective.prototype.set = function (value) {\n  /* istanbul ignore else */\n  if (this.twoWay) {\n    this._withLock(function () {\n      this._watcher.set(value);\n    });\n  } else if ('production' !== 'production') {}\n};\n\n/**\n * Execute a function while preventing that function from\n * triggering updates on this directive instance.\n *\n * @param {Function} fn\n */\n\nDirective.prototype._withLock = function (fn) {\n  var self = this;\n  self._locked = true;\n  fn.call(self);\n  nextTick(function () {\n    self._locked = false;\n  });\n};\n\n/**\n * Convenience method that attaches a DOM event listener\n * to the directive element and autometically tears it down\n * during unbind.\n *\n * @param {String} event\n * @param {Function} handler\n * @param {Boolean} [useCapture]\n */\n\nDirective.prototype.on = function (event, handler, useCapture) {\n  on(this.el, event, handler, useCapture);(this._listeners || (this._listeners = [])).push([event, handler]);\n};\n\n/**\n * Teardown the watcher and call unbind.\n */\n\nDirective.prototype._teardown = function () {\n  if (this._bound) {\n    this._bound = false;\n    if (this.unbind) {\n      this.unbind();\n    }\n    if (this._watcher) {\n      this._watcher.teardown();\n    }\n    var listeners = this._listeners;\n    var i;\n    if (listeners) {\n      i = listeners.length;\n      while (i--) {\n        off(this.el, listeners[i][0], listeners[i][1]);\n      }\n    }\n    var unwatchFns = this._paramUnwatchFns;\n    if (unwatchFns) {\n      i = unwatchFns.length;\n      while (i--) {\n        unwatchFns[i]();\n      }\n    }\n    if ('production' !== 'production' && this.el) {}\n    this.vm = this.el = this._watcher = this._listeners = null;\n  }\n};\n\nfunction lifecycleMixin (Vue) {\n  /**\n   * Update v-ref for component.\n   *\n   * @param {Boolean} remove\n   */\n\n  Vue.prototype._updateRef = function (remove) {\n    var ref = this.$options._ref;\n    if (ref) {\n      var refs = (this._scope || this._context).$refs;\n      if (remove) {\n        if (refs[ref] === this) {\n          refs[ref] = null;\n        }\n      } else {\n        refs[ref] = this;\n      }\n    }\n  };\n\n  /**\n   * Transclude, compile and link element.\n   *\n   * If a pre-compiled linker is available, that means the\n   * passed in element will be pre-transcluded and compiled\n   * as well - all we need to do is to call the linker.\n   *\n   * Otherwise we need to call transclude/compile/link here.\n   *\n   * @param {Element} el\n   */\n\n  Vue.prototype._compile = function (el) {\n    var options = this.$options;\n\n    // transclude and init element\n    // transclude can potentially replace original\n    // so we need to keep reference; this step also injects\n    // the template and caches the original attributes\n    // on the container node and replacer node.\n    var original = el;\n    el = transclude(el, options);\n    this._initElement(el);\n\n    // handle v-pre on root node (#2026)\n    if (el.nodeType === 1 && getAttr(el, 'v-pre') !== null) {\n      return;\n    }\n\n    // root is always compiled per-instance, because\n    // container attrs and props can be different every time.\n    var contextOptions = this._context && this._context.$options;\n    var rootLinker = compileRoot(el, options, contextOptions);\n\n    // resolve slot distribution\n    resolveSlots(this, options._content);\n\n    // compile and link the rest\n    var contentLinkFn;\n    var ctor = this.constructor;\n    // component compilation can be cached\n    // as long as it's not using inline-template\n    if (options._linkerCachable) {\n      contentLinkFn = ctor.linker;\n      if (!contentLinkFn) {\n        contentLinkFn = ctor.linker = compile(el, options);\n      }\n    }\n\n    // link phase\n    // make sure to link root with prop scope!\n    var rootUnlinkFn = rootLinker(this, el, this._scope);\n    var contentUnlinkFn = contentLinkFn ? contentLinkFn(this, el) : compile(el, options)(this, el);\n\n    // register composite unlink function\n    // to be called during instance destruction\n    this._unlinkFn = function () {\n      rootUnlinkFn();\n      // passing destroying: true to avoid searching and\n      // splicing the directives\n      contentUnlinkFn(true);\n    };\n\n    // finally replace original\n    if (options.replace) {\n      replace(original, el);\n    }\n\n    this._isCompiled = true;\n    this._callHook('compiled');\n  };\n\n  /**\n   * Initialize instance element. Called in the public\n   * $mount() method.\n   *\n   * @param {Element} el\n   */\n\n  Vue.prototype._initElement = function (el) {\n    if (isFragment(el)) {\n      this._isFragment = true;\n      this.$el = this._fragmentStart = el.firstChild;\n      this._fragmentEnd = el.lastChild;\n      // set persisted text anchors to empty\n      if (this._fragmentStart.nodeType === 3) {\n        this._fragmentStart.data = this._fragmentEnd.data = '';\n      }\n      this._fragment = el;\n    } else {\n      this.$el = el;\n    }\n    this.$el.__vue__ = this;\n    this._callHook('beforeCompile');\n  };\n\n  /**\n   * Create and bind a directive to an element.\n   *\n   * @param {Object} descriptor - parsed directive descriptor\n   * @param {Node} node   - target node\n   * @param {Vue} [host] - transclusion host component\n   * @param {Object} [scope] - v-for scope\n   * @param {Fragment} [frag] - owner fragment\n   */\n\n  Vue.prototype._bindDir = function (descriptor, node, host, scope, frag) {\n    this._directives.push(new Directive(descriptor, this, node, host, scope, frag));\n  };\n\n  /**\n   * Teardown an instance, unobserves the data, unbind all the\n   * directives, turn off all the event listeners, etc.\n   *\n   * @param {Boolean} remove - whether to remove the DOM node.\n   * @param {Boolean} deferCleanup - if true, defer cleanup to\n   *                                 be called later\n   */\n\n  Vue.prototype._destroy = function (remove, deferCleanup) {\n    if (this._isBeingDestroyed) {\n      if (!deferCleanup) {\n        this._cleanup();\n      }\n      return;\n    }\n\n    var destroyReady;\n    var pendingRemoval;\n\n    var self = this;\n    // Cleanup should be called either synchronously or asynchronoysly as\n    // callback of this.$remove(), or if remove and deferCleanup are false.\n    // In any case it should be called after all other removing, unbinding and\n    // turning of is done\n    var cleanupIfPossible = function cleanupIfPossible() {\n      if (destroyReady && !pendingRemoval && !deferCleanup) {\n        self._cleanup();\n      }\n    };\n\n    // remove DOM element\n    if (remove && this.$el) {\n      pendingRemoval = true;\n      this.$remove(function () {\n        pendingRemoval = false;\n        cleanupIfPossible();\n      });\n    }\n\n    this._callHook('beforeDestroy');\n    this._isBeingDestroyed = true;\n    var i;\n    // remove self from parent. only necessary\n    // if parent is not being destroyed as well.\n    var parent = this.$parent;\n    if (parent && !parent._isBeingDestroyed) {\n      parent.$children.$remove(this);\n      // unregister ref (remove: true)\n      this._updateRef(true);\n    }\n    // destroy all children.\n    i = this.$children.length;\n    while (i--) {\n      this.$children[i].$destroy();\n    }\n    // teardown props\n    if (this._propsUnlinkFn) {\n      this._propsUnlinkFn();\n    }\n    // teardown all directives. this also tearsdown all\n    // directive-owned watchers.\n    if (this._unlinkFn) {\n      this._unlinkFn();\n    }\n    i = this._watchers.length;\n    while (i--) {\n      this._watchers[i].teardown();\n    }\n    // remove reference to self on $el\n    if (this.$el) {\n      this.$el.__vue__ = null;\n    }\n\n    destroyReady = true;\n    cleanupIfPossible();\n  };\n\n  /**\n   * Clean up to ensure garbage collection.\n   * This is called after the leave transition if there\n   * is any.\n   */\n\n  Vue.prototype._cleanup = function () {\n    if (this._isDestroyed) {\n      return;\n    }\n    // remove self from owner fragment\n    // do it in cleanup so that we can call $destroy with\n    // defer right when a fragment is about to be removed.\n    if (this._frag) {\n      this._frag.children.$remove(this);\n    }\n    // remove reference from data ob\n    // frozen object may not have observer.\n    if (this._data && this._data.__ob__) {\n      this._data.__ob__.removeVm(this);\n    }\n    // Clean up references to private properties and other\n    // instances. preserve reference to _data so that proxy\n    // accessors still work. The only potential side effect\n    // here is that mutating the instance after it's destroyed\n    // may affect the state of other components that are still\n    // observing the same object, but that seems to be a\n    // reasonable responsibility for the user rather than\n    // always throwing an error on them.\n    this.$el = this.$parent = this.$root = this.$children = this._watchers = this._context = this._scope = this._directives = null;\n    // call the last hook...\n    this._isDestroyed = true;\n    this._callHook('destroyed');\n    // turn off all instance listeners.\n    this.$off();\n  };\n}\n\nfunction miscMixin (Vue) {\n  /**\n   * Apply a list of filter (descriptors) to a value.\n   * Using plain for loops here because this will be called in\n   * the getter of any watcher with filters so it is very\n   * performance sensitive.\n   *\n   * @param {*} value\n   * @param {*} [oldValue]\n   * @param {Array} filters\n   * @param {Boolean} write\n   * @return {*}\n   */\n\n  Vue.prototype._applyFilters = function (value, oldValue, filters, write) {\n    var filter, fn, args, arg, offset, i, l, j, k;\n    for (i = 0, l = filters.length; i < l; i++) {\n      filter = filters[write ? l - i - 1 : i];\n      fn = resolveAsset(this.$options, 'filters', filter.name, true);\n      if (!fn) continue;\n      fn = write ? fn.write : fn.read || fn;\n      if (typeof fn !== 'function') continue;\n      args = write ? [value, oldValue] : [value];\n      offset = write ? 2 : 1;\n      if (filter.args) {\n        for (j = 0, k = filter.args.length; j < k; j++) {\n          arg = filter.args[j];\n          args[j + offset] = arg.dynamic ? this.$get(arg.value) : arg.value;\n        }\n      }\n      value = fn.apply(this, args);\n    }\n    return value;\n  };\n\n  /**\n   * Resolve a component, depending on whether the component\n   * is defined normally or using an async factory function.\n   * Resolves synchronously if already resolved, otherwise\n   * resolves asynchronously and caches the resolved\n   * constructor on the factory.\n   *\n   * @param {String|Function} value\n   * @param {Function} cb\n   */\n\n  Vue.prototype._resolveComponent = function (value, cb) {\n    var factory;\n    if (typeof value === 'function') {\n      factory = value;\n    } else {\n      factory = resolveAsset(this.$options, 'components', value, true);\n    }\n    /* istanbul ignore if */\n    if (!factory) {\n      return;\n    }\n    // async component factory\n    if (!factory.options) {\n      if (factory.resolved) {\n        // cached\n        cb(factory.resolved);\n      } else if (factory.requested) {\n        // pool callbacks\n        factory.pendingCallbacks.push(cb);\n      } else {\n        factory.requested = true;\n        var cbs = factory.pendingCallbacks = [cb];\n        factory.call(this, function resolve(res) {\n          if (isPlainObject(res)) {\n            res = Vue.extend(res);\n          }\n          // cache resolved\n          factory.resolved = res;\n          // invoke callbacks\n          for (var i = 0, l = cbs.length; i < l; i++) {\n            cbs[i](res);\n          }\n        }, function reject(reason) {\n          'production' !== 'production' && warn('Failed to resolve async component' + (typeof value === 'string' ? ': ' + value : '') + '. ' + (reason ? '\\nReason: ' + reason : ''));\n        });\n      }\n    } else {\n      // normal component\n      cb(factory);\n    }\n  };\n}\n\nvar filterRE$1 = /[^|]\\|[^|]/;\n\nfunction dataAPI (Vue) {\n  /**\n   * Get the value from an expression on this vm.\n   *\n   * @param {String} exp\n   * @param {Boolean} [asStatement]\n   * @return {*}\n   */\n\n  Vue.prototype.$get = function (exp, asStatement) {\n    var res = parseExpression$1(exp);\n    if (res) {\n      if (asStatement) {\n        var self = this;\n        return function statementHandler() {\n          self.$arguments = toArray(arguments);\n          var result = res.get.call(self, self);\n          self.$arguments = null;\n          return result;\n        };\n      } else {\n        try {\n          return res.get.call(this, this);\n        } catch (e) {}\n      }\n    }\n  };\n\n  /**\n   * Set the value from an expression on this vm.\n   * The expression must be a valid left-hand\n   * expression in an assignment.\n   *\n   * @param {String} exp\n   * @param {*} val\n   */\n\n  Vue.prototype.$set = function (exp, val) {\n    var res = parseExpression$1(exp, true);\n    if (res && res.set) {\n      res.set.call(this, this, val);\n    }\n  };\n\n  /**\n   * Delete a property on the VM\n   *\n   * @param {String} key\n   */\n\n  Vue.prototype.$delete = function (key) {\n    del(this._data, key);\n  };\n\n  /**\n   * Watch an expression, trigger callback when its\n   * value changes.\n   *\n   * @param {String|Function} expOrFn\n   * @param {Function} cb\n   * @param {Object} [options]\n   *                 - {Boolean} deep\n   *                 - {Boolean} immediate\n   * @return {Function} - unwatchFn\n   */\n\n  Vue.prototype.$watch = function (expOrFn, cb, options) {\n    var vm = this;\n    var parsed;\n    if (typeof expOrFn === 'string') {\n      parsed = parseDirective(expOrFn);\n      expOrFn = parsed.expression;\n    }\n    var watcher = new Watcher(vm, expOrFn, cb, {\n      deep: options && options.deep,\n      sync: options && options.sync,\n      filters: parsed && parsed.filters,\n      user: !options || options.user !== false\n    });\n    if (options && options.immediate) {\n      cb.call(vm, watcher.value);\n    }\n    return function unwatchFn() {\n      watcher.teardown();\n    };\n  };\n\n  /**\n   * Evaluate a text directive, including filters.\n   *\n   * @param {String} text\n   * @param {Boolean} [asStatement]\n   * @return {String}\n   */\n\n  Vue.prototype.$eval = function (text, asStatement) {\n    // check for filters.\n    if (filterRE$1.test(text)) {\n      var dir = parseDirective(text);\n      // the filter regex check might give false positive\n      // for pipes inside strings, so it's possible that\n      // we don't get any filters here\n      var val = this.$get(dir.expression, asStatement);\n      return dir.filters ? this._applyFilters(val, null, dir.filters) : val;\n    } else {\n      // no filter\n      return this.$get(text, asStatement);\n    }\n  };\n\n  /**\n   * Interpolate a piece of template text.\n   *\n   * @param {String} text\n   * @return {String}\n   */\n\n  Vue.prototype.$interpolate = function (text) {\n    var tokens = parseText(text);\n    var vm = this;\n    if (tokens) {\n      if (tokens.length === 1) {\n        return vm.$eval(tokens[0].value) + '';\n      } else {\n        return tokens.map(function (token) {\n          return token.tag ? vm.$eval(token.value) : token.value;\n        }).join('');\n      }\n    } else {\n      return text;\n    }\n  };\n\n  /**\n   * Log instance data as a plain JS object\n   * so that it is easier to inspect in console.\n   * This method assumes console is available.\n   *\n   * @param {String} [path]\n   */\n\n  Vue.prototype.$log = function (path) {\n    var data = path ? getPath(this._data, path) : this._data;\n    if (data) {\n      data = clean(data);\n    }\n    // include computed fields\n    if (!path) {\n      var key;\n      for (key in this.$options.computed) {\n        data[key] = clean(this[key]);\n      }\n      if (this._props) {\n        for (key in this._props) {\n          data[key] = clean(this[key]);\n        }\n      }\n    }\n    console.log(data);\n  };\n\n  /**\n   * \"clean\" a getter/setter converted object into a plain\n   * object copy.\n   *\n   * @param {Object} - obj\n   * @return {Object}\n   */\n\n  function clean(obj) {\n    return JSON.parse(JSON.stringify(obj));\n  }\n}\n\nfunction domAPI (Vue) {\n  /**\n   * Convenience on-instance nextTick. The callback is\n   * auto-bound to the instance, and this avoids component\n   * modules having to rely on the global Vue.\n   *\n   * @param {Function} fn\n   */\n\n  Vue.prototype.$nextTick = function (fn) {\n    nextTick(fn, this);\n  };\n\n  /**\n   * Append instance to target\n   *\n   * @param {Node} target\n   * @param {Function} [cb]\n   * @param {Boolean} [withTransition] - defaults to true\n   */\n\n  Vue.prototype.$appendTo = function (target, cb, withTransition) {\n    return insert(this, target, cb, withTransition, append, appendWithTransition);\n  };\n\n  /**\n   * Prepend instance to target\n   *\n   * @param {Node} target\n   * @param {Function} [cb]\n   * @param {Boolean} [withTransition] - defaults to true\n   */\n\n  Vue.prototype.$prependTo = function (target, cb, withTransition) {\n    target = query(target);\n    if (target.hasChildNodes()) {\n      this.$before(target.firstChild, cb, withTransition);\n    } else {\n      this.$appendTo(target, cb, withTransition);\n    }\n    return this;\n  };\n\n  /**\n   * Insert instance before target\n   *\n   * @param {Node} target\n   * @param {Function} [cb]\n   * @param {Boolean} [withTransition] - defaults to true\n   */\n\n  Vue.prototype.$before = function (target, cb, withTransition) {\n    return insert(this, target, cb, withTransition, beforeWithCb, beforeWithTransition);\n  };\n\n  /**\n   * Insert instance after target\n   *\n   * @param {Node} target\n   * @param {Function} [cb]\n   * @param {Boolean} [withTransition] - defaults to true\n   */\n\n  Vue.prototype.$after = function (target, cb, withTransition) {\n    target = query(target);\n    if (target.nextSibling) {\n      this.$before(target.nextSibling, cb, withTransition);\n    } else {\n      this.$appendTo(target.parentNode, cb, withTransition);\n    }\n    return this;\n  };\n\n  /**\n   * Remove instance from DOM\n   *\n   * @param {Function} [cb]\n   * @param {Boolean} [withTransition] - defaults to true\n   */\n\n  Vue.prototype.$remove = function (cb, withTransition) {\n    if (!this.$el.parentNode) {\n      return cb && cb();\n    }\n    var inDocument = this._isAttached && inDoc(this.$el);\n    // if we are not in document, no need to check\n    // for transitions\n    if (!inDocument) withTransition = false;\n    var self = this;\n    var realCb = function realCb() {\n      if (inDocument) self._callHook('detached');\n      if (cb) cb();\n    };\n    if (this._isFragment) {\n      removeNodeRange(this._fragmentStart, this._fragmentEnd, this, this._fragment, realCb);\n    } else {\n      var op = withTransition === false ? removeWithCb : removeWithTransition;\n      op(this.$el, this, realCb);\n    }\n    return this;\n  };\n\n  /**\n   * Shared DOM insertion function.\n   *\n   * @param {Vue} vm\n   * @param {Element} target\n   * @param {Function} [cb]\n   * @param {Boolean} [withTransition]\n   * @param {Function} op1 - op for non-transition insert\n   * @param {Function} op2 - op for transition insert\n   * @return vm\n   */\n\n  function insert(vm, target, cb, withTransition, op1, op2) {\n    target = query(target);\n    var targetIsDetached = !inDoc(target);\n    var op = withTransition === false || targetIsDetached ? op1 : op2;\n    var shouldCallHook = !targetIsDetached && !vm._isAttached && !inDoc(vm.$el);\n    if (vm._isFragment) {\n      mapNodeRange(vm._fragmentStart, vm._fragmentEnd, function (node) {\n        op(node, target, vm);\n      });\n      cb && cb();\n    } else {\n      op(vm.$el, target, vm, cb);\n    }\n    if (shouldCallHook) {\n      vm._callHook('attached');\n    }\n    return vm;\n  }\n\n  /**\n   * Check for selectors\n   *\n   * @param {String|Element} el\n   */\n\n  function query(el) {\n    return typeof el === 'string' ? document.querySelector(el) : el;\n  }\n\n  /**\n   * Append operation that takes a callback.\n   *\n   * @param {Node} el\n   * @param {Node} target\n   * @param {Vue} vm - unused\n   * @param {Function} [cb]\n   */\n\n  function append(el, target, vm, cb) {\n    target.appendChild(el);\n    if (cb) cb();\n  }\n\n  /**\n   * InsertBefore operation that takes a callback.\n   *\n   * @param {Node} el\n   * @param {Node} target\n   * @param {Vue} vm - unused\n   * @param {Function} [cb]\n   */\n\n  function beforeWithCb(el, target, vm, cb) {\n    before(el, target);\n    if (cb) cb();\n  }\n\n  /**\n   * Remove operation that takes a callback.\n   *\n   * @param {Node} el\n   * @param {Vue} vm - unused\n   * @param {Function} [cb]\n   */\n\n  function removeWithCb(el, vm, cb) {\n    remove(el);\n    if (cb) cb();\n  }\n}\n\nfunction eventsAPI (Vue) {\n  /**\n   * Listen on the given `event` with `fn`.\n   *\n   * @param {String} event\n   * @param {Function} fn\n   */\n\n  Vue.prototype.$on = function (event, fn) {\n    (this._events[event] || (this._events[event] = [])).push(fn);\n    modifyListenerCount(this, event, 1);\n    return this;\n  };\n\n  /**\n   * Adds an `event` listener that will be invoked a single\n   * time then automatically removed.\n   *\n   * @param {String} event\n   * @param {Function} fn\n   */\n\n  Vue.prototype.$once = function (event, fn) {\n    var self = this;\n    function on() {\n      self.$off(event, on);\n      fn.apply(this, arguments);\n    }\n    on.fn = fn;\n    this.$on(event, on);\n    return this;\n  };\n\n  /**\n   * Remove the given callback for `event` or all\n   * registered callbacks.\n   *\n   * @param {String} event\n   * @param {Function} fn\n   */\n\n  Vue.prototype.$off = function (event, fn) {\n    var cbs;\n    // all\n    if (!arguments.length) {\n      if (this.$parent) {\n        for (event in this._events) {\n          cbs = this._events[event];\n          if (cbs) {\n            modifyListenerCount(this, event, -cbs.length);\n          }\n        }\n      }\n      this._events = {};\n      return this;\n    }\n    // specific event\n    cbs = this._events[event];\n    if (!cbs) {\n      return this;\n    }\n    if (arguments.length === 1) {\n      modifyListenerCount(this, event, -cbs.length);\n      this._events[event] = null;\n      return this;\n    }\n    // specific handler\n    var cb;\n    var i = cbs.length;\n    while (i--) {\n      cb = cbs[i];\n      if (cb === fn || cb.fn === fn) {\n        modifyListenerCount(this, event, -1);\n        cbs.splice(i, 1);\n        break;\n      }\n    }\n    return this;\n  };\n\n  /**\n   * Trigger an event on self.\n   *\n   * @param {String|Object} event\n   * @return {Boolean} shouldPropagate\n   */\n\n  Vue.prototype.$emit = function (event) {\n    var isSource = typeof event === 'string';\n    event = isSource ? event : event.name;\n    var cbs = this._events[event];\n    var shouldPropagate = isSource || !cbs;\n    if (cbs) {\n      cbs = cbs.length > 1 ? toArray(cbs) : cbs;\n      // this is a somewhat hacky solution to the question raised\n      // in #2102: for an inline component listener like <comp @test=\"doThis\">,\n      // the propagation handling is somewhat broken. Therefore we\n      // need to treat these inline callbacks differently.\n      var hasParentCbs = isSource && cbs.some(function (cb) {\n        return cb._fromParent;\n      });\n      if (hasParentCbs) {\n        shouldPropagate = false;\n      }\n      var args = toArray(arguments, 1);\n      for (var i = 0, l = cbs.length; i < l; i++) {\n        var cb = cbs[i];\n        var res = cb.apply(this, args);\n        if (res === true && (!hasParentCbs || cb._fromParent)) {\n          shouldPropagate = true;\n        }\n      }\n    }\n    return shouldPropagate;\n  };\n\n  /**\n   * Recursively broadcast an event to all children instances.\n   *\n   * @param {String|Object} event\n   * @param {...*} additional arguments\n   */\n\n  Vue.prototype.$broadcast = function (event) {\n    var isSource = typeof event === 'string';\n    event = isSource ? event : event.name;\n    // if no child has registered for this event,\n    // then there's no need to broadcast.\n    if (!this._eventsCount[event]) return;\n    var children = this.$children;\n    var args = toArray(arguments);\n    if (isSource) {\n      // use object event to indicate non-source emit\n      // on children\n      args[0] = { name: event, source: this };\n    }\n    for (var i = 0, l = children.length; i < l; i++) {\n      var child = children[i];\n      var shouldPropagate = child.$emit.apply(child, args);\n      if (shouldPropagate) {\n        child.$broadcast.apply(child, args);\n      }\n    }\n    return this;\n  };\n\n  /**\n   * Recursively propagate an event up the parent chain.\n   *\n   * @param {String} event\n   * @param {...*} additional arguments\n   */\n\n  Vue.prototype.$dispatch = function (event) {\n    var shouldPropagate = this.$emit.apply(this, arguments);\n    if (!shouldPropagate) return;\n    var parent = this.$parent;\n    var args = toArray(arguments);\n    // use object event to indicate non-source emit\n    // on parents\n    args[0] = { name: event, source: this };\n    while (parent) {\n      shouldPropagate = parent.$emit.apply(parent, args);\n      parent = shouldPropagate ? parent.$parent : null;\n    }\n    return this;\n  };\n\n  /**\n   * Modify the listener counts on all parents.\n   * This bookkeeping allows $broadcast to return early when\n   * no child has listened to a certain event.\n   *\n   * @param {Vue} vm\n   * @param {String} event\n   * @param {Number} count\n   */\n\n  var hookRE = /^hook:/;\n  function modifyListenerCount(vm, event, count) {\n    var parent = vm.$parent;\n    // hooks do not get broadcasted so no need\n    // to do bookkeeping for them\n    if (!parent || !count || hookRE.test(event)) return;\n    while (parent) {\n      parent._eventsCount[event] = (parent._eventsCount[event] || 0) + count;\n      parent = parent.$parent;\n    }\n  }\n}\n\nfunction lifecycleAPI (Vue) {\n  /**\n   * Set instance target element and kick off the compilation\n   * process. The passed in `el` can be a selector string, an\n   * existing Element, or a DocumentFragment (for block\n   * instances).\n   *\n   * @param {Element|DocumentFragment|string} el\n   * @public\n   */\n\n  Vue.prototype.$mount = function (el) {\n    if (this._isCompiled) {\n      'production' !== 'production' && warn('$mount() should be called only once.', this);\n      return;\n    }\n    el = query(el);\n    if (!el) {\n      el = document.createElement('div');\n    }\n    this._compile(el);\n    this._initDOMHooks();\n    if (inDoc(this.$el)) {\n      this._callHook('attached');\n      ready.call(this);\n    } else {\n      this.$once('hook:attached', ready);\n    }\n    return this;\n  };\n\n  /**\n   * Mark an instance as ready.\n   */\n\n  function ready() {\n    this._isAttached = true;\n    this._isReady = true;\n    this._callHook('ready');\n  }\n\n  /**\n   * Teardown the instance, simply delegate to the internal\n   * _destroy.\n   *\n   * @param {Boolean} remove\n   * @param {Boolean} deferCleanup\n   */\n\n  Vue.prototype.$destroy = function (remove, deferCleanup) {\n    this._destroy(remove, deferCleanup);\n  };\n\n  /**\n   * Partially compile a piece of DOM and return a\n   * decompile function.\n   *\n   * @param {Element|DocumentFragment} el\n   * @param {Vue} [host]\n   * @param {Object} [scope]\n   * @param {Fragment} [frag]\n   * @return {Function}\n   */\n\n  Vue.prototype.$compile = function (el, host, scope, frag) {\n    return compile(el, this.$options, true)(this, el, host, scope, frag);\n  };\n}\n\n/**\n * The exposed Vue constructor.\n *\n * API conventions:\n * - public API methods/properties are prefixed with `$`\n * - internal methods/properties are prefixed with `_`\n * - non-prefixed properties are assumed to be proxied user\n *   data.\n *\n * @constructor\n * @param {Object} [options]\n * @public\n */\n\nfunction Vue(options) {\n  this._init(options);\n}\n\n// install internals\ninitMixin(Vue);\nstateMixin(Vue);\neventsMixin(Vue);\nlifecycleMixin(Vue);\nmiscMixin(Vue);\n\n// install instance APIs\ndataAPI(Vue);\ndomAPI(Vue);\neventsAPI(Vue);\nlifecycleAPI(Vue);\n\nvar slot = {\n\n  priority: SLOT,\n  params: ['name'],\n\n  bind: function bind() {\n    // this was resolved during component transclusion\n    var name = this.params.name || 'default';\n    var content = this.vm._slotContents && this.vm._slotContents[name];\n    if (!content || !content.hasChildNodes()) {\n      this.fallback();\n    } else {\n      this.compile(content.cloneNode(true), this.vm._context, this.vm);\n    }\n  },\n\n  compile: function compile(content, context, host) {\n    if (content && context) {\n      if (this.el.hasChildNodes() && content.childNodes.length === 1 && content.childNodes[0].nodeType === 1 && content.childNodes[0].hasAttribute('v-if')) {\n        // if the inserted slot has v-if\n        // inject fallback content as the v-else\n        var elseBlock = document.createElement('template');\n        elseBlock.setAttribute('v-else', '');\n        elseBlock.innerHTML = this.el.innerHTML;\n        // the else block should be compiled in child scope\n        elseBlock._context = this.vm;\n        content.appendChild(elseBlock);\n      }\n      var scope = host ? host._scope : this._scope;\n      this.unlink = context.$compile(content, host, scope, this._frag);\n    }\n    if (content) {\n      replace(this.el, content);\n    } else {\n      remove(this.el);\n    }\n  },\n\n  fallback: function fallback() {\n    this.compile(extractContent(this.el, true), this.vm);\n  },\n\n  unbind: function unbind() {\n    if (this.unlink) {\n      this.unlink();\n    }\n  }\n};\n\nvar partial = {\n\n  priority: PARTIAL,\n\n  params: ['name'],\n\n  // watch changes to name for dynamic partials\n  paramWatchers: {\n    name: function name(value) {\n      vIf.remove.call(this);\n      if (value) {\n        this.insert(value);\n      }\n    }\n  },\n\n  bind: function bind() {\n    this.anchor = createAnchor('v-partial');\n    replace(this.el, this.anchor);\n    this.insert(this.params.name);\n  },\n\n  insert: function insert(id) {\n    var partial = resolveAsset(this.vm.$options, 'partials', id, true);\n    if (partial) {\n      this.factory = new FragmentFactory(this.vm, partial);\n      vIf.insert.call(this);\n    }\n  },\n\n  unbind: function unbind() {\n    if (this.frag) {\n      this.frag.destroy();\n    }\n  }\n};\n\nvar elementDirectives = {\n  slot: slot,\n  partial: partial\n};\n\nvar convertArray = vFor._postProcess;\n\n/**\n * Limit filter for arrays\n *\n * @param {Number} n\n * @param {Number} offset (Decimal expected)\n */\n\nfunction limitBy(arr, n, offset) {\n  offset = offset ? parseInt(offset, 10) : 0;\n  n = toNumber(n);\n  return typeof n === 'number' ? arr.slice(offset, offset + n) : arr;\n}\n\n/**\n * Filter filter for arrays\n *\n * @param {String} search\n * @param {String} [delimiter]\n * @param {String} ...dataKeys\n */\n\nfunction filterBy(arr, search, delimiter) {\n  arr = convertArray(arr);\n  if (search == null) {\n    return arr;\n  }\n  if (typeof search === 'function') {\n    return arr.filter(search);\n  }\n  // cast to lowercase string\n  search = ('' + search).toLowerCase();\n  // allow optional `in` delimiter\n  // because why not\n  var n = delimiter === 'in' ? 3 : 2;\n  // extract and flatten keys\n  var keys = Array.prototype.concat.apply([], toArray(arguments, n));\n  var res = [];\n  var item, key, val, j;\n  for (var i = 0, l = arr.length; i < l; i++) {\n    item = arr[i];\n    val = item && item.$value || item;\n    j = keys.length;\n    if (j) {\n      while (j--) {\n        key = keys[j];\n        if (key === '$key' && contains(item.$key, search) || contains(getPath(val, key), search)) {\n          res.push(item);\n          break;\n        }\n      }\n    } else if (contains(item, search)) {\n      res.push(item);\n    }\n  }\n  return res;\n}\n\n/**\n * Order filter for arrays\n *\n * @param {String|Array<String>|Function} ...sortKeys\n * @param {Number} [order]\n */\n\nfunction orderBy(arr) {\n  var comparator = null;\n  var sortKeys = undefined;\n  arr = convertArray(arr);\n\n  // determine order (last argument)\n  var args = toArray(arguments, 1);\n  var order = args[args.length - 1];\n  if (typeof order === 'number') {\n    order = order < 0 ? -1 : 1;\n    args = args.length > 1 ? args.slice(0, -1) : args;\n  } else {\n    order = 1;\n  }\n\n  // determine sortKeys & comparator\n  var firstArg = args[0];\n  if (!firstArg) {\n    return arr;\n  } else if (typeof firstArg === 'function') {\n    // custom comparator\n    comparator = function (a, b) {\n      return firstArg(a, b) * order;\n    };\n  } else {\n    // string keys. flatten first\n    sortKeys = Array.prototype.concat.apply([], args);\n    comparator = function (a, b, i) {\n      i = i || 0;\n      return i >= sortKeys.length - 1 ? baseCompare(a, b, i) : baseCompare(a, b, i) || comparator(a, b, i + 1);\n    };\n  }\n\n  function baseCompare(a, b, sortKeyIndex) {\n    var sortKey = sortKeys[sortKeyIndex];\n    if (sortKey) {\n      if (sortKey !== '$key') {\n        if (isObject(a) && '$value' in a) a = a.$value;\n        if (isObject(b) && '$value' in b) b = b.$value;\n      }\n      a = isObject(a) ? getPath(a, sortKey) : a;\n      b = isObject(b) ? getPath(b, sortKey) : b;\n    }\n    return a === b ? 0 : a > b ? order : -order;\n  }\n\n  // sort on a copy to avoid mutating original array\n  return arr.slice().sort(comparator);\n}\n\n/**\n * String contain helper\n *\n * @param {*} val\n * @param {String} search\n */\n\nfunction contains(val, search) {\n  var i;\n  if (isPlainObject(val)) {\n    var keys = Object.keys(val);\n    i = keys.length;\n    while (i--) {\n      if (contains(val[keys[i]], search)) {\n        return true;\n      }\n    }\n  } else if (isArray(val)) {\n    i = val.length;\n    while (i--) {\n      if (contains(val[i], search)) {\n        return true;\n      }\n    }\n  } else if (val != null) {\n    return val.toString().toLowerCase().indexOf(search) > -1;\n  }\n}\n\nvar digitsRE = /(\\d{3})(?=\\d)/g;\n\n// asset collections must be a plain object.\nvar filters = {\n\n  orderBy: orderBy,\n  filterBy: filterBy,\n  limitBy: limitBy,\n\n  /**\n   * Stringify value.\n   *\n   * @param {Number} indent\n   */\n\n  json: {\n    read: function read(value, indent) {\n      return typeof value === 'string' ? value : JSON.stringify(value, null, arguments.length > 1 ? indent : 2);\n    },\n    write: function write(value) {\n      try {\n        return JSON.parse(value);\n      } catch (e) {\n        return value;\n      }\n    }\n  },\n\n  /**\n   * 'abc' => 'Abc'\n   */\n\n  capitalize: function capitalize(value) {\n    if (!value && value !== 0) return '';\n    value = value.toString();\n    return value.charAt(0).toUpperCase() + value.slice(1);\n  },\n\n  /**\n   * 'abc' => 'ABC'\n   */\n\n  uppercase: function uppercase(value) {\n    return value || value === 0 ? value.toString().toUpperCase() : '';\n  },\n\n  /**\n   * 'AbC' => 'abc'\n   */\n\n  lowercase: function lowercase(value) {\n    return value || value === 0 ? value.toString().toLowerCase() : '';\n  },\n\n  /**\n   * 12345 => $12,345.00\n   *\n   * @param {String} sign\n   * @param {Number} decimals Decimal places\n   */\n\n  currency: function currency(value, _currency, decimals) {\n    value = parseFloat(value);\n    if (!isFinite(value) || !value && value !== 0) return '';\n    _currency = _currency != null ? _currency : '$';\n    decimals = decimals != null ? decimals : 2;\n    var stringified = Math.abs(value).toFixed(decimals);\n    var _int = decimals ? stringified.slice(0, -1 - decimals) : stringified;\n    var i = _int.length % 3;\n    var head = i > 0 ? _int.slice(0, i) + (_int.length > 3 ? ',' : '') : '';\n    var _float = decimals ? stringified.slice(-1 - decimals) : '';\n    var sign = value < 0 ? '-' : '';\n    return sign + _currency + head + _int.slice(i).replace(digitsRE, '$1,') + _float;\n  },\n\n  /**\n   * 'item' => 'items'\n   *\n   * @params\n   *  an array of strings corresponding to\n   *  the single, double, triple ... forms of the word to\n   *  be pluralized. When the number to be pluralized\n   *  exceeds the length of the args, it will use the last\n   *  entry in the array.\n   *\n   *  e.g. ['single', 'double', 'triple', 'multiple']\n   */\n\n  pluralize: function pluralize(value) {\n    var args = toArray(arguments, 1);\n    var length = args.length;\n    if (length > 1) {\n      var index = value % 10 - 1;\n      return index in args ? args[index] : args[length - 1];\n    } else {\n      return args[0] + (value === 1 ? '' : 's');\n    }\n  },\n\n  /**\n   * Debounce a handler function.\n   *\n   * @param {Function} handler\n   * @param {Number} delay = 300\n   * @return {Function}\n   */\n\n  debounce: function debounce(handler, delay) {\n    if (!handler) return;\n    if (!delay) {\n      delay = 300;\n    }\n    return _debounce(handler, delay);\n  }\n};\n\nfunction installGlobalAPI (Vue) {\n  /**\n   * Vue and every constructor that extends Vue has an\n   * associated options object, which can be accessed during\n   * compilation steps as `this.constructor.options`.\n   *\n   * These can be seen as the default options of every\n   * Vue instance.\n   */\n\n  Vue.options = {\n    directives: directives,\n    elementDirectives: elementDirectives,\n    filters: filters,\n    transitions: {},\n    components: {},\n    partials: {},\n    replace: true\n  };\n\n  /**\n   * Expose useful internals\n   */\n\n  Vue.util = util;\n  Vue.config = config;\n  Vue.set = set;\n  Vue['delete'] = del;\n  Vue.nextTick = nextTick;\n\n  /**\n   * The following are exposed for advanced usage / plugins\n   */\n\n  Vue.compiler = compiler;\n  Vue.FragmentFactory = FragmentFactory;\n  Vue.internalDirectives = internalDirectives;\n  Vue.parsers = {\n    path: path,\n    text: text,\n    template: template,\n    directive: directive,\n    expression: expression\n  };\n\n  /**\n   * Each instance constructor, including Vue, has a unique\n   * cid. This enables us to create wrapped \"child\n   * constructors\" for prototypal inheritance and cache them.\n   */\n\n  Vue.cid = 0;\n  var cid = 1;\n\n  /**\n   * Class inheritance\n   *\n   * @param {Object} extendOptions\n   */\n\n  Vue.extend = function (extendOptions) {\n    extendOptions = extendOptions || {};\n    var Super = this;\n    var isFirstExtend = Super.cid === 0;\n    if (isFirstExtend && extendOptions._Ctor) {\n      return extendOptions._Ctor;\n    }\n    var name = extendOptions.name || Super.options.name;\n    if ('production' !== 'production') {}\n    var Sub = function VueComponent(options) {\n      Vue.call(this, options);\n    };\n    Sub.prototype = Object.create(Super.prototype);\n    Sub.prototype.constructor = Sub;\n    Sub.cid = cid++;\n    Sub.options = mergeOptions(Super.options, extendOptions);\n    Sub['super'] = Super;\n    // allow further extension\n    Sub.extend = Super.extend;\n    // create asset registers, so extended classes\n    // can have their private assets too.\n    config._assetTypes.forEach(function (type) {\n      Sub[type] = Super[type];\n    });\n    // enable recursive self-lookup\n    if (name) {\n      Sub.options.components[name] = Sub;\n    }\n    // cache constructor\n    if (isFirstExtend) {\n      extendOptions._Ctor = Sub;\n    }\n    return Sub;\n  };\n\n  /**\n   * Plugin system\n   *\n   * @param {Object} plugin\n   */\n\n  Vue.use = function (plugin) {\n    /* istanbul ignore if */\n    if (plugin.installed) {\n      return;\n    }\n    // additional parameters\n    var args = toArray(arguments, 1);\n    args.unshift(this);\n    if (typeof plugin.install === 'function') {\n      plugin.install.apply(plugin, args);\n    } else {\n      plugin.apply(null, args);\n    }\n    plugin.installed = true;\n    return this;\n  };\n\n  /**\n   * Apply a global mixin by merging it into the default\n   * options.\n   */\n\n  Vue.mixin = function (mixin) {\n    Vue.options = mergeOptions(Vue.options, mixin);\n  };\n\n  /**\n   * Create asset registration methods with the following\n   * signature:\n   *\n   * @param {String} id\n   * @param {*} definition\n   */\n\n  config._assetTypes.forEach(function (type) {\n    Vue[type] = function (id, definition) {\n      if (!definition) {\n        return this.options[type + 's'][id];\n      } else {\n        /* istanbul ignore if */\n        if ('production' !== 'production') {}\n        if (type === 'component' && isPlainObject(definition)) {\n          if (!definition.name) {\n            definition.name = id;\n          }\n          definition = Vue.extend(definition);\n        }\n        this.options[type + 's'][id] = definition;\n        return definition;\n      }\n    };\n  });\n\n  // expose internal transition API\n  extend(Vue.transition, transition);\n}\n\ninstallGlobalAPI(Vue);\n\nVue.version = '1.0.27-csp';\n\n// devtools global hook\n/* istanbul ignore next */\nsetTimeout(function () {\n  if (config.devtools) {\n    if (devtools) {\n      devtools.emit('init', Vue);\n    } else if ('production' !== 'production' && inBrowser && /Chrome\\/\\d+/.test(window.navigator.userAgent)) {}\n  }\n}, 0);\n\nreturn Vue;\n\n})));"]}