text: /*!
   * Vue.js v2.5.17
   * (c) 2014-2018 Evan You
   * Released under the MIT License.
   */
  (function (global, factory) {
      typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
          typeof define === 'function' && define.amd ? define(factory) :
              (global.Vue = factory());
  }(this, (function () {
      'use strict';
  
      /*  */
  
      var emptyObject = Object.freeze({});
  
      // these helpers produces better vm code in JS engines due to their
      // explicitness and function inlining
      function isUndef(v) {
          return v === undefined || v === null
      }
  
      function isDef(v) {
          return v !== undefined && v !== null
      }
  
      function isTrue(v) {
          return v === true
      }
  
      function isFalse(v) {
          return v === false
      }
  
      /**
       * Check if value is primitive
       */
      function isPrimitive(value) {
          return (
              typeof value === 'string' ||
              typeof value === 'number' ||
              // $flow-disable-line
              typeof value === 'symbol' ||
              typeof value === 'boolean'
          )
      }
  
      /**
       * Quick object check - this is primarily used to tell
       * Objects from primitive values when we know the value
       * is a JSON-compliant type.
       */
      function isObject(obj) {
          return obj !== null && typeof obj === 'object'
      }
  
      /**
       * Get the raw type string of a value e.g. [object Object]
       */
      var _toString = Object.prototype.toString;
  
      function toRawType(value) {
          return _toString.call(value).slice(8, -1)
      }
  
      /**
       * Strict object type check. Only returns true
       * for plain JavaScript objects.
       */
      function isPlainObject(obj) {
          return _toString.call(obj) === '[object Object]'
      }
  
      function isRegExp(v) {
          return _toString.call(v) === '[object RegExp]'
      }
  
      /**
       * Check if val is a valid array index.
       */
      function isValidArrayIndex(val) {
          var n = parseFloat(String(val));
          return n >= 0 && Math.floor(n) === n && isFinite(val)
      }
  
      /**
       * Convert a value to a string that is actually rendered.
       */
      function toString(val) {
          return val == null
              ? ''
              : typeof val === 'object'
                  ? JSON.stringify(val, null, 2)
                  : String(val)
      }
  
      /**
       * Convert a input value to a number for persistence.
       * If the conversion fails, return original string.
       */
      function toNumber(val) {
          var n = parseFloat(val);
          return isNaN(n) ? val : n
      }
  
      /**
       * Make a map and return a function for checking if a key
       * is in that map.
       */
      function makeMap(
          str,
          expectsLowerCase
      ) {
          var map = Object.create(null);
          var list = str.split(',');
          for (var i = 0; i < list.length; i++) {
              map[list[i]] = true;
          }
          return expectsLowerCase
              ? function (val) { return map[val.toLowerCase()]; }
              : function (val) { return map[val]; }
      }
  
      /**
       * Check if a tag is a built-in tag.
       */
      var isBuiltInTag = makeMap('slot,component', true);
  
      /**
       * Check if a attribute is a reserved attribute.
       */
      var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');
  
      /**
       * Remove an item from an array
       */
      function remove(arr, item) {
          if (arr.length) {
              var index = arr.indexOf(item);
              if (index > -1) {
                  return arr.splice(index, 1)
              }
          }
      }
  
      /**
       * Check whether the object has the property.
       */
      var hasOwnProperty = Object.prototype.hasOwnProperty;
      function hasOwn(obj, key) {
          return hasOwnProperty.call(obj, key)
      }
  
      /**
       * Create a cached version of a pure function.
       */
      function cached(fn) {
          var cache = Object.create(null);
          return (function cachedFn(str) {
              var hit = cache[str];
              return hit || (cache[str] = fn(str))
          })
      }
  
      /**
       * Camelize a hyphen-delimited string.
       */
      var camelizeRE = /-(\w)/g;
      var camelize = cached(function (str) {
          return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
      });
  
      /**
       * Capitalize a string.
       */
      var capitalize = cached(function (str) {
          return str.charAt(0).toUpperCase() + str.slice(1)
      });
  
      /**
       * Hyphenate a camelCase string.
       */
      var hyphenateRE = /\B([A-Z])/g;
      var hyphenate = cached(function (str) {
          return str.replace(hyphenateRE, '-$1').toLowerCase()
      });
  
      /**
       * Simple bind polyfill for environments that do not support it... e.g.
       * PhantomJS 1.x. Technically we don't need this anymore since native bind is
       * now more performant in most browsers, but removing it would be breaking for
       * code that was able to run in PhantomJS 1.x, so this must be kept for
       * backwards compatibility.
       */
  
      /* istanbul ignore next */
      function polyfillBind(fn, ctx) {
          function boundFn(a) {
              var l = arguments.length;
              return l
                  ? l > 1
                      ? fn.apply(ctx, arguments)
                      : fn.call(ctx, a)
                  : fn.call(ctx)
          }
  
          boundFn._length = fn.length;
          return boundFn
      }
  
      function nativeBind(fn, ctx) {
          return fn.bind(ctx)
      }
  
      var bind = Function.prototype.bind
          ? nativeBind
          : polyfillBind;
  
      /**
       * Convert an Array-like object to a real Array.
       */
      function toArray(list, start) {
          start = start || 0;
          var i = list.length - start;
          var ret = new Array(i);
          while (i--) {
              ret[i] = list[i + start];
          }
          return ret
      }
  
      /**
       * Mix properties into target object.
       */
      function extend(to, _from) {
          for (var key in _from) {
              to[key] = _from[key];
          }
          return to
      }
  
      /**
       * Merge an Array of Objects into a single Object.
       */
      function toObject(arr) {
          var res = {};
          for (var i = 0; i < arr.length; i++) {
              if (arr[i]) {
                  extend(res, arr[i]);
              }
          }
          return res
      }
  
      /**
       * Perform no operation.
       * Stubbing args to make Flow happy without leaving useless transpiled code
       * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
       */
      function noop(a, b, c) { }
  
      /**
       * Always return false.
       */
      var no = function (a, b, c) { return false; };
  
      /**
       * Return same value
       */
      var identity = function (_) { return _; };
  
      /**
       * Generate a static keys string from compiler modules.
       */
  
  
      /**
       * Check if two values are loosely equal - that is,
       * if they are plain objects, do they have the same shape?
       */
      function looseEqual(a, b) {
          if (a === b) { return true }
          var isObjectA = isObject(a);
          var isObjectB = isObject(b);
          if (isObjectA && isObjectB) {
              try {
                  var isArrayA = Array.isArray(a);
                  var isArrayB = Array.isArray(b);
                  if (isArrayA && isArrayB) {
                      return a.length === b.length && a.every(function (e, i) {
                          return looseEqual(e, b[i])
                      })
                  } else if (!isArrayA && !isArrayB) {
                      var keysA = Object.keys(a);
                      var keysB = Object.keys(b);
                      return keysA.length === keysB.length && keysA.every(function (key) {
                          return looseEqual(a[key], b[key])
                      })
                  } else {
                      /* istanbul ignore next */
                      return false
                  }
              } catch (e) {
                  /* istanbul ignore next */
                  return false
              }
          } else if (!isObjectA && !isObjectB) {
              return String(a) === String(b)
          } else {
              return false
          }
      }
  
      function looseIndexOf(arr, val) {
          for (var i = 0; i < arr.length; i++) {
              if (looseEqual(arr[i], val)) { return i }
          }
          return -1
      }
  
      /**
       * Ensure a function is called only once.
       */
      function once(fn) {
          var called = false;
          return function () {
              if (!called) {
                  called = true;
                  fn.apply(this, arguments);
              }
          }
      }
  
      var SSR_ATTR = 'data-server-rendered';
  
      var ASSET_TYPES = [
          'component',
          'directive',
          'filter'
      ];
  
      var LIFECYCLE_HOOKS = [
          'beforeCreate',
          'created',
          'beforeMount',
          'mounted',
          'beforeUpdate',
          'updated',
          'beforeDestroy',
          'destroyed',
          'activated',
          'deactivated',
          'errorCaptured'
      ];
  
      /*  */
  
      var config = ({
          /**
           * Option merge strategies (used in core/util/options)
           */
          // $flow-disable-line
          optionMergeStrategies: Object.create(null),
  
          /**
           * Whether to suppress warnings.
           */
          silent: false,
  
          /**
           * Show production mode tip message on boot?
           */
          productionTip: "development" !== 'production',
  
          /**
           * Whether to enable devtools
           */
          devtools: "development" !== 'production',
  
          /**
           * Whether to record perf
           */
          performance: false,
  
          /**
           * Error handler for watcher errors
           */
          errorHandler: null,
  
          /**
           * Warn handler for watcher warns
           */
          warnHandler: null,
  
          /**
           * Ignore certain custom elements
           */
          ignoredElements: [],
  
          /**
           * Custom user key aliases for v-on
           */
          // $flow-disable-line
          keyCodes: Object.create(null),
  
          /**
           * Check if a tag is reserved so that it cannot be registered as a
           * component. This is platform-dependent and may be overwritten.
           */
          isReservedTag: no,
  
          /**
           * Check if an attribute is reserved so that it cannot be used as a component
           * prop. This is platform-dependent and may be overwritten.
           */
          isReservedAttr: no,
  
          /**
           * Check if a tag is an unknown element.
           * Platform-dependent.
           */
          isUnknownElement: no,
  
          /**
           * Get the namespace of an element
           */
          getTagNamespace: noop,
  
          /**
           * Parse the real tag name for the specific platform.
           */
          parsePlatformTagName: identity,
  
          /**
           * Check if an attribute must be bound using property, e.g. value
           * Platform-dependent.
           */
          mustUseProp: no,
  
          /**
           * Exposed for legacy reasons
           */
          _lifecycleHooks: LIFECYCLE_HOOKS
      })
  
      /*  */
  
      /**
       * Check if a string starts with $ or _
       */
      function isReserved(str) {
          var c = (str + '').charCodeAt(0);
          return c === 0x24 || c === 0x5F
      }
  
      /**
       * Define a property.
       */
      function def(obj, key, val, enumerable) {
          Object.defineProperty(obj, key, {
              value: val,
              enumerable: !!enumerable,
              writable: true,
              configurable: true
          });
      }
  
      /**
       * Parse simple path.
       */
      var bailRE = /[^\w.$]/;
      function parsePath(path) {
          if (bailRE.test(path)) {
              return
          }
          var segments = path.split('.');
          return function (obj) {
              for (var i = 0; i < segments.length; i++) {
                  if (!obj) { return }
                  obj = obj[segments[i]];
              }
              return obj
          }
      }
  
      /*  */
  
      // can we use __proto__?
      var hasProto = '__proto__' in {};
  
      // Browser environment sniffing
      var inBrowser = typeof window !== 'undefined';
      var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
      var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
      var UA = inBrowser && window.navigator.userAgent.toLowerCase();
      var isIE = UA && /msie|trident/.test(UA);
      var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
      var isEdge = UA && UA.indexOf('edge/') > 0;
      var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
      var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
      var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
  
      // Firefox has a "watch" function on Object.prototype...
      var nativeWatch = ({}).watch;
  
      var supportsPassive = false;
      if (inBrowser) {
          try {
              var opts = {};
              Object.defineProperty(opts, 'passive', ({
                  get: function get() {
                      /* istanbul ignore next */
                      supportsPassive = true;
                  }
              })); // https://github.com/facebook/flow/issues/285
              window.addEventListener('test-passive', null, opts);
          } catch (e) { }
      }
  
      // this needs to be lazy-evaled because vue may be required before
      // vue-server-renderer can set VUE_ENV
      var _isServer;
      var isServerRendering = function () {
          if (_isServer === undefined) {
              /* istanbul ignore if */
              if (!inBrowser && !inWeex && typeof global !== 'undefined') {
                  // detect presence of vue-server-renderer and avoid
                  // Webpack shimming the process
                  _isServer = global['process'].env.VUE_ENV === 'server';
              } else {
                  _isServer = false;
              }
          }
          return _isServer
      };
  
      // detect devtools
      var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
  
      /* istanbul ignore next */
      function isNative(Ctor) {
          return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
      }
  
      var hasSymbol =
          typeof Symbol !== 'undefined' && isNative(Symbol) &&
          typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);
  
      var _Set;
      /* istanbul ignore if */ // $flow-disable-line
      if (typeof Set !== 'undefined' && isNative(Set)) {
          // use native Set when available.
          _Set = Set;
      } else {
          // a non-standard Set polyfill that only works with primitive keys.
          _Set = (function () {
              function Set() {
                  this.set = Object.create(null);
              }
              Set.prototype.has = function has(key) {
                  return this.set[key] === true
              };
              Set.prototype.add = function add(key) {
                  this.set[key] = true;
              };
              Set.prototype.clear = function clear() {
                  this.set = Object.create(null);
              };
  
              return Set;
          }());
      }
  
      /*  */
  
      var warn = noop;
      var tip = noop;
      var generateComponentTrace = (noop); // work around flow check
      var formatComponentName = (noop);
  
      {
          var hasConsole = typeof console !== 'undefined';
          var classifyRE = /(?:^|[-_])(\w)/g;
          var classify = function (str) {
              return str
                  .replace(classifyRE, function (c) { return c.toUpperCase(); })
                  .replace(/[-_]/g, '');
          };
  
          warn = function (msg, vm) {
              var trace = vm ? generateComponentTrace(vm) : '';
  
              if (config.warnHandler) {
                  config.warnHandler.call(null, msg, vm, trace);
              } else if (hasConsole && (!config.silent)) {
                  console.error(("[Vue warn]: " + msg + trace));
              }
          };
  
          tip = function (msg, vm) {
              if (hasConsole && (!config.silent)) {
                  console.warn("[Vue tip]: " + msg + (
                      vm ? generateComponentTrace(vm) : ''
                  ));
              }
          };
  
          formatComponentName = function (vm, includeFile) {
              if (vm.$root === vm) {
                  return '<Root>'
              }
              var options = typeof vm === 'function' && vm.cid != null
                  ? vm.options
                  : vm._isVue
                      ? vm.$options || vm.constructor.options
                      : vm || {};
              var name = options.name || options._componentTag;
              var file = options.__file;
              if (!name && file) {
                  var match = file.match(/([^/\\]+)\.vue$/);
                  name = match && match[1];
              }
  
              return (
                  (name ? ("<" + (classify(name)) + ">") : "<Anonymous>") +
                  (file && includeFile !== false ? (" at " + file) : '')
              )
          };
  
          var repeat = function (str, n) {
              var res = '';
              while (n) {
                  if (n % 2 === 1) { res += str; }
                  if (n > 1) { str += str; }
                  n >>= 1;
              }
              return res
          };
  
          generateComponentTrace = function (vm) {
              if (vm._isVue && vm.$parent) {
                  var tree = [];
                  var currentRecursiveSequence = 0;
                  while (vm) {
                      if (tree.length > 0) {
                          var last = tree[tree.length - 1];
                          if (last.constructor === vm.constructor) {
                              currentRecursiveSequence++;
                              vm = vm.$parent;
                              continue
                          } else if (currentRecursiveSequence > 0) {
                              tree[tree.length - 1] = [last, currentRecursiveSequence];
                              currentRecursiveSequence = 0;
                          }
                      }
                      tree.push(vm);
                      vm = vm.$parent;
                  }
                  return '\n\nfound in\n\n' + tree
                      .map(function (vm, i) {
                          return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)
                              ? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)")
                              : formatComponentName(vm)));
                      })
                      .join('\n')
              } else {
                  return ("\n\n(found in " + (formatComponentName(vm)) + ")")
              }
          };
      }
  
      /*  */
  
  
      var uid = 0;
  
      /**
       * A dep is an observable that can have multiple
       * directives subscribing to it.
       */
      var Dep = function Dep() {
          this.id = uid++;
          this.subs = [];
      };
  
      Dep.prototype.addSub = function addSub(sub) {
          this.subs.push(sub);
      };
  
      Dep.prototype.removeSub = function removeSub(sub) {
          remove(this.subs, sub);
      };
  
      Dep.prototype.depend = function depend() {
          if (Dep.target) {
              Dep.target.addDep(this);
          }
      };
  
      Dep.prototype.notify = function notify() {
          // stabilize the subscriber list first
          var subs = this.subs.slice();
          for (var i = 0, l = subs.length; i < l; i++) {
              subs[i].update();
          }
      };
  
      // the current target watcher being evaluated.
      // this is globally unique because there could be only one
      // watcher being evaluated at any time.
      Dep.target = null;
      var targetStack = [];
  
      function pushTarget(_target) {
          if (Dep.target) { targetStack.push(Dep.target); }
          Dep.target = _target;
      }
  
      function popTarget() {
          Dep.target = targetStack.pop();
      }
  
      /*  */
  
      var VNode = function VNode(
          tag,
          data,
          children,
          text,
          elm,
          context,
          componentOptions,
          asyncFactory
      ) {
          this.tag = tag;
          this.data = data;
          this.children = children;
          this.text = text;
          this.elm = elm;
          this.ns = undefined;
          this.context = context;
          this.fnContext = undefined;
          this.fnOptions = undefined;
          this.fnScopeId = undefined;
          this.key = data && data.key;
          this.componentOptions = componentOptions;
          this.componentInstance = undefined;
          this.parent = undefined;
          this.raw = false;
          this.isStatic = false;
          this.isRootInsert = true;
          this.isComment = false;
          this.isCloned = false;
          this.isOnce = false;
          this.asyncFactory = asyncFactory;
          this.asyncMeta = undefined;
          this.isAsyncPlaceholder = false;
      };
  
      var prototypeAccessors = { child: { configurable: true } };
  
      // DEPRECATED: alias for componentInstance for backwards compat.
      /* istanbul ignore next */
      prototypeAccessors.child.get = function () {
          return this.componentInstance
      };
  
      Object.defineProperties(VNode.prototype, prototypeAccessors);
  
      var createEmptyVNode = function (text) {
          if (text === void 0) text = '';
  
          var node = new VNode();
          node.text = text;
          node.isComment = true;
          return node
      };
  
      function createTextVNode(val) {
          return new VNode(undefined, undefined, undefined, String(val))
      }
  
      // optimized shallow clone
      // used for static nodes and slot nodes because they may be reused across
      // multiple renders, cloning them avoids errors when DOM manipulations rely
      // on their elm reference.
      function cloneVNode(vnode) {
          var cloned = new VNode(
              vnode.tag,
              vnode.data,
              vnode.children,
              vnode.text,
              vnode.elm,
              vnode.context,
              vnode.componentOptions,
              vnode.asyncFactory
          );
          cloned.ns = vnode.ns;
          cloned.isStatic = vnode.isStatic;
          cloned.key = vnode.key;
          cloned.isComment = vnode.isComment;
          cloned.fnContext = vnode.fnContext;
          cloned.fnOptions = vnode.fnOptions;
          cloned.fnScopeId = vnode.fnScopeId;
          cloned.isCloned = true;
          return cloned
      }
  
      /*
       * not type checking this file because flow doesn't play well with
       * dynamically accessing methods on Array prototype
       */
  
      var arrayProto = Array.prototype;
      var arrayMethods = Object.create(arrayProto);
  
      var methodsToPatch = [
          'push',
          'pop',
          'shift',
          'unshift',
          'splice',
          'sort',
          'reverse'
      ];
  
      /**
       * Intercept mutating methods and emit events
       */
      methodsToPatch.forEach(function (method) {
          // cache original method
          var original = arrayProto[method];
          def(arrayMethods, method, function mutator() {
              var args = [], len = arguments.length;
              while (len--) args[len] = arguments[len];
  
              var result = original.apply(this, args);
              var ob = this.__ob__;
              var inserted;
              switch (method) {
                  case 'push':
                  case 'unshift':
                      inserted = args;
                      break
                  case 'splice':
                      inserted = args.slice(2);
                      break
              }
              if (inserted) { ob.observeArray(inserted); }
              // notify change
              ob.dep.notify();
              return result
          });
      });
  
      /*  */
  
      var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
  
      /**
       * In some cases we may want to disable observation inside a component's
       * update computation.
       */
      var shouldObserve = true;
  
      function toggleObserving(value) {
          shouldObserve = value;
      }
  
      /**
       * Observer class that is attached to each observed
       * object. Once attached, the observer converts the target
       * object's property keys into getter/setters that
       * collect dependencies and dispatch updates.
       */
      var Observer = function Observer(value) {
          this.value = value;
          this.dep = new Dep();
          this.vmCount = 0;
          def(value, '__ob__', this);
          if (Array.isArray(value)) {
              var augment = hasProto
                  ? protoAugment
                  : copyAugment;
              augment(value, arrayMethods, arrayKeys);
              this.observeArray(value);
          } else {
              this.walk(value);
          }
      };
  
      /**
       * Walk through each property and convert them into
       * getter/setters. This method should only be called when
       * value type is Object.
       */
      Observer.prototype.walk = function walk(obj) {
          var keys = Object.keys(obj);
          for (var i = 0; i < keys.length; i++) {
              defineReactive(obj, keys[i]);
          }
      };
  
      /**
       * Observe a list of Array items.
       */
      Observer.prototype.observeArray = function observeArray(items) {
          for (var i = 0, l = items.length; i < l; i++) {
              observe(items[i]);
          }
      };
  
      // helpers
  
      /**
       * Augment an target Object or Array by intercepting
       * the prototype chain using __proto__
       */
      function protoAugment(target, src, keys) {
          /* eslint-disable no-proto */
          target.__proto__ = src;
          /* eslint-enable no-proto */
      }
  
      /**
       * Augment an target Object or Array by defining
       * hidden properties.
       */
      /* istanbul ignore next */
      function copyAugment(target, src, keys) {
          for (var i = 0, l = keys.length; i < l; i++) {
              var key = keys[i];
              def(target, key, src[key]);
          }
      }
  
      /**
       * Attempt to create an observer instance for a value,
       * returns the new observer if successfully observed,
       * or the existing observer if the value already has one.
       */
      function observe(value, asRootData) {
          if (!isObject(value) || value instanceof VNode) {
              return
          }
          var ob;
          if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
              ob = value.__ob__;
          } else if (
              shouldObserve &&
              !isServerRendering() &&
              (Array.isArray(value) || isPlainObject(value)) &&
              Object.isExtensible(value) &&
              !value._isVue
          ) {
              ob = new Observer(value);
          }
          if (asRootData && ob) {
              ob.vmCount++;
          }
          return ob
      }
  
      /**
       * Define a reactive property on an Object.
       */
      function defineReactive(
          obj,
          key,
          val,
          customSetter,
          shallow
      ) {
          var dep = new Dep();
  
          var property = Object.getOwnPropertyDescriptor(obj, key);
          if (property && property.configurable === false) {
              return
          }
  
          // cater for pre-defined getter/setters
          var getter = property && property.get;
          if (!getter && arguments.length === 2) {
              val = obj[key];
          }
          var setter = property && property.set;
  
          var childOb = !shallow && observe(val);
          Object.defineProperty(obj, key, {
              enumerable: true,
              configurable: true,
              get: function reactiveGetter() {
                  var value = getter ? getter.call(obj) : val;
                  if (Dep.target) {
                      dep.depend();
                      if (childOb) {
                          childOb.dep.depend();
                          if (Array.isArray(value)) {
                              dependArray(value);
                          }
                      }
                  }
                  return value
              },
              set: function reactiveSetter(newVal) {
                  var value = getter ? getter.call(obj) : val;
                  /* eslint-disable no-self-compare */
                  if (newVal === value || (newVal !== newVal && value !== value)) {
                      return
                  }
                  /* eslint-enable no-self-compare */
                  if ("development" !== 'production' && customSetter) {
                      customSetter();
                  }
                  if (setter) {
                      setter.call(obj, newVal);
                  } else {
                      val = newVal;
                  }
                  childOb = !shallow && observe(newVal);
                  dep.notify();
              }
          });
      }
  
      /**
       * Set a property on an object. Adds the new property and
       * triggers change notification if the property doesn't
       * already exist.
       */
      function set(target, key, val) {
          if ("development" !== 'production' &&
              (isUndef(target) || isPrimitive(target))
          ) {
              warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target))));
          }
          if (Array.isArray(target) && isValidArrayIndex(key)) {
              target.length = Math.max(target.length, key);
              target.splice(key, 1, val);
              return val
          }
          if (key in target && !(key in Object.prototype)) {
              target[key] = val;
              return val
          }
          var ob = (target).__ob__;
          if (target._isVue || (ob && ob.vmCount)) {
              "development" !== 'production' && warn(
                  'Avoid adding reactive properties to a Vue instance or its root $data ' +
                  'at runtime - declare it upfront in the data option.'
              );
              return val
          }
          if (!ob) {
              target[key] = val;
              return val
          }
          defineReactive(ob.value, key, val);
          ob.dep.notify();
          return val
      }
  
      /**
       * Delete a property and trigger change if necessary.
       */
      function del(target, key) {
          if ("development" !== 'production' &&
              (isUndef(target) || isPrimitive(target))
          ) {
              warn(("Cannot delete reactive property on undefined, null, or primitive value: " + ((target))));
          }
          if (Array.isArray(target) && isValidArrayIndex(key)) {
              target.splice(key, 1);
              return
          }
          var ob = (target).__ob__;
          if (target._isVue || (ob && ob.vmCount)) {
              "development" !== 'production' && warn(
                  'Avoid deleting properties on a Vue instance or its root $data ' +
                  '- just set it to null.'
              );
              return
          }
          if (!hasOwn(target, key)) {
              return
          }
          delete target[key];
          if (!ob) {
              return
          }
          ob.dep.notify();
      }
  
      /**
       * Collect dependencies on array elements when the array is touched, since
       * we cannot intercept array element access like property getters.
       */
      function dependArray(value) {
          for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
              e = value[i];
              e && e.__ob__ && e.__ob__.dep.depend();
              if (Array.isArray(e)) {
                  dependArray(e);
              }
          }
      }
  
      /*  */
  
      /**
       * Option overwriting strategies are functions that handle
       * how to merge a parent option value and a child option
       * value into the final value.
       */
      var strats = config.optionMergeStrategies;
  
      /**
       * Options with restrictions
       */
      {
          strats.el = strats.propsData = function (parent, child, vm, key) {
              if (!vm) {
                  warn(
                      "option \"" + key + "\" can only be used during instance " +
                      'creation with the `new` keyword.'
                  );
              }
              return defaultStrat(parent, child)
          };
      }
  
      /**
       * Helper that recursively merges two data objects together.
       */
      function mergeData(to, from) {
          if (!from) { return to }
          var key, toVal, fromVal;
          var keys = Object.keys(from);
          for (var i = 0; i < keys.length; i++) {
              key = keys[i];
              toVal = to[key];
              fromVal = from[key];
              if (!hasOwn(to, key)) {
                  set(to, key, fromVal);
              } else if (isPlainObject(toVal) && isPlainObject(fromVal)) {
                  mergeData(toVal, fromVal);
              }
          }
          return to
      }
  
      /**
       * Data
       */
      function mergeDataOrFn(
          parentVal,
          childVal,
          vm
      ) {
          if (!vm) {
              // in a Vue.extend merge, both should be functions
              if (!childVal) {
                  return parentVal
              }
              if (!parentVal) {
                  return childVal
              }
              // when parentVal & childVal are both present,
              // we need to return a function that returns the
              // merged result of both functions... no need to
              // check if parentVal is a function here because
              // it has to be a function to pass previous merges.
              return function mergedDataFn() {
                  return mergeData(
                      typeof childVal === 'function' ? childVal.call(this, this) : childVal,
                      typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
                  )
              }
          } else {
              return function mergedInstanceDataFn() {
                  // instance merge
                  var instanceData = typeof childVal === 'function'
                      ? childVal.call(vm, vm)
                      : childVal;
                  var defaultData = typeof parentVal === 'function'
                      ? parentVal.call(vm, vm)
                      : parentVal;
                  if (instanceData) {
                      return mergeData(instanceData, defaultData)
                  } else {
                      return defaultData
                  }
              }
          }
      }
  
      strats.data = function (
          parentVal,
          childVal,
          vm
      ) {
          if (!vm) {
              if (childVal && typeof childVal !== 'function') {
                  "development" !== 'production' && warn(
                      'The "data" option should be a function ' +
                      'that returns a per-instance value in component ' +
                      'definitions.',
                      vm
                  );
  
                  return parentVal
              }
              return mergeDataOrFn(parentVal, childVal)
          }
  
          return mergeDataOrFn(parentVal, childVal, vm)
      };
  
      /**
       * Hooks and props are merged as arrays.
       */
      function mergeHook(
          parentVal,
          childVal
      ) {
          return childVal
              ? parentVal
                  ? parentVal.concat(childVal)
                  : Array.isArray(childVal)
                      ? childVal
                      : [childVal]
              : parentVal
      }
  
      LIFECYCLE_HOOKS.forEach(function (hook) {
          strats[hook] = mergeHook;
      });
  
      /**
       * Assets
       *
       * When a vm is present (instance creation), we need to do
       * a three-way merge between constructor options, instance
       * options and parent options.
       */
      function mergeAssets(
          parentVal,
          childVal,
          vm,
          key
      ) {
          var res = Object.create(parentVal || null);
          if (childVal) {
              "development" !== 'production' && assertObjectType(key, childVal, vm);
              return extend(res, childVal)
          } else {
              return res
          }
      }
  
      ASSET_TYPES.forEach(function (type) {
          strats[type + 's'] = mergeAssets;
      });
  
      /**
       * Watchers.
       *
       * Watchers hashes should not overwrite one
       * another, so we merge them as arrays.
       */
      strats.watch = function (
          parentVal,
          childVal,
          vm,
          key
      ) {
          // work around Firefox's Object.prototype.watch...
          if (parentVal === nativeWatch) { parentVal = undefined; }
          if (childVal === nativeWatch) { childVal = undefined; }
          /* istanbul ignore if */
          if (!childVal) { return Object.create(parentVal || null) }
          {
              assertObjectType(key, childVal, vm);
          }
          if (!parentVal) { return childVal }
          var ret = {};
          extend(ret, parentVal);
          for (var key$1 in childVal) {
              var parent = ret[key$1];
              var child = childVal[key$1];
              if (parent && !Array.isArray(parent)) {
                  parent = [parent];
              }
              ret[key$1] = parent
                  ? parent.concat(child)
                  : Array.isArray(child) ? child : [child];
          }
          return ret
      };
  
      /**
       * Other object hashes.
       */
      strats.props =
          strats.methods =
          strats.inject =
          strats.computed = function (
              parentVal,
              childVal,
              vm,
              key
          ) {
              if (childVal && "development" !== 'production') {
                  assertObjectType(key, childVal, vm);
              }
              if (!parentVal) { return childVal }
              var ret = Object.create(null);
              extend(ret, parentVal);
              if (childVal) { extend(ret, childVal); }
              return ret
          };
      strats.provide = mergeDataOrFn;
  
      /**
       * Default strategy.
       */
      var defaultStrat = function (parentVal, childVal) {
          return childVal === undefined
              ? parentVal
              : childVal
      };
  
      /**
       * Validate component names
       */
      function checkComponents(options) {
          for (var key in options.components) {
              validateComponentName(key);
          }
      }
  
      function validateComponentName(name) {
          if (!/^[a-zA-Z][\w-]*$/.test(name)) {
              warn(
                  'Invalid component name: "' + name + '". Component names ' +
                  'can only contain alphanumeric characters and the hyphen, ' +
                  'and must start with a letter.'
              );
          }
          if (isBuiltInTag(name) || config.isReservedTag(name)) {
              warn(
                  'Do not use built-in or reserved HTML elements as component ' +
                  'id: ' + name
              );
          }
      }
  
      /**
       * Ensure all props option syntax are normalized into the
       * Object-based format.
       */
      function normalizeProps(options, vm) {
          var props = options.props;
          if (!props) { return }
          var res = {};
          var i, val, name;
          if (Array.isArray(props)) {
              i = props.length;
              while (i--) {
                  val = props[i];
                  if (typeof val === 'string') {
                      name = camelize(val);
                      res[name] = { type: null };
                  } else {
                      warn('props must be strings when using array syntax.');
                  }
              }
          } else if (isPlainObject(props)) {
              for (var key in props) {
                  val = props[key];
                  name = camelize(key);
                  res[name] = isPlainObject(val)
                      ? val
                      : { type: val };
              }
          } else {
              warn(
                  "Invalid value for option \"props\": expected an Array or an Object, " +
                  "but got " + (toRawType(props)) + ".",
                  vm
              );
          }
          options.props = res;
      }
  
      /**
       * Normalize all injections into Object-based format
       */
      function normalizeInject(options, vm) {
          var inject = options.inject;
          if (!inject) { return }
          var normalized = options.inject = {};
          if (Array.isArray(inject)) {
              for (var i = 0; i < inject.length; i++) {
                  normalized[inject[i]] = { from: inject[i] };
              }
          } else if (isPlainObject(inject)) {
              for (var key in inject) {
                  var val = inject[key];
                  normalized[key] = isPlainObject(val)
                      ? extend({ from: key }, val)
                      : { from: val };
              }
          } else {
              warn(
                  "Invalid value for option \"inject\": expected an Array or an Object, " +
                  "but got " + (toRawType(inject)) + ".",
                  vm
              );
          }
      }
  
      /**
       * Normalize raw function directives into object format.
       */
      function normalizeDirectives(options) {
          var dirs = options.directives;
          if (dirs) {
              for (var key in dirs) {
                  var def = dirs[key];
                  if (typeof def === 'function') {
                      dirs[key] = { bind: def, update: def };
                  }
              }
          }
      }
  
      function assertObjectType(name, value, vm) {
          if (!isPlainObject(value)) {
              warn(
                  "Invalid value for option \"" + name + "\": expected an Object, " +
                  "but got " + (toRawType(value)) + ".",
                  vm
              );
          }
      }
  
      /**
       * Merge two option objects into a new one.
       * Core utility used in both instantiation and inheritance.
       */
      function mergeOptions(
          parent,
          child,
          vm
      ) {
          {
              checkComponents(child);
          }
  
          if (typeof child === 'function') {
              child = child.options;
          }
  
          normalizeProps(child, vm);
          normalizeInject(child, vm);
          normalizeDirectives(child);
          var extendsFrom = child.extends;
          if (extendsFrom) {
              parent = mergeOptions(parent, extendsFrom, vm);
          }
          if (child.mixins) {
              for (var i = 0, l = child.mixins.length; i < l; i++) {
                  parent = mergeOptions(parent, child.mixins[i], vm);
              }
          }
          var options = {};
          var key;
          for (key in parent) {
              mergeField(key);
          }
          for (key in child) {
              if (!hasOwn(parent, key)) {
                  mergeField(key);
              }
          }
          function mergeField(key) {
              var strat = strats[key] || defaultStrat;
              options[key] = strat(parent[key], child[key], vm, key);
          }
          return options
      }
  
      /**
       * Resolve an asset.
       * This function is used because child instances need access
       * to assets defined in its ancestor chain.
       */
      function resolveAsset(
          options,
          type,
          id,
          warnMissing
      ) {
          /* istanbul ignore if */
          if (typeof id !== 'string') {
              return
          }
          var assets = options[type];
          // check local registration variations first
          if (hasOwn(assets, id)) { return assets[id] }
          var camelizedId = camelize(id);
          if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }
          var PascalCaseId = capitalize(camelizedId);
          if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }
          // fallback to prototype chain
          var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];
          if ("development" !== 'production' && warnMissing && !res) {
              warn(
                  'Failed to resolve ' + type.slice(0, -1) + ': ' + id,
                  options
              );
          }
          return res
      }
  
      /*  */
  
      function validateProp(
          key,
          propOptions,
          propsData,
          vm
      ) {
          var prop = propOptions[key];
          var absent = !hasOwn(propsData, key);
          var value = propsData[key];
          // boolean casting
          var booleanIndex = getTypeIndex(Boolean, prop.type);
          if (booleanIndex > -1) {
              if (absent && !hasOwn(prop, 'default')) {
                  value = false;
              } else if (value === '' || value === hyphenate(key)) {
                  // only cast empty string / same name to boolean if
                  // boolean has higher priority
                  var stringIndex = getTypeIndex(String, prop.type);
                  if (stringIndex < 0 || booleanIndex < stringIndex) {
                      value = true;
                  }
              }
          }
          // check default value
          if (value === undefined) {
              value = getPropDefaultValue(vm, prop, key);
              // since the default value is a fresh copy,
              // make sure to observe it.
              var prevShouldObserve = shouldObserve;
              toggleObserving(true);
              observe(value);
              toggleObserving(prevShouldObserve);
          }
          {
              assertProp(prop, key, value, vm, absent);
          }
          return value
      }
  
      /**
       * Get the default value of a prop.
       */
      function getPropDefaultValue(vm, prop, key) {
          // no default, return undefined
          if (!hasOwn(prop, 'default')) {
              return undefined
          }
          var def = prop.default;
          // warn against non-factory defaults for Object & Array
          if ("development" !== 'production' && isObject(def)) {
              warn(
                  'Invalid default value for prop "' + key + '": ' +
                  'Props with type Object/Array must use a factory function ' +
                  'to return the default value.',
                  vm
              );
          }
          // the raw prop value was also undefined from previous render,
          // return previous default value to avoid unnecessary watcher trigger
          if (vm && vm.$options.propsData &&
              vm.$options.propsData[key] === undefined &&
              vm._props[key] !== undefined
          ) {
              return vm._props[key]
          }
          // call factory function for non-Function types
          // a value is Function if its prototype is function even across different execution context
          return typeof def === 'function' && getType(prop.type) !== 'Function'
              ? def.call(vm)
              : def
      }
  
      /**
       * Assert whether a prop is valid.
       */
      function assertProp(
          prop,
          name,
          value,
          vm,
          absent
      ) {
          if (prop.required && absent) {
              warn(
                  'Missing required prop: "' + name + '"',
                  vm
              );
              return
          }
          if (value == null && !prop.required) {
              return
          }
          var type = prop.type;
          var valid = !type || type === true;
          var expectedTypes = [];
          if (type) {
              if (!Array.isArray(type)) {
                  type = [type];
              }
              for (var i = 0; i < type.length && !valid; i++) {
                  var assertedType = assertType(value, type[i]);
                  expectedTypes.push(assertedType.expectedType || '');
                  valid = assertedType.valid;
              }
          }
          if (!valid) {
              warn(
                  "Invalid prop: type check failed for prop \"" + name + "\"." +
                  " Expected " + (expectedTypes.map(capitalize).join(', ')) +
                  ", got " + (toRawType(value)) + ".",
                  vm
              );
              return
          }
          var validator = prop.validator;
          if (validator) {
              if (!validator(value)) {
                  warn(
                      'Invalid prop: custom validator check failed for prop "' + name + '".',
                      vm
                  );
              }
          }
      }
  
      var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;
  
      function assertType(value, type) {
          var valid;
          var expectedType = getType(type);
          if (simpleCheckRE.test(expectedType)) {
              var t = typeof value;
              valid = t === expectedType.toLowerCase();
              // for primitive wrapper objects
              if (!valid && t === 'object') {
                  valid = value instanceof type;
              }
          } else if (expectedType === 'Object') {
              valid = isPlainObject(value);
          } else if (expectedType === 'Array') {
              valid = Array.isArray(value);
          } else {
              valid = value instanceof type;
          }
          return {
              valid: valid,
              expectedType: expectedType
          }
      }
  
      /**
       * Use function string name to check built-in types,
       * because a simple equality check will fail when running
       * across different vms / iframes.
       */
      function getType(fn) {
          var match = fn && fn.toString().match(/^\s*function (\w+)/);
          return match ? match[1] : ''
      }
  
      function isSameType(a, b) {
          return getType(a) === getType(b)
      }
  
      function getTypeIndex(type, expectedTypes) {
          if (!Array.isArray(expectedTypes)) {
              return isSameType(expectedTypes, type) ? 0 : -1
          }
          for (var i = 0, len = expectedTypes.length; i < len; i++) {
              if (isSameType(expectedTypes[i], type)) {
                  return i
              }
          }
          return -1
      }
  
      /*  */
  
      function handleError(err, vm, info) {
          if (vm) {
              var cur = vm;
              while ((cur = cur.$parent)) {
                  var hooks = cur.$options.errorCaptured;
                  if (hooks) {
                      for (var i = 0; i < hooks.length; i++) {
                          try {
                              var capture = hooks[i].call(cur, err, vm, info) === false;
                              if (capture) { return }
                          } catch (e) {
                              globalHandleError(e, cur, 'errorCaptured hook');
                          }
                      }
                  }
              }
          }
          globalHandleError(err, vm, info);
      }
  
      function globalHandleError(err, vm, info) {
          if (config.errorHandler) {
              try {
                  return config.errorHandler.call(null, err, vm, info)
              } catch (e) {
                  logError(e, null, 'config.errorHandler');
              }
          }
          logError(err, vm, info);
      }
  
      function logError(err, vm, info) {
          {
              warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
          }
          /* istanbul ignore else */
          if ((inBrowser || inWeex) && typeof console !== 'undefined') {
              console.error(err);
          } else {
              throw err
          }
      }
  
      /*  */
      /* globals MessageChannel */
  
      var callbacks = [];
      var pending = false;
  
      function flushCallbacks() {
          pending = false;
          var copies = callbacks.slice(0);
          callbacks.length = 0;
          for (var i = 0; i < copies.length; i++) {
              copies[i]();
          }
      }
  
      // Here we have async deferring wrappers using both microtasks and (macro) tasks.
      // In < 2.4 we used microtasks everywhere, but there are some scenarios where
      // microtasks have too high a priority and fire in between supposedly
      // sequential events (e.g. #4521, #6690) or even between bubbling of the same
      // event (#6566). However, using (macro) tasks everywhere also has subtle problems
      // when state is changed right before repaint (e.g. #6813, out-in transitions).
      // Here we use microtask by default, but expose a way to force (macro) task when
      // needed (e.g. in event handlers attached by v-on).
      var microTimerFunc;
      var macroTimerFunc;
      var useMacroTask = false;
  
      // Determine (macro) task defer implementation.
      // Technically setImmediate should be the ideal choice, but it's only available
      // in IE. The only polyfill that consistently queues the callback after all DOM
      // events triggered in the same loop is by using MessageChannel.
      /* istanbul ignore if */
      if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
          macroTimerFunc = function () {
              setImmediate(flushCallbacks);
          };
      } else if (typeof MessageChannel !== 'undefined' && (
          isNative(MessageChannel) ||
          // PhantomJS
          MessageChannel.toString() === '[object MessageChannelConstructor]'
      )) {
          var channel = new MessageChannel();
          var port = channel.port2;
          channel.port1.onmessage = flushCallbacks;
          macroTimerFunc = function () {
              port.postMessage(1);
          };
      } else {
          /* istanbul ignore next */
          macroTimerFunc = function () {
              setTimeout(flushCallbacks, 0);
          };
      }
  
      // Determine microtask defer implementation.
      /* istanbul ignore next, $flow-disable-line */
      if (typeof Promise !== 'undefined' && isNative(Promise)) {
          var p = Promise.resolve();
          microTimerFunc = function () {
              p.then(flushCallbacks);
              // in problematic UIWebViews, Promise.then doesn't completely break, but
              // it can get stuck in a weird state where callbacks are pushed into the
              // microtask queue but the queue isn't being flushed, until the browser
              // needs to do some other work, e.g. handle a timer. Therefore we can
              // "force" the microtask queue to be flushed by adding an empty timer.
              if (isIOS) { setTimeout(noop); }
          };
      } else {
          // fallback to macro
          microTimerFunc = macroTimerFunc;
      }
  
      /**
       * Wrap a function so that if any code inside triggers state change,
       * the changes are queued using a (macro) task instead of a microtask.
       */
      function withMacroTask(fn) {
          return fn._withTask || (fn._withTask = function () {
              useMacroTask = true;
              var res = fn.apply(null, arguments);
              useMacroTask = false;
              return res
          })
      }
  
      function nextTick(cb, ctx) {
          var _resolve;
          callbacks.push(function () {
              if (cb) {
                  try {
                      cb.call(ctx);
                  } catch (e) {
                      handleError(e, ctx, 'nextTick');
                  }
              } else if (_resolve) {
                  _resolve(ctx);
              }
          });
          if (!pending) {
              pending = true;
              if (useMacroTask) {
                  macroTimerFunc();
              } else {
                  microTimerFunc();
              }
          }
          // $flow-disable-line
          if (!cb && typeof Promise !== 'undefined') {
              return new Promise(function (resolve) {
                  _resolve = resolve;
              })
          }
      }
  
      /*  */
  
      /* not type checking this file because flow doesn't play well with Proxy */
  
      var initProxy;
  
      {
          var allowedGlobals = makeMap(
              'Infinity,undefined,NaN,isFinite,isNaN,' +
              'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +
              'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +
              'require' // for Webpack/Browserify
          );
  
          var warnNonPresent = function (target, key) {
              warn(
                  "Property or method \"" + key + "\" is not defined on the instance but " +
                  'referenced during render. Make sure that this property is reactive, ' +
                  'either in the data option, or for class-based components, by ' +
                  'initializing the property. ' +
                  'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',
                  target
              );
          };
  
          var hasProxy =
              typeof Proxy !== 'undefined' && isNative(Proxy);
  
          if (hasProxy) {
              var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');
              config.keyCodes = new Proxy(config.keyCodes, {
                  set: function set(target, key, value) {
                      if (isBuiltInModifier(key)) {
                          warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key));
                          return false
                      } else {
                          target[key] = value;
                          return true
                      }
                  }
              });
          }
  
          var hasHandler = {
              has: function has(target, key) {
                  var has = key in target;
                  var isAllowed = allowedGlobals(key) || key.charAt(0) === '_';
                  if (!has && !isAllowed) {
                      warnNonPresent(target, key);
                  }
                  return has || !isAllowed
              }
          };
  
          var getHandler = {
              get: function get(target, key) {
                  if (typeof key === 'string' && !(key in target)) {
                      warnNonPresent(target, key);
                  }
                  return target[key]
              }
          };
  
          initProxy = function initProxy(vm) {
              if (hasProxy) {
                  // determine which proxy handler to use
                  var options = vm.$options;
                  var handlers = options.render && options.render._withStripped
                      ? getHandler
                      : hasHandler;
                  vm._renderProxy = new Proxy(vm, handlers);
              } else {
                  vm._renderProxy = vm;
              }
          };
      }
  
      /*  */
  
      var seenObjects = new _Set();
  
      /**
       * Recursively traverse an object to evoke all converted
       * getters, so that every nested property inside the object
       * is collected as a "deep" dependency.
       */
      function traverse(val) {
          _traverse(val, seenObjects);
          seenObjects.clear();
      }
  
      function _traverse(val, seen) {
          var i, keys;
          var isA = Array.isArray(val);
          if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {
              return
          }
          if (val.__ob__) {
              var depId = val.__ob__.dep.id;
              if (seen.has(depId)) {
                  return
              }
              seen.add(depId);
          }
          if (isA) {
              i = val.length;
              while (i--) { _traverse(val[i], seen); }
          } else {
              keys = Object.keys(val);
              i = keys.length;
              while (i--) { _traverse(val[keys[i]], seen); }
          }
      }
  
      var mark;
      var measure;
  
      {
          var perf = inBrowser && window.performance;
          /* istanbul ignore if */
          if (
              perf &&
              perf.mark &&
              perf.measure &&
              perf.clearMarks &&
              perf.clearMeasures
          ) {
              mark = function (tag) { return perf.mark(tag); };
              measure = function (name, startTag, endTag) {
                  perf.measure(name, startTag, endTag);
                  perf.clearMarks(startTag);
                  perf.clearMarks(endTag);
                  perf.clearMeasures(name);
              };
          }
      }
  
      /*  */
  
      var normalizeEvent = cached(function (name) {
          var passive = name.charAt(0) === '&';
          name = passive ? name.slice(1) : name;
          var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first
          name = once$$1 ? name.slice(1) : name;
          var capture = name.charAt(0) === '!';
          name = capture ? name.slice(1) : name;
          return {
              name: name,
              once: once$$1,
              capture: capture,
              passive: passive
          }
      });
  
      function createFnInvoker(fns) {
          function invoker() {
              var arguments$1 = arguments;
  
              var fns = invoker.fns;
              if (Array.isArray(fns)) {
                  var cloned = fns.slice();
                  for (var i = 0; i < cloned.length; i++) {
                      cloned[i].apply(null, arguments$1);
                  }
              } else {
                  // return handler return value for single handlers
                  return fns.apply(null, arguments)
              }
          }
          invoker.fns = fns;
          return invoker
      }
  
      function updateListeners(
          on,
          oldOn,
          add,
          remove$$1,
          vm
      ) {
          var name, def, cur, old, event;
          for (name in on) {
              def = cur = on[name];
              old = oldOn[name];
              event = normalizeEvent(name);
              /* istanbul ignore if */
              if (isUndef(cur)) {
                  "development" !== 'production' && warn(
                      "Invalid handler for event \"" + (event.name) + "\": got " + String(cur),
                      vm
                  );
              } else if (isUndef(old)) {
                  if (isUndef(cur.fns)) {
                      cur = on[name] = createFnInvoker(cur);
                  }
                  add(event.name, cur, event.once, event.capture, event.passive, event.params);
              } else if (cur !== old) {
                  old.fns = cur;
                  on[name] = old;
              }
          }
          for (name in oldOn) {
              if (isUndef(on[name])) {
                  event = normalizeEvent(name);
                  remove$$1(event.name, oldOn[name], event.capture);
              }
          }
      }
  
      /*  */
  
      function mergeVNodeHook(def, hookKey, hook) {
          if (def instanceof VNode) {
              def = def.data.hook || (def.data.hook = {});
          }
          var invoker;
          var oldHook = def[hookKey];
  
          function wrappedHook() {
              hook.apply(this, arguments);
              // important: remove merged hook to ensure it's called only once
              // and prevent memory leak
              remove(invoker.fns, wrappedHook);
          }
  
          if (isUndef(oldHook)) {
              // no existing hook
              invoker = createFnInvoker([wrappedHook]);
          } else {
              /* istanbul ignore if */
              if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {
                  // already a merged invoker
                  invoker = oldHook;
                  invoker.fns.push(wrappedHook);
              } else {
                  // existing plain hook
                  invoker = createFnInvoker([oldHook, wrappedHook]);
              }
          }
  
          invoker.merged = true;
          def[hookKey] = invoker;
      }
  
      /*  */
  
      function extractPropsFromVNodeData(
          data,
          Ctor,
          tag
      ) {
          // we are only extracting raw values here.
          // validation and default values are handled in the child
          // component itself.
          var propOptions = Ctor.options.props;
          if (isUndef(propOptions)) {
              return
          }
          var res = {};
          var attrs = data.attrs;
          var props = data.props;
          if (isDef(attrs) || isDef(props)) {
              for (var key in propOptions) {
                  var altKey = hyphenate(key);
                  {
                      var keyInLowerCase = key.toLowerCase();
                      if (
                          key !== keyInLowerCase &&
                          attrs && hasOwn(attrs, keyInLowerCase)
                      ) {
                          tip(
                              "Prop \"" + keyInLowerCase + "\" is passed to component " +
                              (formatComponentName(tag || Ctor)) + ", but the declared prop name is" +
                              " \"" + key + "\". " +
                              "Note that HTML attributes are case-insensitive and camelCased " +
                              "props need to use their kebab-case equivalents when using in-DOM " +
                              "templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"."
                          );
                      }
                  }
                  checkProp(res, props, key, altKey, true) ||
                      checkProp(res, attrs, key, altKey, false);
              }
          }
          return res
      }
  
      function checkProp(
          res,
          hash,
          key,
          altKey,
          preserve
      ) {
          if (isDef(hash)) {
              if (hasOwn(hash, key)) {
                  res[key] = hash[key];
                  if (!preserve) {
                      delete hash[key];
                  }
                  return true
              } else if (hasOwn(hash, altKey)) {
                  res[key] = hash[altKey];
                  if (!preserve) {
                      delete hash[altKey];
                  }
                  return true
              }
          }
          return false
      }
  
      /*  */
  
      // The template compiler attempts to minimize the need for normalization by
      // statically analyzing the template at compile time.
      //
      // For plain HTML markup, normalization can be completely skipped because the
      // generated render function is guaranteed to return Array<VNode>. There are
      // two cases where extra normalization is needed:
  
      // 1. When the children contains components - because a functional component
      // may return an Array instead of a single root. In this case, just a simple
      // normalization is needed - if any child is an Array, we flatten the whole
      // thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
      // because functional components already normalize their own children.
      function simpleNormalizeChildren(children) {
          for (var i = 0; i < children.length; i++) {
              if (Array.isArray(children[i])) {
                  return Array.prototype.concat.apply([], children)
              }
          }
          return children
      }
  
      // 2. When the children contains constructs that always generated nested Arrays,
      // e.g. <template>, <slot>, v-for, or when the children is provided by user
      // with hand-written render functions / JSX. In such cases a full normalization
      // is needed to cater to all possible types of children values.
      function normalizeChildren(children) {
          return isPrimitive(children)
              ? [createTextVNode(children)]
              : Array.isArray(children)
                  ? normalizeArrayChildren(children)
                  : undefined
      }
  
      function isTextNode(node) {
          return isDef(node) && isDef(node.text) && isFalse(node.isComment)
      }
  
      function normalizeArrayChildren(children, nestedIndex) {
          var res = [];
          var i, c, lastIndex, last;
          for (i = 0; i < children.length; i++) {
              c = children[i];
              if (isUndef(c) || typeof c === 'boolean') { continue }
              lastIndex = res.length - 1;
              last = res[lastIndex];
              //  nested
              if (Array.isArray(c)) {
                  if (c.length > 0) {
                      c = normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i));
                      // merge adjacent text nodes
                      if (isTextNode(c[0]) && isTextNode(last)) {
                          res[lastIndex] = createTextVNode(last.text + (c[0]).text);
                          c.shift();
                      }
                      res.push.apply(res, c);
                  }
              } else if (isPrimitive(c)) {
                  if (isTextNode(last)) {
                      // merge adjacent text nodes
                      // this is necessary for SSR hydration because text nodes are
                      // essentially merged when rendered to HTML strings
                      res[lastIndex] = createTextVNode(last.text + c);
                  } else if (c !== '') {
                      // convert primitive to vnode
                      res.push(createTextVNode(c));
                  }
              } else {
                  if (isTextNode(c) && isTextNode(last)) {
                      // merge adjacent text nodes
                      res[lastIndex] = createTextVNode(last.text + c.text);
                  } else {
                      // default key for nested array children (likely generated by v-for)
                      if (isTrue(children._isVList) &&
                          isDef(c.tag) &&
                          isUndef(c.key) &&
                          isDef(nestedIndex)) {
                          c.key = "__vlist" + nestedIndex + "_" + i + "__";
                      }
                      res.push(c);
                  }
              }
          }
          return res
      }
  
      /*  */
  
      function ensureCtor(comp, base) {
          if (
              comp.__esModule ||
              (hasSymbol && comp[Symbol.toStringTag] === 'Module')
          ) {
              comp = comp.default;
          }
          return isObject(comp)
              ? base.extend(comp)
              : comp
      }
  
      function createAsyncPlaceholder(
          factory,
          data,
          context,
          children,
          tag
      ) {
          var node = createEmptyVNode();
          node.asyncFactory = factory;
          node.asyncMeta = { data: data, context: context, children: children, tag: tag };
          return node
      }
  
      function resolveAsyncComponent(
          factory,
          baseCtor,
          context
      ) {
          if (isTrue(factory.error) && isDef(factory.errorComp)) {
              return factory.errorComp
          }
  
          if (isDef(factory.resolved)) {
              return factory.resolved
          }
  
          if (isTrue(factory.loading) && isDef(factory.loadingComp)) {
              return factory.loadingComp
          }
  
          if (isDef(factory.contexts)) {
              // already pending
              factory.contexts.push(context);
          } else {
              var contexts = factory.contexts = [context];
              var sync = true;
  
              var forceRender = function () {
                  for (var i = 0, l = contexts.length; i < l; i++) {
                      contexts[i].$forceUpdate();
                  }
              };
  
              var resolve = once(function (res) {
                  // cache resolved
                  factory.resolved = ensureCtor(res, baseCtor);
                  // invoke callbacks only if this is not a synchronous resolve
                  // (async resolves are shimmed as synchronous during SSR)
                  if (!sync) {
                      forceRender();
                  }
              });
  
              var reject = once(function (reason) {
                  "development" !== 'production' && warn(
                      "Failed to resolve async component: " + (String(factory)) +
                      (reason ? ("\nReason: " + reason) : '')
                  );
                  if (isDef(factory.errorComp)) {
                      factory.error = true;
                      forceRender();
                  }
              });
  
              var res = factory(resolve, reject);
  
              if (isObject(res)) {
                  if (typeof res.then === 'function') {
                      // () => Promise
                      if (isUndef(factory.resolved)) {
                          res.then(resolve, reject);
                      }
                  } else if (isDef(res.component) && typeof res.component.then === 'function') {
                      res.component.then(resolve, reject);
  
                      if (isDef(res.error)) {
                          factory.errorComp = ensureCtor(res.error, baseCtor);
                      }
  
                      if (isDef(res.loading)) {
                          factory.loadingComp = ensureCtor(res.loading, baseCtor);
                          if (res.delay === 0) {
                              factory.loading = true;
                          } else {
                              setTimeout(function () {
                                  if (isUndef(factory.resolved) && isUndef(factory.error)) {
                                      factory.loading = true;
                                      forceRender();
                                  }
                              }, res.delay || 200);
                          }
                      }
  
                      if (isDef(res.timeout)) {
                          setTimeout(function () {
                              if (isUndef(factory.resolved)) {
                                  reject(
                                      "timeout (" + (res.timeout) + "ms)"
                                  );
                              }
                          }, res.timeout);
                      }
                  }
              }
  
              sync = false;
              // return in case resolved synchronously
              return factory.loading
                  ? factory.loadingComp
                  : factory.resolved
          }
      }
  
      /*  */
  
      function isAsyncPlaceholder(node) {
          return node.isComment && node.asyncFactory
      }
  
      /*  */
  
      function getFirstComponentChild(children) {
          if (Array.isArray(children)) {
              for (var i = 0; i < children.length; i++) {
                  var c = children[i];
                  if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
                      return c
                  }
              }
          }
      }
  
      /*  */
  
      /*  */
  
      function initEvents(vm) {
          vm._events = Object.create(null);
          vm._hasHookEvent = false;
          // init parent attached events
          var listeners = vm.$options._parentListeners;
          if (listeners) {
              updateComponentListeners(vm, listeners);
          }
      }
  
      var target;
  
      function add(event, fn, once) {
          if (once) {
              target.$once(event, fn);
          } else {
              target.$on(event, fn);
          }
      }
  
      function remove$1(event, fn) {
          target.$off(event, fn);
      }
  
      function updateComponentListeners(
          vm,
          listeners,
          oldListeners
      ) {
          target = vm;
          updateListeners(listeners, oldListeners || {}, add, remove$1, vm);
          target = undefined;
      }
  
      function eventsMixin(Vue) {
          var hookRE = /^hook:/;
          Vue.prototype.$on = function (event, fn) {
              var this$1 = this;
  
              var vm = this;
              if (Array.isArray(event)) {
                  for (var i = 0, l = event.length; i < l; i++) {
                      this$1.$on(event[i], fn);
                  }
              } else {
                  (vm._events[event] || (vm._events[event] = [])).push(fn);
                  // optimize hook:event cost by using a boolean flag marked at registration
                  // instead of a hash lookup
                  if (hookRE.test(event)) {
                      vm._hasHookEvent = true;
                  }
              }
              return vm
          };
  
          Vue.prototype.$once = function (event, fn) {
              var vm = this;
              function on() {
                  vm.$off(event, on);
                  fn.apply(vm, arguments);
              }
              on.fn = fn;
              vm.$on(event, on);
              return vm
          };
  
          Vue.prototype.$off = function (event, fn) {
              var this$1 = this;
  
              var vm = this;
              // all
              if (!arguments.length) {
                  vm._events = Object.create(null);
                  return vm
              }
              // array of events
              if (Array.isArray(event)) {
                  for (var i = 0, l = event.length; i < l; i++) {
                      this$1.$off(event[i], fn);
                  }
                  return vm
              }
              // specific event
              var cbs = vm._events[event];
              if (!cbs) {
                  return vm
              }
              if (!fn) {
                  vm._events[event] = null;
                  return vm
              }
              if (fn) {
                  // specific handler
                  var cb;
                  var i$1 = cbs.length;
                  while (i$1--) {
                      cb = cbs[i$1];
                      if (cb === fn || cb.fn === fn) {
                          cbs.splice(i$1, 1);
                          break
                      }
                  }
              }
              return vm
          };
  
          Vue.prototype.$emit = function (event) {
              var vm = this;
              {
                  var lowerCaseEvent = event.toLowerCase();
                  if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
                      tip(
                          "Event \"" + lowerCaseEvent + "\" is emitted in component " +
                          (formatComponentName(vm)) + " but the handler is registered for \"" + event + "\". " +
                          "Note that HTML attributes are case-insensitive and you cannot use " +
                          "v-on to listen to camelCase events when using in-DOM templates. " +
                          "You should probably use \"" + (hyphenate(event)) + "\" instead of \"" + event + "\"."
                      );
                  }
              }
              var cbs = vm._events[event];
              if (cbs) {
                  cbs = cbs.length > 1 ? toArray(cbs) : cbs;
                  var args = toArray(arguments, 1);
                  for (var i = 0, l = cbs.length; i < l; i++) {
                      try {
                          cbs[i].apply(vm, args);
                      } catch (e) {
                          handleError(e, vm, ("event handler for \"" + event + "\""));
                      }
                  }
              }
              return vm
          };
      }
  
      /*  */
  
  
  
      /**
       * Runtime helper for resolving raw children VNodes into a slot object.
       */
      function resolveSlots(
          children,
          context
      ) {
          var slots = {};
          if (!children) {
              return slots
          }
          for (var i = 0, l = children.length; i < l; i++) {
              var child = children[i];
              var data = child.data;
              // remove slot attribute if the node is resolved as a Vue slot node
              if (data && data.attrs && data.attrs.slot) {
                  delete data.attrs.slot;
              }
              // named slots should only be respected if the vnode was rendered in the
              // same context.
              if ((child.context === context || child.fnContext === context) &&
                  data && data.slot != null
              ) {
                  var name = data.slot;
                  var slot = (slots[name] || (slots[name] = []));
                  if (child.tag === 'template') {
                      slot.push.apply(slot, child.children || []);
                  } else {
                      slot.push(child);
                  }
              } else {
                  (slots.default || (slots.default = [])).push(child);
              }
          }
          // ignore slots that contains only whitespace
          for (var name$1 in slots) {
              if (slots[name$1].every(isWhitespace)) {
                  delete slots[name$1];
              }
          }
          return slots
      }
  
      function isWhitespace(node) {
          return (node.isComment && !node.asyncFactory) || node.text === ' '
      }
  
      function resolveScopedSlots(
          fns, // see flow/vnode
          res
      ) {
          res = res || {};
          for (var i = 0; i < fns.length; i++) {
              if (Array.isArray(fns[i])) {
                  resolveScopedSlots(fns[i], res);
              } else {
                  res[fns[i].key] = fns[i].fn;
              }
          }
          return res
      }
  
      /*  */
  
      var activeInstance = null;
      var isUpdatingChildComponent = false;
  
      function initLifecycle(vm) {
          var options = vm.$options;
  
          // locate first non-abstract parent
          var parent = options.parent;
          if (parent && !options.abstract) {
              while (parent.$options.abstract && parent.$parent) {
                  parent = parent.$parent;
              }
              parent.$children.push(vm);
          }
  
          vm.$parent = parent;
          vm.$root = parent ? parent.$root : vm;
  
          vm.$children = [];
          vm.$refs = {};
  
          vm._watcher = null;
          vm._inactive = null;
          vm._directInactive = false;
          vm._isMounted = false;
          vm._isDestroyed = false;
          vm._isBeingDestroyed = false;
      }
  
      function lifecycleMixin(Vue) {
          Vue.prototype._update = function (vnode, hydrating) {
              var vm = this;
              if (vm._isMounted) {
                  callHook(vm, 'beforeUpdate');
              }
              var prevEl = vm.$el;
              var prevVnode = vm._vnode;
              var prevActiveInstance = activeInstance;
              activeInstance = vm;
              vm._vnode = vnode;
              // Vue.prototype.__patch__ is injected in entry points
              // based on the rendering backend used.
              if (!prevVnode) {
                  // initial render
                  vm.$el = vm.__patch__(
                      vm.$el, vnode, hydrating, false /* removeOnly */,
                      vm.$options._parentElm,
                      vm.$options._refElm
                  );
                  // no need for the ref nodes after initial patch
                  // this prevents keeping a detached DOM tree in memory (#5851)
                  vm.$options._parentElm = vm.$options._refElm = null;
              } else {
                  // updates
                  vm.$el = vm.__patch__(prevVnode, vnode);
              }
              activeInstance = prevActiveInstance;
              // update __vue__ reference
              if (prevEl) {
                  prevEl.__vue__ = null;
              }
              if (vm.$el) {
                  vm.$el.__vue__ = vm;
              }
              // if parent is an HOC, update its $el as well
              if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
                  vm.$parent.$el = vm.$el;
              }
              // updated hook is called by the scheduler to ensure that children are
              // updated in a parent's updated hook.
          };
  
          Vue.prototype.$forceUpdate = function () {
              var vm = this;
              if (vm._watcher) {
                  vm._watcher.update();
              }
          };
  
          Vue.prototype.$destroy = function () {
              var vm = this;
              if (vm._isBeingDestroyed) {
                  return
              }
              callHook(vm, 'beforeDestroy');
              vm._isBeingDestroyed = true;
              // remove self from parent
              var parent = vm.$parent;
              if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
                  remove(parent.$children, vm);
              }
              // teardown watchers
              if (vm._watcher) {
                  vm._watcher.teardown();
              }
              var i = vm._watchers.length;
              while (i--) {
                  vm._watchers[i].teardown();
              }
              // remove reference from data ob
              // frozen object may not have observer.
              if (vm._data.__ob__) {
                  vm._data.__ob__.vmCount--;
              }
              // call the last hook...
              vm._isDestroyed = true;
              // invoke destroy hooks on current rendered tree
              vm.__patch__(vm._vnode, null);
              // fire destroyed hook
              callHook(vm, 'destroyed');
              // turn off all instance listeners.
              vm.$off();
              // remove __vue__ reference
              if (vm.$el) {
                  vm.$el.__vue__ = null;
              }
              // release circular reference (#6759)
              if (vm.$vnode) {
                  vm.$vnode.parent = null;
              }
          };
      }
  
      function mountComponent(
          vm,
          el,
          hydrating
      ) {
          vm.$el = el;
          if (!vm.$options.render) {
              vm.$options.render = createEmptyVNode;
              {
                  /* istanbul ignore if */
                  if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||
                      vm.$options.el || el) {
                      warn(
                          'You are using the runtime-only build of Vue where the template ' +
                          'compiler is not available. Either pre-compile the templates into ' +
                          'render functions, or use the compiler-included build.',
                          vm
                      );
                  } else {
                      warn(
                          'Failed to mount component: template or render function not defined.',
                          vm
                      );
                  }
              }
          }
          callHook(vm, 'beforeMount');
  
          var updateComponent;
          /* istanbul ignore if */
          if ("development" !== 'production' && config.performance && mark) {
              updateComponent = function () {
                  var name = vm._name;
                  var id = vm._uid;
                  var startTag = "vue-perf-start:" + id;
                  var endTag = "vue-perf-end:" + id;
  
                  mark(startTag);
                  var vnode = vm._render();
                  mark(endTag);
                  measure(("vue " + name + " render"), startTag, endTag);
  
                  mark(startTag);
                  vm._update(vnode, hydrating);
                  mark(endTag);
                  measure(("vue " + name + " patch"), startTag, endTag);
              };
          } else {
              updateComponent = function () {
                  vm._update(vm._render(), hydrating);
              };
          }
  
          // we set this to vm._watcher inside the watcher's constructor
          // since the watcher's initial patch may call $forceUpdate (e.g. inside child
          // component's mounted hook), which relies on vm._watcher being already defined
          new Watcher(vm, updateComponent, noop, null, true /* isRenderWatcher */);
          hydrating = false;
  
          // manually mounted instance, call mounted on self
          // mounted is called for render-created child components in its inserted hook
          if (vm.$vnode == null) {
              vm._isMounted = true;
              callHook(vm, 'mounted');
          }
          return vm
      }
  
      function updateChildComponent(
          vm,
          propsData,
          listeners,
          parentVnode,
          renderChildren
      ) {
          {
              isUpdatingChildComponent = true;
          }
  
          // determine whether component has slot children
          // we need to do this before overwriting $options._renderChildren
          var hasChildren = !!(
              renderChildren ||               // has new static slots
              vm.$options._renderChildren ||  // has old static slots
              parentVnode.data.scopedSlots || // has new scoped slots
              vm.$scopedSlots !== emptyObject // has old scoped slots
          );
  
          vm.$options._parentVnode = parentVnode;
          vm.$vnode = parentVnode; // update vm's placeholder node without re-render
  
          if (vm._vnode) { // update child tree's parent
              vm._vnode.parent = parentVnode;
          }
          vm.$options._renderChildren = renderChildren;
  
          // update $attrs and $listeners hash
          // these are also reactive so they may trigger child update if the child
          // used them during render
          vm.$attrs = parentVnode.data.attrs || emptyObject;
          vm.$listeners = listeners || emptyObject;
  
          // update props
          if (propsData && vm.$options.props) {
              toggleObserving(false);
              var props = vm._props;
              var propKeys = vm.$options._propKeys || [];
              for (var i = 0; i < propKeys.length; i++) {
                  var key = propKeys[i];
                  var propOptions = vm.$options.props; // wtf flow?
                  props[key] = validateProp(key, propOptions, propsData, vm);
              }
              toggleObserving(true);
              // keep a copy of raw propsData
              vm.$options.propsData = propsData;
          }
  
          // update listeners
          listeners = listeners || emptyObject;
          var oldListeners = vm.$options._parentListeners;
          vm.$options._parentListeners = listeners;
          updateComponentListeners(vm, listeners, oldListeners);
  
          // resolve slots + force update if has children
          if (hasChildren) {
              vm.$slots = resolveSlots(renderChildren, parentVnode.context);
              vm.$forceUpdate();
          }
  
          {
              isUpdatingChildComponent = false;
          }
      }
  
      function isInInactiveTree(vm) {
          while (vm && (vm = vm.$parent)) {
              if (vm._inactive) { return true }
          }
          return false
      }
  
      function activateChildComponent(vm, direct) {
          if (direct) {
              vm._directInactive = false;
              if (isInInactiveTree(vm)) {
                  return
              }
          } else if (vm._directInactive) {
              return
          }
          if (vm._inactive || vm._inactive === null) {
              vm._inactive = false;
              for (var i = 0; i < vm.$children.length; i++) {
                  activateChildComponent(vm.$children[i]);
              }
              callHook(vm, 'activated');
          }
      }
  
      function deactivateChildComponent(vm, direct) {
          if (direct) {
              vm._directInactive = true;
              if (isInInactiveTree(vm)) {
                  return
              }
          }
          if (!vm._inactive) {
              vm._inactive = true;
              for (var i = 0; i < vm.$children.length; i++) {
                  deactivateChildComponent(vm.$children[i]);
              }
              callHook(vm, 'deactivated');
          }
      }
  
      function callHook(vm, hook) {
          // #7573 disable dep collection when invoking lifecycle hooks
          pushTarget();
          var handlers = vm.$options[hook];
          if (handlers) {
              for (var i = 0, j = handlers.length; i < j; i++) {
                  try {
                      handlers[i].call(vm);
                  } catch (e) {
                      handleError(e, vm, (hook + " hook"));
                  }
              }
          }
          if (vm._hasHookEvent) {
              vm.$emit('hook:' + hook);
          }
          popTarget();
      }
  
      /*  */
  
  
      var MAX_UPDATE_COUNT = 100;
  
      var queue = [];
      var activatedChildren = [];
      var has = {};
      var circular = {};
      var waiting = false;
      var flushing = false;
      var index = 0;
  
      /**
       * Reset the scheduler's state.
       */
      function resetSchedulerState() {
          index = queue.length = activatedChildren.length = 0;
          has = {};
          {
              circular = {};
          }
          waiting = flushing = false;
      }
  
      /**
       * Flush both queues and run the watchers.
       */
      function flushSchedulerQueue() {
          flushing = true;
          var watcher, id;
  
          // Sort queue before flush.
          // This ensures that:
          // 1. Components are updated from parent to child. (because parent is always
          //    created before the child)
          // 2. A component's user watchers are run before its render watcher (because
          //    user watchers are created before the render watcher)
          // 3. If a component is destroyed during a parent component's watcher run,
          //    its watchers can be skipped.
          queue.sort(function (a, b) { return a.id - b.id; });
  
          // do not cache length because more watchers might be pushed
          // as we run existing watchers
          for (index = 0; index < queue.length; index++) {
              watcher = queue[index];
              id = watcher.id;
              has[id] = null;
              watcher.run();
              // in dev build, check and stop circular updates.
              if ("development" !== 'production' && has[id] != null) {
                  circular[id] = (circular[id] || 0) + 1;
                  if (circular[id] > MAX_UPDATE_COUNT) {
                      warn(
                          'You may have an infinite update loop ' + (
                              watcher.user
                                  ? ("in watcher with expression \"" + (watcher.expression) + "\"")
                                  : "in a component render function."
                          ),
                          watcher.vm
                      );
                      break
                  }
              }
          }
  
          // keep copies of post queues before resetting state
          var activatedQueue = activatedChildren.slice();
          var updatedQueue = queue.slice();
  
          resetSchedulerState();
  
          // call component updated and activated hooks
          callActivatedHooks(activatedQueue);
          callUpdatedHooks(updatedQueue);
  
          // devtool hook
          /* istanbul ignore if */
          if (devtools && config.devtools) {
              devtools.emit('flush');
          }
      }
  
      function callUpdatedHooks(queue) {
          var i = queue.length;
          while (i--) {
              var watcher = queue[i];
              var vm = watcher.vm;
              if (vm._watcher === watcher && vm._isMounted) {
                  callHook(vm, 'updated');
              }
          }
      }
  
      /**
       * Queue a kept-alive component that was activated during patch.
       * The queue will be processed after the entire tree has been patched.
       */
      function queueActivatedComponent(vm) {
          // setting _inactive to false here so that a render function can
          // rely on checking whether it's in an inactive tree (e.g. router-view)
          vm._inactive = false;
          activatedChildren.push(vm);
      }
  
      function callActivatedHooks(queue) {
          for (var i = 0; i < queue.length; i++) {
              queue[i]._inactive = true;
              activateChildComponent(queue[i], true /* true */);
          }
      }
  
      /**
       * Push a watcher into the watcher queue.
       * Jobs with duplicate IDs will be skipped unless it's
       * pushed when the queue is being flushed.
       */
      function queueWatcher(watcher) {
          var id = watcher.id;
          if (has[id] == null) {
              has[id] = true;
              if (!flushing) {
                  queue.push(watcher);
              } else {
                  // if already flushing, splice the watcher based on its id
                  // if already past its id, it will be run next immediately.
                  var i = queue.length - 1;
                  while (i > index && queue[i].id > watcher.id) {
                      i--;
                  }
                  queue.splice(i + 1, 0, watcher);
              }
              // queue the flush
              if (!waiting) {
                  waiting = true;
                  nextTick(flushSchedulerQueue);
              }
          }
      }
  
      /*  */
  
      var uid$1 = 0;
  
      /**
       * A watcher parses an expression, collects dependencies,
       * and fires callback when the expression value changes.
       * This is used for both the $watch() api and directives.
       */
      var Watcher = function Watcher(
          vm,
          expOrFn,
          cb,
          options,
          isRenderWatcher
      ) {
          this.vm = vm;
          if (isRenderWatcher) {
              vm._watcher = this;
          }
          vm._watchers.push(this);
          // options
          if (options) {
              this.deep = !!options.deep;
              this.user = !!options.user;
              this.lazy = !!options.lazy;
              this.sync = !!options.sync;
          } else {
              this.deep = this.user = this.lazy = this.sync = false;
          }
          this.cb = cb;
          this.id = ++uid$1; // uid for batching
          this.active = true;
          this.dirty = this.lazy; // for lazy watchers
          this.deps = [];
          this.newDeps = [];
          this.depIds = new _Set();
          this.newDepIds = new _Set();
          this.expression = expOrFn.toString();
          // parse expression for getter
          if (typeof expOrFn === 'function') {
              this.getter = expOrFn;
          } else {
              this.getter = parsePath(expOrFn);
              if (!this.getter) {
                  this.getter = function () { };
                  "development" !== 'production' && warn(
                      "Failed watching path: \"" + expOrFn + "\" " +
                      'Watcher only accepts simple dot-delimited paths. ' +
                      'For full control, use a function instead.',
                      vm
                  );
              }
          }
          this.value = this.lazy
              ? undefined
              : this.get();
      };
  
      /**
       * Evaluate the getter, and re-collect dependencies.
       */
      Watcher.prototype.get = function get() {
          pushTarget(this);
          var value;
          var vm = this.vm;
          try {
              value = this.getter.call(vm, vm);
          } catch (e) {
              if (this.user) {
                  handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\""));
              } else {
                  throw e
              }
          } finally {
              // "touch" every property so they are all tracked as
              // dependencies for deep watching
              if (this.deep) {
                  traverse(value);
              }
              popTarget();
              this.cleanupDeps();
          }
          return value
      };
  
      /**
       * Add a dependency to this directive.
       */
      Watcher.prototype.addDep = function addDep(dep) {
          var id = dep.id;
          if (!this.newDepIds.has(id)) {
              this.newDepIds.add(id);
              this.newDeps.push(dep);
              if (!this.depIds.has(id)) {
                  dep.addSub(this);
              }
          }
      };
  
      /**
       * Clean up for dependency collection.
       */
      Watcher.prototype.cleanupDeps = function cleanupDeps() {
          var this$1 = this;
  
          var i = this.deps.length;
          while (i--) {
              var dep = this$1.deps[i];
              if (!this$1.newDepIds.has(dep.id)) {
                  dep.removeSub(this$1);
              }
          }
          var tmp = this.depIds;
          this.depIds = this.newDepIds;
          this.newDepIds = tmp;
          this.newDepIds.clear();
          tmp = this.deps;
          this.deps = this.newDeps;
          this.newDeps = tmp;
          this.newDeps.length = 0;
      };
  
      /**
       * Subscriber interface.
       * Will be called when a dependency changes.
       */
      Watcher.prototype.update = function update() {
          /* istanbul ignore else */
          if (this.lazy) {
              this.dirty = true;
          } else if (this.sync) {
              this.run();
          } else {
              queueWatcher(this);
          }
      };
  
      /**
       * Scheduler job interface.
       * Will be called by the scheduler.
       */
      Watcher.prototype.run = function run() {
          if (this.active) {
              var value = this.get();
              if (
                  value !== this.value ||
                  // Deep watchers and watchers on Object/Arrays should fire even
                  // when the value is the same, because the value may
                  // have mutated.
                  isObject(value) ||
                  this.deep
              ) {
                  // set new value
                  var oldValue = this.value;
                  this.value = value;
                  if (this.user) {
                      try {
                          this.cb.call(this.vm, value, oldValue);
                      } catch (e) {
                          handleError(e, this.vm, ("callback for watcher \"" + (this.expression) + "\""));
                      }
                  } else {
                      this.cb.call(this.vm, value, oldValue);
                  }
              }
          }
      };
  
      /**
       * Evaluate the value of the watcher.
       * This only gets called for lazy watchers.
       */
      Watcher.prototype.evaluate = function evaluate() {
          this.value = this.get();
          this.dirty = false;
      };
  
      /**
       * Depend on all deps collected by this watcher.
       */
      Watcher.prototype.depend = function depend() {
          var this$1 = this;
  
          var i = this.deps.length;
          while (i--) {
              this$1.deps[i].depend();
          }
      };
  
      /**
       * Remove self from all dependencies' subscriber list.
       */
      Watcher.prototype.teardown = function teardown() {
          var this$1 = this;
  
          if (this.active) {
              // remove self from vm's watcher list
              // this is a somewhat expensive operation so we skip it
              // if the vm is being destroyed.
              if (!this.vm._isBeingDestroyed) {
                  remove(this.vm._watchers, this);
              }
              var i = this.deps.length;
              while (i--) {
                  this$1.deps[i].removeSub(this$1);
              }
              this.active = false;
          }
      };
  
      /*  */
  
      var sharedPropertyDefinition = {
          enumerable: true,
          configurable: true,
          get: noop,
          set: noop
      };
  
      function proxy(target, sourceKey, key) {
          sharedPropertyDefinition.get = function proxyGetter() {
              return this[sourceKey][key]
          };
          sharedPropertyDefinition.set = function proxySetter(val) {
              this[sourceKey][key] = val;
          };
          Object.defineProperty(target, key, sharedPropertyDefinition);
      }
  
      function initState(vm) {
          vm._watchers = [];
          var opts = vm.$options;
          if (opts.props) { initProps(vm, opts.props); }
          if (opts.methods) { initMethods(vm, opts.methods); }
          if (opts.data) {
              initData(vm);
          } else {
              observe(vm._data = {}, true /* asRootData */);
          }
          if (opts.computed) { initComputed(vm, opts.computed); }
          if (opts.watch && opts.watch !== nativeWatch) {
              initWatch(vm, opts.watch);
          }
      }
  
      function initProps(vm, propsOptions) {
          var propsData = vm.$options.propsData || {};
          var props = vm._props = {};
          // cache prop keys so that future props updates can iterate using Array
          // instead of dynamic object key enumeration.
          var keys = vm.$options._propKeys = [];
          var isRoot = !vm.$parent;
          // root instance props should be converted
          if (!isRoot) {
              toggleObserving(false);
          }
          var loop = function (key) {
              keys.push(key);
              var value = validateProp(key, propsOptions, propsData, vm);
              /* istanbul ignore else */
              {
                  var hyphenatedKey = hyphenate(key);
                  if (isReservedAttribute(hyphenatedKey) ||
                      config.isReservedAttr(hyphenatedKey)) {
                      warn(
                          ("\"" + hyphenatedKey + "\" is a reserved attribute and cannot be used as component prop."),
                          vm
                      );
                  }
                  defineReactive(props, key, value, function () {
                      if (vm.$parent && !isUpdatingChildComponent) {
                          warn(
                              "Avoid mutating a prop directly since the value will be " +
                              "overwritten whenever the parent component re-renders. " +
                              "Instead, use a data or computed property based on the prop's " +
                              "value. Prop being mutated: \"" + key + "\"",
                              vm
                          );
                      }
                  });
              }
              // static props are already proxied on the component's prototype
              // during Vue.extend(). We only need to proxy props defined at
              // instantiation here.
              if (!(key in vm)) {
                  proxy(vm, "_props", key);
              }
          };
  
          for (var key in propsOptions) loop(key);
          toggleObserving(true);
      }
  
      function initData(vm) {
          var data = vm.$options.data;
          data = vm._data = typeof data === 'function'
              ? getData(data, vm)
              : data || {};
          if (!isPlainObject(data)) {
              data = {};
              "development" !== 'production' && warn(
                  'data functions should return an object:\n' +
                  'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
                  vm
              );
          }
          // proxy data on instance
          var keys = Object.keys(data);
          var props = vm.$options.props;
          var methods = vm.$options.methods;
          var i = keys.length;
          while (i--) {
              var key = keys[i];
              {
                  if (methods && hasOwn(methods, key)) {
                      warn(
                          ("Method \"" + key + "\" has already been defined as a data property."),
                          vm
                      );
                  }
              }
              if (props && hasOwn(props, key)) {
                  "development" !== 'production' && warn(
                      "The data property \"" + key + "\" is already declared as a prop. " +
                      "Use prop default value instead.",
                      vm
                  );
              } else if (!isReserved(key)) {
                  proxy(vm, "_data", key);
              }
          }
          // observe data
          observe(data, true /* asRootData */);
      }
  
      function getData(data, vm) {
          // #7573 disable dep collection when invoking data getters
          pushTarget();
          try {
              return data.call(vm, vm)
          } catch (e) {
              handleError(e, vm, "data()");
              return {}
          } finally {
              popTarget();
          }
      }
  
      var computedWatcherOptions = { lazy: true };
  
      function initComputed(vm, computed) {
          // $flow-disable-line
          var watchers = vm._computedWatchers = Object.create(null);
          // computed properties are just getters during SSR
          var isSSR = isServerRendering();
  
          for (var key in computed) {
              var userDef = computed[key];
              var getter = typeof userDef === 'function' ? userDef : userDef.get;
              if ("development" !== 'production' && getter == null) {
                  warn(
                      ("Getter is missing for computed property \"" + key + "\"."),
                      vm
                  );
              }
  
              if (!isSSR) {
                  // create internal watcher for the computed property.
                  watchers[key] = new Watcher(
                      vm,
                      getter || noop,
                      noop,
                      computedWatcherOptions
                  );
              }
  
              // component-defined computed properties are already defined on the
              // component prototype. We only need to define computed properties defined
              // at instantiation here.
              if (!(key in vm)) {
                  defineComputed(vm, key, userDef);
              } else {
                  if (key in vm.$data) {
                      warn(("The computed property \"" + key + "\" is already defined in data."), vm);
                  } else if (vm.$options.props && key in vm.$options.props) {
                      warn(("The computed property \"" + key + "\" is already defined as a prop."), vm);
                  }
              }
          }
      }
  
      function defineComputed(
          target,
          key,
          userDef
      ) {
          var shouldCache = !isServerRendering();
          if (typeof userDef === 'function') {
              sharedPropertyDefinition.get = shouldCache
                  ? createComputedGetter(key)
                  : userDef;
              sharedPropertyDefinition.set = noop;
          } else {
              sharedPropertyDefinition.get = userDef.get
                  ? shouldCache && userDef.cache !== false
                      ? createComputedGetter(key)
                      : userDef.get
                  : noop;
              sharedPropertyDefinition.set = userDef.set
                  ? userDef.set
                  : noop;
          }
          if ("development" !== 'production' &&
              sharedPropertyDefinition.set === noop) {
              sharedPropertyDefinition.set = function () {
                  warn(
                      ("Computed property \"" + key + "\" was assigned to but it has no setter."),
                      this
                  );
              };
          }
          Object.defineProperty(target, key, sharedPropertyDefinition);
      }
  
      function createComputedGetter(key) {
          return function computedGetter() {
              var watcher = this._computedWatchers && this._computedWatchers[key];
              if (watcher) {
                  if (watcher.dirty) {
                      watcher.evaluate();
                  }
                  if (Dep.target) {
                      watcher.depend();
                  }
                  return watcher.value
              }
          }
      }
  
      function initMethods(vm, methods) {
          var props = vm.$options.props;
          for (var key in methods) {
              {
                  if (methods[key] == null) {
                      warn(
                          "Method \"" + key + "\" has an undefined value in the component definition. " +
                          "Did you reference the function correctly?",
                          vm
                      );
                  }
                  if (props && hasOwn(props, key)) {
                      warn(
                          ("Method \"" + key + "\" has already been defined as a prop."),
                          vm
                      );
                  }
                  if ((key in vm) && isReserved(key)) {
                      warn(
                          "Method \"" + key + "\" conflicts with an existing Vue instance method. " +
                          "Avoid defining component methods that start with _ or $."
                      );
                  }
              }
              vm[key] = methods[key] == null ? noop : bind(methods[key], vm);
          }
      }
  
      function initWatch(vm, watch) {
          for (var key in watch) {
              var handler = watch[key];
              if (Array.isArray(handler)) {
                  for (var i = 0; i < handler.length; i++) {
                      createWatcher(vm, key, handler[i]);
                  }
              } else {
                  createWatcher(vm, key, handler);
              }
          }
      }
  
      function createWatcher(
          vm,
          expOrFn,
          handler,
          options
      ) {
          if (isPlainObject(handler)) {
              options = handler;
              handler = handler.handler;
          }
          if (typeof handler === 'string') {
              handler = vm[handler];
          }
          return vm.$watch(expOrFn, handler, options)
      }
  
      function stateMixin(Vue) {
          // flow somehow has problems with directly declared definition object
          // when using Object.defineProperty, so we have to procedurally build up
          // the object here.
          var dataDef = {};
          dataDef.get = function () { return this._data };
          var propsDef = {};
          propsDef.get = function () { return this._props };
          {
              dataDef.set = function (newData) {
                  warn(
                      'Avoid replacing instance root $data. ' +
                      'Use nested data properties instead.',
                      this
                  );
              };
              propsDef.set = function () {
                  warn("$props is readonly.", this);
              };
          }
          Object.defineProperty(Vue.prototype, '$data', dataDef);
          Object.defineProperty(Vue.prototype, '$props', propsDef);
  
          Vue.prototype.$set = set;
          Vue.prototype.$delete = del;
  
          Vue.prototype.$watch = function (
              expOrFn,
              cb,
              options
          ) {
              var vm = this;
              if (isPlainObject(cb)) {
                  return createWatcher(vm, expOrFn, cb, options)
              }
              options = options || {};
              options.user = true;
              var watcher = new Watcher(vm, expOrFn, cb, options);
              if (options.immediate) {
                  cb.call(vm, watcher.value);
              }
              return function unwatchFn() {
                  watcher.teardown();
              }
          };
      }
  
      /*  */
  
      function initProvide(vm) {
          var provide = vm.$options.provide;
          if (provide) {
              vm._provided = typeof provide === 'function'
                  ? provide.call(vm)
                  : provide;
          }
      }
  
      function initInjections(vm) {
          var result = resolveInject(vm.$options.inject, vm);
          if (result) {
              toggleObserving(false);
              Object.keys(result).forEach(function (key) {
                  /* istanbul ignore else */
                  {
                      defineReactive(vm, key, result[key], function () {
                          warn(
                              "Avoid mutating an injected value directly since the changes will be " +
                              "overwritten whenever the provided component re-renders. " +
                              "injection being mutated: \"" + key + "\"",
                              vm
                          );
                      });
                  }
              });
              toggleObserving(true);
          }
      }
  
      function resolveInject(inject, vm) {
          if (inject) {
              // inject is :any because flow is not smart enough to figure out cached
              var result = Object.create(null);
              var keys = hasSymbol
                  ? Reflect.ownKeys(inject).filter(function (key) {
                      /* istanbul ignore next */
                      return Object.getOwnPropertyDescriptor(inject, key).enumerable
                  })
                  : Object.keys(inject);
  
              for (var i = 0; i < keys.length; i++) {
                  var key = keys[i];
                  var provideKey = inject[key].from;
                  var source = vm;
                  while (source) {
                      if (source._provided && hasOwn(source._provided, provideKey)) {
                          result[key] = source._provided[provideKey];
                          break
                      }
                      source = source.$parent;
                  }
                  if (!source) {
                      if ('default' in inject[key]) {
                          var provideDefault = inject[key].default;
                          result[key] = typeof provideDefault === 'function'
                              ? provideDefault.call(vm)
                              : provideDefault;
                      } else {
                          warn(("Injection \"" + key + "\" not found"), vm);
                      }
                  }
              }
              return result
          }
      }
  
      /*  */
  
      /**
       * Runtime helper for rendering v-for lists.
       */
      function renderList(
          val,
          render
      ) {
          var ret, i, l, keys, key;
          if (Array.isArray(val) || typeof val === 'string') {
              ret = new Array(val.length);
              for (i = 0, l = val.length; i < l; i++) {
                  ret[i] = render(val[i], i);
              }
          } else if (typeof val === 'number') {
              ret = new Array(val);
              for (i = 0; i < val; i++) {
                  ret[i] = render(i + 1, i);
              }
          } else if (isObject(val)) {
              keys = Object.keys(val);
              ret = new Array(keys.length);
              for (i = 0, l = keys.length; i < l; i++) {
                  key = keys[i];
                  ret[i] = render(val[key], key, i);
              }
          }
          if (isDef(ret)) {
              (ret)._isVList = true;
          }
          return ret
      }
  
      /*  */
  
      /**
       * Runtime helper for rendering <slot>
       */
      function renderSlot(
          name,
          fallback,
          props,
          bindObject
      ) {
          var scopedSlotFn = this.$scopedSlots[name];
          var nodes;
          if (scopedSlotFn) { // scoped slot
              props = props || {};
              if (bindObject) {
                  if ("development" !== 'production' && !isObject(bindObject)) {
                      warn(
                          'slot v-bind without argument expects an Object',
                          this
                      );
                  }
                  props = extend(extend({}, bindObject), props);
              }
              nodes = scopedSlotFn(props) || fallback;
          } else {
              var slotNodes = this.$slots[name];
              // warn duplicate slot usage
              if (slotNodes) {
                  if ("development" !== 'production' && slotNodes._rendered) {
                      warn(
                          "Duplicate presence of slot \"" + name + "\" found in the same render tree " +
                          "- this will likely cause render errors.",
                          this
                      );
                  }
                  slotNodes._rendered = true;
              }
              nodes = slotNodes || fallback;
          }
  
          var target = props && props.slot;
          if (target) {
              return this.$createElement('template', { slot: target }, nodes)
          } else {
              return nodes
          }
      }
  
      /*  */
  
      /**
       * Runtime helper for resolving filters
       */
      function resolveFilter(id) {
          return resolveAsset(this.$options, 'filters', id, true) || identity
      }
  
      /*  */
  
      function isKeyNotMatch(expect, actual) {
          if (Array.isArray(expect)) {
              return expect.indexOf(actual) === -1
          } else {
              return expect !== actual
          }
      }
  
      /**
       * Runtime helper for checking keyCodes from config.
       * exposed as Vue.prototype._k
       * passing in eventKeyName as last argument separately for backwards compat
       */
      function checkKeyCodes(
          eventKeyCode,
          key,
          builtInKeyCode,
          eventKeyName,
          builtInKeyName
      ) {
          var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;
          if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {
              return isKeyNotMatch(builtInKeyName, eventKeyName)
          } else if (mappedKeyCode) {
              return isKeyNotMatch(mappedKeyCode, eventKeyCode)
          } else if (eventKeyName) {
              return hyphenate(eventKeyName) !== key
          }
      }
  
      /*  */
  
      /**
       * Runtime helper for merging v-bind="object" into a VNode's data.
       */
      function bindObjectProps(
          data,
          tag,
          value,
          asProp,
          isSync
      ) {
          if (value) {
              if (!isObject(value)) {
                  "development" !== 'production' && warn(
                      'v-bind without argument expects an Object or Array value',
                      this
                  );
              } else {
                  if (Array.isArray(value)) {
                      value = toObject(value);
                  }
                  var hash;
                  var loop = function (key) {
                      if (
                          key === 'class' ||
                          key === 'style' ||
                          isReservedAttribute(key)
                      ) {
                          hash = data;
                      } else {
                          var type = data.attrs && data.attrs.type;
                          hash = asProp || config.mustUseProp(tag, type, key)
                              ? data.domProps || (data.domProps = {})
                              : data.attrs || (data.attrs = {});
                      }
                      if (!(key in hash)) {
                          hash[key] = value[key];
  
                          if (isSync) {
                              var on = data.on || (data.on = {});
                              on[("update:" + key)] = function ($event) {
                                  value[key] = $event;
                              };
                          }
                      }
                  };
  
                  for (var key in value) loop(key);
              }
          }
          return data
      }
  
      /*  */
  
      /**
       * Runtime helper for rendering static trees.
       */
      function renderStatic(
          index,
          isInFor
      ) {
          var cached = this._staticTrees || (this._staticTrees = []);
          var tree = cached[index];
          // if has already-rendered static tree and not inside v-for,
          // we can reuse the same tree.
          if (tree && !isInFor) {
              return tree
          }
          // otherwise, render a fresh tree.
          tree = cached[index] = this.$options.staticRenderFns[index].call(
              this._renderProxy,
              null,
              this // for render fns generated for functional component templates
          );
          markStatic(tree, ("__static__" + index), false);
          return tree
      }
  
      /**
       * Runtime helper for v-once.
       * Effectively it means marking the node as static with a unique key.
       */
      function markOnce(
          tree,
          index,
          key
      ) {
          markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
          return tree
      }
  
      function markStatic(
          tree,
          key,
          isOnce
      ) {
          if (Array.isArray(tree)) {
              for (var i = 0; i < tree.length; i++) {
                  if (tree[i] && typeof tree[i] !== 'string') {
                      markStaticNode(tree[i], (key + "_" + i), isOnce);
                  }
              }
          } else {
              markStaticNode(tree, key, isOnce);
          }
      }
  
      function markStaticNode(node, key, isOnce) {
          node.isStatic = true;
          node.key = key;
          node.isOnce = isOnce;
      }
  
      /*  */
  
      function bindObjectListeners(data, value) {
          if (value) {
              if (!isPlainObject(value)) {
                  "development" !== 'production' && warn(
                      'v-on without argument expects an Object value',
                      this
                  );
              } else {
                  var on = data.on = data.on ? extend({}, data.on) : {};
                  for (var key in value) {
                      var existing = on[key];
                      var ours = value[key];
                      on[key] = existing ? [].concat(existing, ours) : ours;
                  }
              }
          }
          return data
      }
  
      /*  */
  
      function installRenderHelpers(target) {
          target._o = markOnce;
          target._n = toNumber;
          target._s = toString;
          target._l = renderList;
          target._t = renderSlot;
          target._q = looseEqual;
          target._i = looseIndexOf;
          target._m = renderStatic;
          target._f = resolveFilter;
          target._k = checkKeyCodes;
          target._b = bindObjectProps;
          target._v = createTextVNode;
          target._e = createEmptyVNode;
          target._u = resolveScopedSlots;
          target._g = bindObjectListeners;
      }
  
      /*  */
  
      function FunctionalRenderContext(
          data,
          props,
          children,
          parent,
          Ctor
      ) {
          var options = Ctor.options;
          // ensure the createElement function in functional components
          // gets a unique context - this is necessary for correct named slot check
          var contextVm;
          if (hasOwn(parent, '_uid')) {
              contextVm = Object.create(parent);
              // $flow-disable-line
              contextVm._original = parent;
          } else {
              // the context vm passed in is a functional context as well.
              // in this case we want to make sure we are able to get a hold to the
              // real context instance.
              contextVm = parent;
              // $flow-disable-line
              parent = parent._original;
          }
          var isCompiled = isTrue(options._compiled);
          var needNormalization = !isCompiled;
  
          this.data = data;
          this.props = props;
          this.children = children;
          this.parent = parent;
          this.listeners = data.on || emptyObject;
          this.injections = resolveInject(options.inject, parent);
          this.slots = function () { return resolveSlots(children, parent); };
  
          // support for compiled functional template
          if (isCompiled) {
              // exposing $options for renderStatic()
              this.$options = options;
              // pre-resolve slots for renderSlot()
              this.$slots = this.slots();
              this.$scopedSlots = data.scopedSlots || emptyObject;
          }
  
          if (options._scopeId) {
              this._c = function (a, b, c, d) {
                  var vnode = createElement(contextVm, a, b, c, d, needNormalization);
                  if (vnode && !Array.isArray(vnode)) {
                      vnode.fnScopeId = options._scopeId;
                      vnode.fnContext = parent;
                  }
                  return vnode
              };
          } else {
              this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };
          }
      }
  
      installRenderHelpers(FunctionalRenderContext.prototype);
  
      function createFunctionalComponent(
          Ctor,
          propsData,
          data,
          contextVm,
          children
      ) {
          var options = Ctor.options;
          var props = {};
          var propOptions = options.props;
          if (isDef(propOptions)) {
              for (var key in propOptions) {
                  props[key] = validateProp(key, propOptions, propsData || emptyObject);
              }
          } else {
              if (isDef(data.attrs)) { mergeProps(props, data.attrs); }
              if (isDef(data.props)) { mergeProps(props, data.props); }
          }
  
          var renderContext = new FunctionalRenderContext(
              data,
              props,
              children,
              contextVm,
              Ctor
          );
  
          var vnode = options.render.call(null, renderContext._c, renderContext);
  
          if (vnode instanceof VNode) {
              return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options)
          } else if (Array.isArray(vnode)) {
              var vnodes = normalizeChildren(vnode) || [];
              var res = new Array(vnodes.length);
              for (var i = 0; i < vnodes.length; i++) {
                  res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options);
              }
              return res
          }
      }
  
      function cloneAndMarkFunctionalResult(vnode, data, contextVm, options) {
          // #7817 clone node before setting fnContext, otherwise if the node is reused
          // (e.g. it was from a cached normal slot) the fnContext causes named slots
          // that should not be matched to match.
          var clone = cloneVNode(vnode);
          clone.fnContext = contextVm;
          clone.fnOptions = options;
          if (data.slot) {
              (clone.data || (clone.data = {})).slot = data.slot;
          }
          return clone
      }
  
      function mergeProps(to, from) {
          for (var key in from) {
              to[camelize(key)] = from[key];
          }
      }
  
      /*  */
  
  
  
  
      // Register the component hook to weex native render engine.
      // The hook will be triggered by native, not javascript.
  
  
      // Updates the state of the component to weex native render engine.
  
      /*  */
  
      // https://github.com/Hanks10100/weex-native-directive/tree/master/component
  
      // listening on native callback
  
      /*  */
  
      /*  */
  
      // inline hooks to be invoked on component VNodes during patch
      var componentVNodeHooks = {
          init: function init(
              vnode,
              hydrating,
              parentElm,
              refElm
          ) {
              if (
                  vnode.componentInstance &&
                  !vnode.componentInstance._isDestroyed &&
                  vnode.data.keepAlive
              ) {
                  // kept-alive components, treat as a patch
                  var mountedNode = vnode; // work around flow
                  componentVNodeHooks.prepatch(mountedNode, mountedNode);
              } else {
                  var child = vnode.componentInstance = createComponentInstanceForVnode(
                      vnode,
                      activeInstance,
                      parentElm,
                      refElm
                  );
                  child.$mount(hydrating ? vnode.elm : undefined, hydrating);
              }
          },
  
          prepatch: function prepatch(oldVnode, vnode) {
              var options = vnode.componentOptions;
              var child = vnode.componentInstance = oldVnode.componentInstance;
              updateChildComponent(
                  child,
                  options.propsData, // updated props
                  options.listeners, // updated listeners
                  vnode, // new parent vnode
                  options.children // new children
              );
          },
  
          insert: function insert(vnode) {
              var context = vnode.context;
              var componentInstance = vnode.componentInstance;
              if (!componentInstance._isMounted) {
                  componentInstance._isMounted = true;
                  callHook(componentInstance, 'mounted');
              }
              if (vnode.data.keepAlive) {
                  if (context._isMounted) {
                      // vue-router#1212
                      // During updates, a kept-alive component's child components may
                      // change, so directly walking the tree here may call activated hooks
                      // on incorrect children. Instead we push them into a queue which will
                      // be processed after the whole patch process ended.
                      queueActivatedComponent(componentInstance);
                  } else {
                      activateChildComponent(componentInstance, true /* direct */);
                  }
              }
          },
  
          destroy: function destroy(vnode) {
              var componentInstance = vnode.componentInstance;
              if (!componentInstance._isDestroyed) {
                  if (!vnode.data.keepAlive) {
                      componentInstance.$destroy();
                  } else {
                      deactivateChildComponent(componentInstance, true /* direct */);
                  }
              }
          }
      };
  
      var hooksToMerge = Object.keys(componentVNodeHooks);
  
      function createComponent(
          Ctor,
          data,
          context,
          children,
          tag
      ) {
          if (isUndef(Ctor)) {
              return
          }
  
          var baseCtor = context.$options._base;
  
          // plain options object: turn it into a constructor
          if (isObject(Ctor)) {
              Ctor = baseCtor.extend(Ctor);
          }
  
          // if at this stage it's not a constructor or an async component factory,
          // reject.
          if (typeof Ctor !== 'function') {
              {
                  warn(("Invalid Component definition: " + (String(Ctor))), context);
              }
              return
          }
  
          // async component
          var asyncFactory;
          if (isUndef(Ctor.cid)) {
              asyncFactory = Ctor;
              Ctor = resolveAsyncComponent(asyncFactory, baseCtor, context);
              if (Ctor === undefined) {
                  // return a placeholder node for async component, which is rendered
                  // as a comment node but preserves all the raw information for the node.
                  // the information will be used for async server-rendering and hydration.
                  return createAsyncPlaceholder(
                      asyncFactory,
                      data,
                      context,
                      children,
                      tag
                  )
              }
          }
  
          data = data || {};
  
          // resolve constructor options in case global mixins are applied after
          // component constructor creation
          resolveConstructorOptions(Ctor);
  
          // transform component v-model data into props & events
          if (isDef(data.model)) {
              transformModel(Ctor.options, data);
          }
  
          // extract props
          var propsData = extractPropsFromVNodeData(data, Ctor, tag);
  
          // functional component
          if (isTrue(Ctor.options.functional)) {
              return createFunctionalComponent(Ctor, propsData, data, context, children)
          }
  
          // extract listeners, since these needs to be treated as
          // child component listeners instead of DOM listeners
          var listeners = data.on;
          // replace with listeners with .native modifier
          // so it gets processed during parent component patch.
          data.on = data.nativeOn;
  
          if (isTrue(Ctor.options.abstract)) {
              // abstract components do not keep anything
              // other than props & listeners & slot
  
              // work around flow
              var slot = data.slot;
              data = {};
              if (slot) {
                  data.slot = slot;
              }
          }
  
          // install component management hooks onto the placeholder node
          installComponentHooks(data);
  
          // return a placeholder vnode
          var name = Ctor.options.name || tag;
          var vnode = new VNode(
              ("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
              data, undefined, undefined, undefined, context,
              { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },
              asyncFactory
          );
  
          // Weex specific: invoke recycle-list optimized @render function for
          // extracting cell-slot template.
          // https://github.com/Hanks10100/weex-native-directive/tree/master/component
          /* istanbul ignore if */
          return vnode
      }
  
      function createComponentInstanceForVnode(
          vnode, // we know it's MountedComponentVNode but flow doesn't
          parent, // activeInstance in lifecycle state
          parentElm,
          refElm
      ) {
          var options = {
              _isComponent: true,
              parent: parent,
              _parentVnode: vnode,
              _parentElm: parentElm || null,
              _refElm: refElm || null
          };
          // check inline-template render functions
          var inlineTemplate = vnode.data.inlineTemplate;
          if (isDef(inlineTemplate)) {
              options.render = inlineTemplate.render;
              options.staticRenderFns = inlineTemplate.staticRenderFns;
          }
          return new vnode.componentOptions.Ctor(options)
      }
  
      function installComponentHooks(data) {
          var hooks = data.hook || (data.hook = {});
          for (var i = 0; i < hooksToMerge.length; i++) {
              var key = hooksToMerge[i];
              hooks[key] = componentVNodeHooks[key];
          }
      }
  
      // transform component v-model info (value and callback) into
      // prop and event handler respectively.
      function transformModel(options, data) {
          var prop = (options.model && options.model.prop) || 'value';
          var event = (options.model && options.model.event) || 'input'; (data.props || (data.props = {}))[prop] = data.model.value;
          var on = data.on || (data.on = {});
          if (isDef(on[event])) {
              on[event] = [data.model.callback].concat(on[event]);
          } else {
              on[event] = data.model.callback;
          }
      }
  
      /*  */
  
      var SIMPLE_NORMALIZE = 1;
      var ALWAYS_NORMALIZE = 2;
  
      // wrapper function for providing a more flexible interface
      // without getting yelled at by flow
      function createElement(
          context,
          tag,
          data,
          children,
          normalizationType,
          alwaysNormalize
      ) {
          if (Array.isArray(data) || isPrimitive(data)) {
              normalizationType = children;
              children = data;
              data = undefined;
          }
          if (isTrue(alwaysNormalize)) {
              normalizationType = ALWAYS_NORMALIZE;
          }
          return _createElement(context, tag, data, children, normalizationType)
      }
  
      function _createElement(
          context,
          tag,
          data,
          children,
          normalizationType
      ) {
          if (isDef(data) && isDef((data).__ob__)) {
              "development" !== 'production' && warn(
                  "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" +
                  'Always create fresh vnode data objects in each render!',
                  context
              );
              return createEmptyVNode()
          }
          // object syntax in v-bind
          if (isDef(data) && isDef(data.is)) {
              tag = data.is;
          }
          if (!tag) {
              // in case of component :is set to falsy value
              return createEmptyVNode()
          }
          // warn against non-primitive key
          if ("development" !== 'production' &&
              isDef(data) && isDef(data.key) && !isPrimitive(data.key)
          ) {
              {
                  warn(
                      'Avoid using non-primitive value as key, ' +
                      'use string/number value instead.',
                      context
                  );
              }
          }
          // support single function children as default scoped slot
          if (Array.isArray(children) &&
              typeof children[0] === 'function'
          ) {
              data = data || {};
              data.scopedSlots = { default: children[0] };
              children.length = 0;
          }
          if (normalizationType === ALWAYS_NORMALIZE) {
              children = normalizeChildren(children);
          } else if (normalizationType === SIMPLE_NORMALIZE) {
              children = simpleNormalizeChildren(children);
          }
          var vnode, ns;
          if (typeof tag === 'string') {
              var Ctor;
              ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);
              if (config.isReservedTag(tag)) {
                  // platform built-in elements
                  vnode = new VNode(
                      config.parsePlatformTagName(tag), data, children,
                      undefined, undefined, context
                  );
              } else if (isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {
                  // component
                  vnode = createComponent(Ctor, data, context, children, tag);
              } else {
                  // unknown or unlisted namespaced elements
                  // check at runtime because it may get assigned a namespace when its
                  // parent normalizes children
                  vnode = new VNode(
                      tag, data, children,
                      undefined, undefined, context
                  );
              }
          } else {
              // direct component options / constructor
              vnode = createComponent(tag, data, context, children);
          }
          if (Array.isArray(vnode)) {
              return vnode
          } else if (isDef(vnode)) {
              if (isDef(ns)) { applyNS(vnode, ns); }
              if (isDef(data)) { registerDeepBindings(data); }
              return vnode
          } else {
              return createEmptyVNode()
          }
      }
  
      function applyNS(vnode, ns, force) {
          vnode.ns = ns;
          if (vnode.tag === 'foreignObject') {
              // use default namespace inside foreignObject
              ns = undefined;
              force = true;
          }
          if (isDef(vnode.children)) {
              for (var i = 0, l = vnode.children.length; i < l; i++) {
                  var child = vnode.children[i];
                  if (isDef(child.tag) && (
                      isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {
                      applyNS(child, ns, force);
                  }
              }
          }
      }
  
      // ref #5318
      // necessary to ensure parent re-render when deep bindings like :style and
      // :class are used on slot nodes
      function registerDeepBindings(data) {
          if (isObject(data.style)) {
              traverse(data.style);
          }
          if (isObject(data.class)) {
              traverse(data.class);
          }
      }
  
      /*  */
  
      function initRender(vm) {
          vm._vnode = null; // the root of the child tree
          vm._staticTrees = null; // v-once cached trees
          var options = vm.$options;
          var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree
          var renderContext = parentVnode && parentVnode.context;
          vm.$slots = resolveSlots(options._renderChildren, renderContext);
          vm.$scopedSlots = emptyObject;
          // bind the createElement fn to this instance
          // so that we get proper render context inside it.
          // args order: tag, data, children, normalizationType, alwaysNormalize
          // internal version is used by render functions compiled from templates
          vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
          // normalization is always applied for the public version, used in
          // user-written render functions.
          vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
  
          // $attrs & $listeners are exposed for easier HOC creation.
          // they need to be reactive so that HOCs using them are always updated
          var parentData = parentVnode && parentVnode.data;
  
          /* istanbul ignore else */
          {
              defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {
                  !isUpdatingChildComponent && warn("$attrs is readonly.", vm);
              }, true);
              defineReactive(vm, '$listeners', options._parentListeners || emptyObject, function () {
                  !isUpdatingChildComponent && warn("$listeners is readonly.", vm);
              }, true);
          }
      }
  
      function renderMixin(Vue) {
          // install runtime convenience helpers
          installRenderHelpers(Vue.prototype);
  
          Vue.prototype.$nextTick = function (fn) {
              return nextTick(fn, this)
          };
  
          Vue.prototype._render = function () {
              var vm = this;
              var ref = vm.$options;
              var render = ref.render;
              var _parentVnode = ref._parentVnode;
  
              // reset _rendered flag on slots for duplicate slot check
              {
                  for (var key in vm.$slots) {
                      // $flow-disable-line
                      vm.$slots[key]._rendered = false;
                  }
              }
  
              if (_parentVnode) {
                  vm.$scopedSlots = _parentVnode.data.scopedSlots || emptyObject;
              }
  
              // set parent vnode. this allows render functions to have access
              // to the data on the placeholder node.
              vm.$vnode = _parentVnode;
              // render self
              var vnode;
              try {
                  vnode = render.call(vm._renderProxy, vm.$createElement);
              } catch (e) {
                  handleError(e, vm, "render");
                  // return error render result,
                  // or previous vnode to prevent render error causing blank component
                  /* istanbul ignore else */
                  {
                      if (vm.$options.renderError) {
                          try {
                              vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);
                          } catch (e) {
                              handleError(e, vm, "renderError");
                              vnode = vm._vnode;
                          }
                      } else {
                          vnode = vm._vnode;
                      }
                  }
              }
              // return empty vnode in case the render function errored out
              if (!(vnode instanceof VNode)) {
                  if ("development" !== 'production' && Array.isArray(vnode)) {
                      warn(
                          'Multiple root nodes returned from render function. Render function ' +
                          'should return a single root node.',
                          vm
                      );
                  }
                  vnode = createEmptyVNode();
              }
              // set parent
              vnode.parent = _parentVnode;
              return vnode
          };
      }
  
      /*  */
  
      var uid$3 = 0;
  
      function initMixin(Vue) {
          Vue.prototype._init = function (options) {
              var vm = this;
              // a uid
              vm._uid = uid$3++;
  
              var startTag, endTag;
              /* istanbul ignore if */
              if ("development" !== 'production' && config.performance && mark) {
                  startTag = "vue-perf-start:" + (vm._uid);
                  endTag = "vue-perf-end:" + (vm._uid);
                  mark(startTag);
              }
  
              // a flag to avoid this being observed
              vm._isVue = true;
              // merge options
              if (options && options._isComponent) {
                  // optimize internal component instantiation
                  // since dynamic options merging is pretty slow, and none of the
                  // internal component options needs special treatment.
                  initInternalComponent(vm, options);
              } else {
                  vm.$options = mergeOptions(
                      resolveConstructorOptions(vm.constructor),
                      options || {},
                      vm
                  );
              }
              /* istanbul ignore else */
              {
                  initProxy(vm);
              }
              // expose real self
              vm._self = vm;
              initLifecycle(vm);
              initEvents(vm);
              initRender(vm);
              callHook(vm, 'beforeCreate');
              initInjections(vm); // resolve injections before data/props
              initState(vm);
              initProvide(vm); // resolve provide after data/props
              callHook(vm, 'created');
  
              /* istanbul ignore if */
              if ("development" !== 'production' && config.performance && mark) {
                  vm._name = formatComponentName(vm, false);
                  mark(endTag);
                  measure(("vue " + (vm._name) + " init"), startTag, endTag);
              }
  
              if (vm.$options.el) {
                  vm.$mount(vm.$options.el);
              }
          };
      }
  
      function initInternalComponent(vm, options) {
          var opts = vm.$options = Object.create(vm.constructor.options);
          // doing this because it's faster than dynamic enumeration.
          var parentVnode = options._parentVnode;
          opts.parent = options.parent;
          opts._parentVnode = parentVnode;
          opts._parentElm = options._parentElm;
          opts._refElm = options._refElm;
  
          var vnodeComponentOptions = parentVnode.componentOptions;
          opts.propsData = vnodeComponentOptions.propsData;
          opts._parentListeners = vnodeComponentOptions.listeners;
          opts._renderChildren = vnodeComponentOptions.children;
          opts._componentTag = vnodeComponentOptions.tag;
  
          if (options.render) {
              opts.render = options.render;
              opts.staticRenderFns = options.staticRenderFns;
          }
      }
  
      function resolveConstructorOptions(Ctor) {
          var options = Ctor.options;
          if (Ctor.super) {
              var superOptions = resolveConstructorOptions(Ctor.super);
              var cachedSuperOptions = Ctor.superOptions;
              if (superOptions !== cachedSuperOptions) {
                  // super option changed,
                  // need to resolve new options.
                  Ctor.superOptions = superOptions;
                  // check if there are any late-modified/attached options (#4976)
                  var modifiedOptions = resolveModifiedOptions(Ctor);
                  // update base extend options
                  if (modifiedOptions) {
                      extend(Ctor.extendOptions, modifiedOptions);
                  }
                  options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);
                  if (options.name) {
                      options.components[options.name] = Ctor;
                  }
              }
          }
          return options
      }
  
      function resolveModifiedOptions(Ctor) {
          var modified;
          var latest = Ctor.options;
          var extended = Ctor.extendOptions;
          var sealed = Ctor.sealedOptions;
          for (var key in latest) {
              if (latest[key] !== sealed[key]) {
                  if (!modified) { modified = {}; }
                  modified[key] = dedupe(latest[key], extended[key], sealed[key]);
              }
          }
          return modified
      }
  
      function dedupe(latest, extended, sealed) {
          // compare latest and sealed to ensure lifecycle hooks won't be duplicated
          // between merges
          if (Array.isArray(latest)) {
              var res = [];
              sealed = Array.isArray(sealed) ? sealed : [sealed];
              extended = Array.isArray(extended) ? extended : [extended];
              for (var i = 0; i < latest.length; i++) {
                  // push original options and not sealed options to exclude duplicated options
                  if (extended.indexOf(latest[i]) >= 0 || sealed.indexOf(latest[i]) < 0) {
                      res.push(latest[i]);
                  }
              }
              return res
          } else {
              return latest
          }
      }
  
      function Vue(options) {
          if ("development" !== 'production' &&
              !(this instanceof Vue)
          ) {
              warn('Vue is a constructor and should be called with the `new` keyword');
          }
          this._init(options);
      }
  
      initMixin(Vue);
      stateMixin(Vue);
      eventsMixin(Vue);
      lifecycleMixin(Vue);
      renderMixin(Vue);
  
      /*  */
  
      function initUse(Vue) {
          Vue.use = function (plugin) {
              var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
              if (installedPlugins.indexOf(plugin) > -1) {
                  return this
              }
  
              // additional parameters
              var args = toArray(arguments, 1);
              args.unshift(this);
              if (typeof plugin.install === 'function') {
                  plugin.install.apply(plugin, args);
              } else if (typeof plugin === 'function') {
                  plugin.apply(null, args);
              }
              installedPlugins.push(plugin);
              return this
          };
      }
  
      /*  */
  
      function initMixin$1(Vue) {
          Vue.mixin = function (mixin) {
              this.options = mergeOptions(this.options, mixin);
              return this
          };
      }
  
      /*  */
  
      function initExtend(Vue) {
          /**
           * Each instance constructor, including Vue, has a unique
           * cid. This enables us to create wrapped "child
           * constructors" for prototypal inheritance and cache them.
           */
          Vue.cid = 0;
          var cid = 1;
  
          /**
           * Class inheritance
           */
          Vue.extend = function (extendOptions) {
              extendOptions = extendOptions || {};
              var Super = this;
              var SuperId = Super.cid;
              var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
              if (cachedCtors[SuperId]) {
                  return cachedCtors[SuperId]
              }
  
              var name = extendOptions.name || Super.options.name;
              if ("development" !== 'production' && name) {
                  validateComponentName(name);
              }
  
              var Sub = function VueComponent(options) {
                  this._init(options);
              };
              Sub.prototype = Object.create(Super.prototype);
              Sub.prototype.constructor = Sub;
              Sub.cid = cid++;
              Sub.options = mergeOptions(
                  Super.options,
                  extendOptions
              );
              Sub['super'] = Super;
  
              // For props and computed properties, we define the proxy getters on
              // the Vue instances at extension time, on the extended prototype. This
              // avoids Object.defineProperty calls for each instance created.
              if (Sub.options.props) {
                  initProps$1(Sub);
              }
              if (Sub.options.computed) {
                  initComputed$1(Sub);
              }
  
              // allow further extension/mixin/plugin usage
              Sub.extend = Super.extend;
              Sub.mixin = Super.mixin;
              Sub.use = Super.use;
  
              // create asset registers, so extended classes
              // can have their private assets too.
              ASSET_TYPES.forEach(function (type) {
                  Sub[type] = Super[type];
              });
              // enable recursive self-lookup
              if (name) {
                  Sub.options.components[name] = Sub;
              }
  
              // keep a reference to the super options at extension time.
              // later at instantiation we can check if Super's options have
              // been updated.
              Sub.superOptions = Super.options;
              Sub.extendOptions = extendOptions;
              Sub.sealedOptions = extend({}, Sub.options);
  
              // cache constructor
              cachedCtors[SuperId] = Sub;
              return Sub
          };
      }
  
      function initProps$1(Comp) {
          var props = Comp.options.props;
          for (var key in props) {
              proxy(Comp.prototype, "_props", key);
          }
      }
  
      function initComputed$1(Comp) {
          var computed = Comp.options.computed;
          for (var key in computed) {
              defineComputed(Comp.prototype, key, computed[key]);
          }
      }
  
      /*  */
  
      function initAssetRegisters(Vue) {
          /**
           * Create asset registration methods.
           */
          ASSET_TYPES.forEach(function (type) {
              Vue[type] = function (
                  id,
                  definition
              ) {
                  if (!definition) {
                      return this.options[type + 's'][id]
                  } else {
                      /* istanbul ignore if */
                      if ("development" !== 'production' && type === 'component') {
                          validateComponentName(id);
                      }
                      if (type === 'component' && isPlainObject(definition)) {
                          definition.name = definition.name || id;
                          definition = this.options._base.extend(definition);
                      }
                      if (type === 'directive' && typeof definition === 'function') {
                          definition = { bind: definition, update: definition };
                      }
                      this.options[type + 's'][id] = definition;
                      return definition
                  }
              };
          });
      }
  
      /*  */
  
      function getComponentName(opts) {
          return opts && (opts.Ctor.options.name || opts.tag)
      }
  
      function matches(pattern, name) {
          if (Array.isArray(pattern)) {
              return pattern.indexOf(name) > -1
          } else if (typeof pattern === 'string') {
              return pattern.split(',').indexOf(name) > -1
          } else if (isRegExp(pattern)) {
              return pattern.test(name)
          }
          /* istanbul ignore next */
          return false
      }
  
      function pruneCache(keepAliveInstance, filter) {
          var cache = keepAliveInstance.cache;
          var keys = keepAliveInstance.keys;
          var _vnode = keepAliveInstance._vnode;
          for (var key in cache) {
              var cachedNode = cache[key];
              if (cachedNode) {
                  var name = getComponentName(cachedNode.componentOptions);
                  if (name && !filter(name)) {
                      pruneCacheEntry(cache, key, keys, _vnode);
                  }
              }
          }
      }
  
      function pruneCacheEntry(
          cache,
          key,
          keys,
          current
      ) {
          var cached$$1 = cache[key];
          if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {
              cached$$1.componentInstance.$destroy();
          }
          cache[key] = null;
          remove(keys, key);
      }
  
      var patternTypes = [String, RegExp, Array];
  
      var KeepAlive = {
          name: 'keep-alive',
          abstract: true,
  
          props: {
              include: patternTypes,
              exclude: patternTypes,
              max: [String, Number]
          },
  
          created: function created() {
              this.cache = Object.create(null);
              this.keys = [];
          },
  
          destroyed: function destroyed() {
              var this$1 = this;
  
              for (var key in this$1.cache) {
                  pruneCacheEntry(this$1.cache, key, this$1.keys);
              }
          },
  
          mounted: function mounted() {
              var this$1 = this;
  
              this.$watch('include', function (val) {
                  pruneCache(this$1, function (name) { return matches(val, name); });
              });
              this.$watch('exclude', function (val) {
                  pruneCache(this$1, function (name) { return !matches(val, name); });
              });
          },
  
          render: function render() {
              var slot = this.$slots.default;
              var vnode = getFirstComponentChild(slot);
              var componentOptions = vnode && vnode.componentOptions;
              if (componentOptions) {
                  // check pattern
                  var name = getComponentName(componentOptions);
                  var ref = this;
                  var include = ref.include;
                  var exclude = ref.exclude;
                  if (
                      // not included
                      (include && (!name || !matches(include, name))) ||
                      // excluded
                      (exclude && name && matches(exclude, name))
                  ) {
                      return vnode
                  }
  
                  var ref$1 = this;
                  var cache = ref$1.cache;
                  var keys = ref$1.keys;
                  var key = vnode.key == null
                      // same constructor may get registered as different local components
                      // so cid alone is not enough (#3269)
                      ? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '')
                      : vnode.key;
                  if (cache[key]) {
                      vnode.componentInstance = cache[key].componentInstance;
                      // make current key freshest
                      remove(keys, key);
                      keys.push(key);
                  } else {
                      cache[key] = vnode;
                      keys.push(key);
                      // prune oldest entry
                      if (this.max && keys.length > parseInt(this.max)) {
                          pruneCacheEntry(cache, keys[0], keys, this._vnode);
                      }
                  }
  
                  vnode.data.keepAlive = true;
              }
              return vnode || (slot && slot[0])
          }
      }
  
      var builtInComponents = {
          KeepAlive: KeepAlive
      }
  
      /*  */
  
      function initGlobalAPI(Vue) {
          // config
          var configDef = {};
          configDef.get = function () { return config; };
          {
              configDef.set = function () {
                  warn(
                      'Do not replace the Vue.config object, set individual fields instead.'
                  );
              };
          }
          Object.defineProperty(Vue, 'config', configDef);
  
          // exposed util methods.
          // NOTE: these are not considered part of the public API - avoid relying on
          // them unless you are aware of the risk.
          Vue.util = {
              warn: warn,
              extend: extend,
              mergeOptions: mergeOptions,
              defineReactive: defineReactive
          };
  
          Vue.set = set;
          Vue.delete = del;
          Vue.nextTick = nextTick;
  
          Vue.options = Object.create(null);
          ASSET_TYPES.forEach(function (type) {
              Vue.options[type + 's'] = Object.create(null);
          });
  
          // this is used to identify the "base" constructor to extend all plain-object
          // components with in Weex's multi-instance scenarios.
          Vue.options._base = Vue;
  
          extend(Vue.options.components, builtInComponents);
  
          initUse(Vue);
          initMixin$1(Vue);
          initExtend(Vue);
          initAssetRegisters(Vue);
      }
  
      initGlobalAPI(Vue);
  
      Object.defineProperty(Vue.prototype, '$isServer', {
          get: isServerRendering
      });
  
      Object.defineProperty(Vue.prototype, '$ssrContext', {
          get: function get() {
              /* istanbul ignore next */
              return this.$vnode && this.$vnode.ssrContext
          }
      });
  
      // expose FunctionalRenderContext for ssr runtime helper installation
      Object.defineProperty(Vue, 'FunctionalRenderContext', {
          value: FunctionalRenderContext
      });
  
      Vue.version = '2.5.17';
  
      /*  */
  
      // these are reserved for web because they are directly compiled away
      // during template compilation
      var isReservedAttr = makeMap('style,class');
  
      // attributes that should be using props for binding
      var acceptValue = makeMap('input,textarea,option,select,progress');
      var mustUseProp = function (tag, type, attr) {
          return (
              (attr === 'value' && acceptValue(tag)) && type !== 'button' ||
              (attr === 'selected' && tag === 'option') ||
              (attr === 'checked' && tag === 'input') ||
              (attr === 'muted' && tag === 'video')
          )
      };
  
      var isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');
  
      var isBooleanAttr = makeMap(
          'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +
          'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +
          'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +
          'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +
          'required,reversed,scoped,seamless,selected,sortable,translate,' +
          'truespeed,typemustmatch,visible'
      );
  
      var xlinkNS = 'http://www.w3.org/1999/xlink';
  
      var isXlink = function (name) {
          return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'
      };
  
      var getXlinkProp = function (name) {
          return isXlink(name) ? name.slice(6, name.length) : ''
      };
  
      var isFalsyAttrValue = function (val) {
          return val == null || val === false
      };
  
      /*  */
  
      function genClassForVnode(vnode) {
          var data = vnode.data;
          var parentNode = vnode;
          var childNode = vnode;
          while (isDef(childNode.componentInstance)) {
              childNode = childNode.componentInstance._vnode;
              if (childNode && childNode.data) {
                  data = mergeClassData(childNode.data, data);
              }
          }
          while (isDef(parentNode = parentNode.parent)) {
              if (parentNode && parentNode.data) {
                  data = mergeClassData(data, parentNode.data);
              }
          }
          return renderClass(data.staticClass, data.class)
      }
  
      function mergeClassData(child, parent) {
          return {
              staticClass: concat(child.staticClass, parent.staticClass),
              class: isDef(child.class)
                  ? [child.class, parent.class]
                  : parent.class
          }
      }
  
      function renderClass(
          staticClass,
          dynamicClass
      ) {
          if (isDef(staticClass) || isDef(dynamicClass)) {
              return concat(staticClass, stringifyClass(dynamicClass))
          }
          /* istanbul ignore next */
          return ''
      }
  
      function concat(a, b) {
          return a ? b ? (a + ' ' + b) : a : (b || '')
      }
  
      function stringifyClass(value) {
          if (Array.isArray(value)) {
              return stringifyArray(value)
          }
          if (isObject(value)) {
              return stringifyObject(value)
          }
          if (typeof value === 'string') {
              return value
          }
          /* istanbul ignore next */
          return ''
      }
  
      function stringifyArray(value) {
          var res = '';
          var stringified;
          for (var i = 0, l = value.length; i < l; i++) {
              if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {
                  if (res) { res += ' '; }
                  res += stringified;
              }
          }
          return res
      }
  
      function stringifyObject(value) {
          var res = '';
          for (var key in value) {
              if (value[key]) {
                  if (res) { res += ' '; }
                  res += key;
              }
          }
          return res
      }
  
      /*  */
  
      var namespaceMap = {
          svg: 'http://www.w3.org/2000/svg',
          math: 'http://www.w3.org/1998/Math/MathML'
      };
  
      var isHTMLTag = makeMap(
          'html,body,base,head,link,meta,style,title,' +
          'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +
          'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +
          'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +
          's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +
          'embed,object,param,source,canvas,script,noscript,del,ins,' +
          'caption,col,colgroup,table,thead,tbody,td,th,tr,' +
          'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +
          'output,progress,select,textarea,' +
          'details,dialog,menu,menuitem,summary,' +
          'content,element,shadow,template,blockquote,iframe,tfoot'
      );
  
      // this map is intentionally selective, only covering SVG elements that may
      // contain child elements.
      var isSVG = makeMap(
          'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +
          'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +
          'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',
          true
      );
  
  
  
      var isReservedTag = function (tag) {
          return isHTMLTag(tag) || isSVG(tag)
      };
  
      function getTagNamespace(tag) {
          if (isSVG(tag)) {
              return 'svg'
          }
          // basic support for MathML
          // note it doesn't support other MathML elements being component roots
          if (tag === 'math') {
              return 'math'
          }
      }
  
      var unknownElementCache = Object.create(null);
      function isUnknownElement(tag) {
          /* istanbul ignore if */
          if (!inBrowser) {
              return true
          }
          if (isReservedTag(tag)) {
              return false
          }
          tag = tag.toLowerCase();
          /* istanbul ignore if */
          if (unknownElementCache[tag] != null) {
              return unknownElementCache[tag]
          }
          var el = document.createElement(tag);
          if (tag.indexOf('-') > -1) {
              // http://stackoverflow.com/a/28210364/1070244
              return (unknownElementCache[tag] = (
                  el.constructor === window.HTMLUnknownElement ||
                  el.constructor === window.HTMLElement
              ))
          } else {
              return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))
          }
      }
  
      var isTextInputType = makeMap('text,number,password,search,email,tel,url');
  
      /*  */
  
      /**
       * Query an element selector if it's not an element already.
       */
      function query(el) {
          if (typeof el === 'string') {
              var selected = document.querySelector(el);
              if (!selected) {
                  "development" !== 'production' && warn(
                      'Cannot find element: ' + el
                  );
                  return document.createElement('div')
              }
              return selected
          } else {
              return el
          }
      }
  
      /*  */
  
      function createElement$1(tagName, vnode) {
          var elm = document.createElement(tagName);
          if (tagName !== 'select') {
              return elm
          }
          // false or null will remove the attribute but undefined will not
          if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) {
              elm.setAttribute('multiple', 'multiple');
          }
          return elm
      }
  
      function createElementNS(namespace, tagName) {
          return document.createElementNS(namespaceMap[namespace], tagName)
      }
  
      function createTextNode(text) {
          return document.createTextNode(text)
      }
  
      function createComment(text) {
          return document.createComment(text)
      }
  
      function insertBefore(parentNode, newNode, referenceNode) {
          parentNode.insertBefore(newNode, referenceNode);
      }
  
      function removeChild(node, child) {
          node.removeChild(child);
      }
  
      function appendChild(node, child) {
          node.appendChild(child);
      }
  
      function parentNode(node) {
          return node.parentNode
      }
  
      function nextSibling(node) {
          return node.nextSibling
      }
  
      function tagName(node) {
          return node.tagName
      }
  
      function setTextContent(node, text) {
          node.textContent = text;
      }
  
      function setStyleScope(node, scopeId) {
          node.setAttribute(scopeId, '');
      }
  
  
      var nodeOps = Object.freeze({
          createElement: createElement$1,
          createElementNS: createElementNS,
          createTextNode: createTextNode,
          createComment: createComment,
          insertBefore: insertBefore,
          removeChild: removeChild,
          appendChild: appendChild,
          parentNode: parentNode,
          nextSibling: nextSibling,
          tagName: tagName,
          setTextContent: setTextContent,
          setStyleScope: setStyleScope
      });
  
      /*  */
  
      var ref = {
          create: function create(_, vnode) {
              registerRef(vnode);
          },
          update: function update(oldVnode, vnode) {
              if (oldVnode.data.ref !== vnode.data.ref) {
                  registerRef(oldVnode, true);
                  registerRef(vnode);
              }
          },
          destroy: function destroy(vnode) {
              registerRef(vnode, true);
          }
      }
  
      function registerRef(vnode, isRemoval) {
          var key = vnode.data.ref;
          if (!isDef(key)) { return }
  
          var vm = vnode.context;
          var ref = vnode.componentInstance || vnode.elm;
          var refs = vm.$refs;
          if (isRemoval) {
              if (Array.isArray(refs[key])) {
                  remove(refs[key], ref);
              } else if (refs[key] === ref) {
                  refs[key] = undefined;
              }
          } else {
              if (vnode.data.refInFor) {
                  if (!Array.isArray(refs[key])) {
                      refs[key] = [ref];
                  } else if (refs[key].indexOf(ref) < 0) {
                      // $flow-disable-line
                      refs[key].push(ref);
                  }
              } else {
                  refs[key] = ref;
              }
          }
      }
  
      /**
       * Virtual DOM patching algorithm based on Snabbdom by
       * Simon Friis Vindum (@paldepind)
       * Licensed under the MIT License
       * https://github.com/paldepind/snabbdom/blob/master/LICENSE
       *
       * modified by Evan You (@yyx990803)
       *
       * Not type-checking this because this file is perf-critical and the cost
       * of making flow understand it is not worth it.
       */
  
      var emptyNode = new VNode('', {}, []);
  
      var hooks = ['create', 'activate', 'update', 'remove', 'destroy'];
  
      function sameVnode(a, b) {
          return (
              a.key === b.key && (
                  (
                      a.tag === b.tag &&
                      a.isComment === b.isComment &&
                      isDef(a.data) === isDef(b.data) &&
                      sameInputType(a, b)
                  ) || (
                      isTrue(a.isAsyncPlaceholder) &&
                      a.asyncFactory === b.asyncFactory &&
                      isUndef(b.asyncFactory.error)
                  )
              )
          )
      }
  
      function sameInputType(a, b) {
          if (a.tag !== 'input') { return true }
          var i;
          var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;
          var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;
          return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)
      }
  
      function createKeyToOldIdx(children, beginIdx, endIdx) {
          var i, key;
          var map = {};
          for (i = beginIdx; i <= endIdx; ++i) {
              key = children[i].key;
              if (isDef(key)) { map[key] = i; }
          }
          return map
      }
  
      function createPatchFunction(backend) {
          var i, j;
          var cbs = {};
  
          var modules = backend.modules;
          var nodeOps = backend.nodeOps;
  
          for (i = 0; i < hooks.length; ++i) {
              cbs[hooks[i]] = [];
              for (j = 0; j < modules.length; ++j) {
                  if (isDef(modules[j][hooks[i]])) {
                      cbs[hooks[i]].push(modules[j][hooks[i]]);
                  }
              }
          }
  
          function emptyNodeAt(elm) {
              return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)
          }
  
          function createRmCb(childElm, listeners) {
              function remove() {
                  if (--remove.listeners === 0) {
                      removeNode(childElm);
                  }
              }
              remove.listeners = listeners;
              return remove
          }
  
          function removeNode(el) {
              var parent = nodeOps.parentNode(el);
              // element may have already been removed due to v-html / v-text
              if (isDef(parent)) {
                  nodeOps.removeChild(parent, el);
              }
          }
  
          function isUnknownElement$$1(vnode, inVPre) {
              return (
                  !inVPre &&
                  !vnode.ns &&
                  !(
                      config.ignoredElements.length &&
                      config.ignoredElements.some(function (ignore) {
                          return isRegExp(ignore)
                              ? ignore.test(vnode.tag)
                              : ignore === vnode.tag
                      })
                  ) &&
                  config.isUnknownElement(vnode.tag)
              )
          }
  
          var creatingElmInVPre = 0;
  
          function createElm(
              vnode,
              insertedVnodeQueue,
              parentElm,
              refElm,
              nested,
              ownerArray,
              index
          ) {
              if (isDef(vnode.elm) && isDef(ownerArray)) {
                  // This vnode was used in a previous render!
                  // now it's used as a new node, overwriting its elm would cause
                  // potential patch errors down the road when it's used as an insertion
                  // reference node. Instead, we clone the node on-demand before creating
                  // associated DOM element for it.
                  vnode = ownerArray[index] = cloneVNode(vnode);
              }
  
              vnode.isRootInsert = !nested; // for transition enter check
              if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {
                  return
              }
  
              var data = vnode.data;
              var children = vnode.children;
              var tag = vnode.tag;
              if (isDef(tag)) {
                  {
                      if (data && data.pre) {
                          creatingElmInVPre++;
                      }
                      if (isUnknownElement$$1(vnode, creatingElmInVPre)) {
                          warn(
                              'Unknown custom element: <' + tag + '> - did you ' +
                              'register the component correctly? For recursive components, ' +
                              'make sure to provide the "name" option.',
                              vnode.context
                          );
                      }
                  }
  
                  vnode.elm = vnode.ns
                      ? nodeOps.createElementNS(vnode.ns, tag)
                      : nodeOps.createElement(tag, vnode);
                  setScope(vnode);
  
                  /* istanbul ignore if */
                  {
                      createChildren(vnode, children, insertedVnodeQueue);
                      if (isDef(data)) {
                          invokeCreateHooks(vnode, insertedVnodeQueue);
                      }
                      insert(parentElm, vnode.elm, refElm);
                  }
  
                  if ("development" !== 'production' && data && data.pre) {
                      creatingElmInVPre--;
                  }
              } else if (isTrue(vnode.isComment)) {
                  vnode.elm = nodeOps.createComment(vnode.text);
                  insert(parentElm, vnode.elm, refElm);
              } else {
                  vnode.elm = nodeOps.createTextNode(vnode.text);
                  insert(parentElm, vnode.elm, refElm);
              }
          }
  
          function createComponent(vnode, insertedVnodeQueue, parentElm, refElm) {
              var i = vnode.data;
              if (isDef(i)) {
                  var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;
                  if (isDef(i = i.hook) && isDef(i = i.init)) {
                      i(vnode, false /* hydrating */, parentElm, refElm);
                  }
                  // after calling the init hook, if the vnode is a child component
                  // it should've created a child instance and mounted it. the child
                  // component also has set the placeholder vnode's elm.
                  // in that case we can just return the element and be done.
                  if (isDef(vnode.componentInstance)) {
                      initComponent(vnode, insertedVnodeQueue);
                      if (isTrue(isReactivated)) {
                          reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);
                      }
                      return true
                  }
              }
          }
  
          function initComponent(vnode, insertedVnodeQueue) {
              if (isDef(vnode.data.pendingInsert)) {
                  insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);
                  vnode.data.pendingInsert = null;
              }
              vnode.elm = vnode.componentInstance.$el;
              if (isPatchable(vnode)) {
                  invokeCreateHooks(vnode, insertedVnodeQueue);
                  setScope(vnode);
              } else {
                  // empty component root.
                  // skip all element-related modules except for ref (#3455)
                  registerRef(vnode);
                  // make sure to invoke the insert hook
                  insertedVnodeQueue.push(vnode);
              }
          }
  
          function reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm) {
              var i;
              // hack for #4339: a reactivated component with inner transition
              // does not trigger because the inner node's created hooks are not called
              // again. It's not ideal to involve module-specific logic in here but
              // there doesn't seem to be a better way to do it.
              var innerNode = vnode;
              while (innerNode.componentInstance) {
                  innerNode = innerNode.componentInstance._vnode;
                  if (isDef(i = innerNode.data) && isDef(i = i.transition)) {
                      for (i = 0; i < cbs.activate.length; ++i) {
                          cbs.activate[i](emptyNode, innerNode);
                      }
                      insertedVnodeQueue.push(innerNode);
                      break
                  }
              }
              // unlike a newly created component,
              // a reactivated keep-alive component doesn't insert itself
              insert(parentElm, vnode.elm, refElm);
          }
  
          function insert(parent, elm, ref$$1) {
              if (isDef(parent)) {
                  if (isDef(ref$$1)) {
                      if (ref$$1.parentNode === parent) {
                          nodeOps.insertBefore(parent, elm, ref$$1);
                      }
                  } else {
                      nodeOps.appendChild(parent, elm);
                  }
              }
          }
  
          function createChildren(vnode, children, insertedVnodeQueue) {
              if (Array.isArray(children)) {
                  {
                      checkDuplicateKeys(children);
                  }
                  for (var i = 0; i < children.length; ++i) {
                      createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i);
                  }
              } else if (isPrimitive(vnode.text)) {
                  nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)));
              }
          }
  
          function isPatchable(vnode) {
              while (vnode.componentInstance) {
                  vnode = vnode.componentInstance._vnode;
              }
              return isDef(vnode.tag)
          }
  
          function invokeCreateHooks(vnode, insertedVnodeQueue) {
              for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {
                  cbs.create[i$1](emptyNode, vnode);
              }
              i = vnode.data.hook; // Reuse variable
              if (isDef(i)) {
                  if (isDef(i.create)) { i.create(emptyNode, vnode); }
                  if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); }
              }
          }
  
          // set scope id attribute for scoped CSS.
          // this is implemented as a special case to avoid the overhead
          // of going through the normal attribute patching process.
          function setScope(vnode) {
              var i;
              if (isDef(i = vnode.fnScopeId)) {
                  nodeOps.setStyleScope(vnode.elm, i);
              } else {
                  var ancestor = vnode;
                  while (ancestor) {
                      if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {
                          nodeOps.setStyleScope(vnode.elm, i);
                      }
                      ancestor = ancestor.parent;
                  }
              }
              // for slot content they should also get the scopeId from the host instance.
              if (isDef(i = activeInstance) &&
                  i !== vnode.context &&
                  i !== vnode.fnContext &&
                  isDef(i = i.$options._scopeId)
              ) {
                  nodeOps.setStyleScope(vnode.elm, i);
              }
          }
  
          function addVnodes(parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {
              for (; startIdx <= endIdx; ++startIdx) {
                  createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm, false, vnodes, startIdx);
              }
          }
  
          function invokeDestroyHook(vnode) {
              var i, j;
              var data = vnode.data;
              if (isDef(data)) {
                  if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }
                  for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }
              }
              if (isDef(i = vnode.children)) {
                  for (j = 0; j < vnode.children.length; ++j) {
                      invokeDestroyHook(vnode.children[j]);
                  }
              }
          }
  
          function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
              for (; startIdx <= endIdx; ++startIdx) {
                  var ch = vnodes[startIdx];
                  if (isDef(ch)) {
                      if (isDef(ch.tag)) {
                          removeAndInvokeRemoveHook(ch);
                          invokeDestroyHook(ch);
                      } else { // Text node
                          removeNode(ch.elm);
                      }
                  }
              }
          }
  
          function removeAndInvokeRemoveHook(vnode, rm) {
              if (isDef(rm) || isDef(vnode.data)) {
                  var i;
                  var listeners = cbs.remove.length + 1;
                  if (isDef(rm)) {
                      // we have a recursively passed down rm callback
                      // increase the listeners count
                      rm.listeners += listeners;
                  } else {
                      // directly removing
                      rm = createRmCb(vnode.elm, listeners);
                  }
                  // recursively invoke hooks on child component root node
                  if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {
                      removeAndInvokeRemoveHook(i, rm);
                  }
                  for (i = 0; i < cbs.remove.length; ++i) {
                      cbs.remove[i](vnode, rm);
                  }
                  if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {
                      i(vnode, rm);
                  } else {
                      rm();
                  }
              } else {
                  removeNode(vnode.elm);
              }
          }
  
          function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {
              var oldStartIdx = 0;
              var newStartIdx = 0;
              var oldEndIdx = oldCh.length - 1;
              var oldStartVnode = oldCh[0];
              var oldEndVnode = oldCh[oldEndIdx];
              var newEndIdx = newCh.length - 1;
              var newStartVnode = newCh[0];
              var newEndVnode = newCh[newEndIdx];
              var oldKeyToIdx, idxInOld, vnodeToMove, refElm;
  
              // removeOnly is a special flag used only by <transition-group>
              // to ensure removed elements stay in correct relative positions
              // during leaving transitions
              var canMove = !removeOnly;
  
              {
                  checkDuplicateKeys(newCh);
              }
  
              while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
                  if (isUndef(oldStartVnode)) {
                      oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left
                  } else if (isUndef(oldEndVnode)) {
                      oldEndVnode = oldCh[--oldEndIdx];
                  } else if (sameVnode(oldStartVnode, newStartVnode)) {
                      patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
                      oldStartVnode = oldCh[++oldStartIdx];
                      newStartVnode = newCh[++newStartIdx];
                  } else if (sameVnode(oldEndVnode, newEndVnode)) {
                      patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
                      oldEndVnode = oldCh[--oldEndIdx];
                      newEndVnode = newCh[--newEndIdx];
                  } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right
                      patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
                      canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));
                      oldStartVnode = oldCh[++oldStartIdx];
                      newEndVnode = newCh[--newEndIdx];
                  } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left
                      patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
                      canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
                      oldEndVnode = oldCh[--oldEndIdx];
                      newStartVnode = newCh[++newStartIdx];
                  } else {
                      if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }
                      idxInOld = isDef(newStartVnode.key)
                          ? oldKeyToIdx[newStartVnode.key]
                          : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);
                      if (isUndef(idxInOld)) { // New element
                          createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);
                      } else {
                          vnodeToMove = oldCh[idxInOld];
                          if (sameVnode(vnodeToMove, newStartVnode)) {
                              patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue);
                              oldCh[idxInOld] = undefined;
                              canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm);
                          } else {
                              // same key but different element. treat as new element
                              createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);
                          }
                      }
                      newStartVnode = newCh[++newStartIdx];
                  }
              }
              if (oldStartIdx > oldEndIdx) {
                  refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;
                  addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
              } else if (newStartIdx > newEndIdx) {
                  removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
              }
          }
  
          function checkDuplicateKeys(children) {
              var seenKeys = {};
              for (var i = 0; i < children.length; i++) {
                  var vnode = children[i];
                  var key = vnode.key;
                  if (isDef(key)) {
                      if (seenKeys[key]) {
                          warn(
                              ("Duplicate keys detected: '" + key + "'. This may cause an update error."),
                              vnode.context
                          );
                      } else {
                          seenKeys[key] = true;
                      }
                  }
              }
          }
  
          function findIdxInOld(node, oldCh, start, end) {
              for (var i = start; i < end; i++) {
                  var c = oldCh[i];
                  if (isDef(c) && sameVnode(node, c)) { return i }
              }
          }
  
          function patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly) {
              if (oldVnode === vnode) {
                  return
              }
  
              var elm = vnode.elm = oldVnode.elm;
  
              if (isTrue(oldVnode.isAsyncPlaceholder)) {
                  if (isDef(vnode.asyncFactory.resolved)) {
                      hydrate(oldVnode.elm, vnode, insertedVnodeQueue);
                  } else {
                      vnode.isAsyncPlaceholder = true;
                  }
                  return
              }
  
              // reuse element for static trees.
              // note we only do this if the vnode is cloned -
              // if the new node is not cloned it means the render functions have been
              // reset by the hot-reload-api and we need to do a proper re-render.
              if (isTrue(vnode.isStatic) &&
                  isTrue(oldVnode.isStatic) &&
                  vnode.key === oldVnode.key &&
                  (isTrue(vnode.isCloned) || isTrue(vnode.isOnce))
              ) {
                  vnode.componentInstance = oldVnode.componentInstance;
                  return
              }
  
              var i;
              var data = vnode.data;
              if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {
                  i(oldVnode, vnode);
              }
  
              var oldCh = oldVnode.children;
              var ch = vnode.children;
              if (isDef(data) && isPatchable(vnode)) {
                  for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }
                  if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }
              }
              if (isUndef(vnode.text)) {
                  if (isDef(oldCh) && isDef(ch)) {
                      if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }
                  } else if (isDef(ch)) {
                      if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }
                      addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
                  } else if (isDef(oldCh)) {
                      removeVnodes(elm, oldCh, 0, oldCh.length - 1);
                  } else if (isDef(oldVnode.text)) {
                      nodeOps.setTextContent(elm, '');
                  }
              } else if (oldVnode.text !== vnode.text) {
                  nodeOps.setTextContent(elm, vnode.text);
              }
              if (isDef(data)) {
                  if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }
              }
          }
  
          function invokeInsertHook(vnode, queue, initial) {
              // delay insert hooks for component root nodes, invoke them after the
              // element is really inserted
              if (isTrue(initial) && isDef(vnode.parent)) {
                  vnode.parent.data.pendingInsert = queue;
              } else {
                  for (var i = 0; i < queue.length; ++i) {
                      queue[i].data.hook.insert(queue[i]);
                  }
              }
          }
  
          var hydrationBailed = false;
          // list of modules that can skip create hook during hydration because they
          // are already rendered on the client or has no need for initialization
          // Note: style is excluded because it relies on initial clone for future
          // deep updates (#7063).
          var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key');
  
          // Note: this is a browser-only function so we can assume elms are DOM nodes.
          function hydrate(elm, vnode, insertedVnodeQueue, inVPre) {
              var i;
              var tag = vnode.tag;
              var data = vnode.data;
              var children = vnode.children;
              inVPre = inVPre || (data && data.pre);
              vnode.elm = elm;
  
              if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {
                  vnode.isAsyncPlaceholder = true;
                  return true
              }
              // assert node match
              {
                  if (!assertNodeMatch(elm, vnode, inVPre)) {
                      return false
                  }
              }
              if (isDef(data)) {
                  if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }
                  if (isDef(i = vnode.componentInstance)) {
                      // child component. it should have hydrated its own tree.
                      initComponent(vnode, insertedVnodeQueue);
                      return true
                  }
              }
              if (isDef(tag)) {
                  if (isDef(children)) {
                      // empty element, allow client to pick up and populate children
                      if (!elm.hasChildNodes()) {
                          createChildren(vnode, children, insertedVnodeQueue);
                      } else {
                          // v-html and domProps: innerHTML
                          if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {
                              if (i !== elm.innerHTML) {
                                  /* istanbul ignore if */
                                  if ("development" !== 'production' &&
                                      typeof console !== 'undefined' &&
                                      !hydrationBailed
                                  ) {
                                      hydrationBailed = true;
                                      console.warn('Parent: ', elm);
                                      console.warn('server innerHTML: ', i);
                                      console.warn('client innerHTML: ', elm.innerHTML);
                                  }
                                  return false
                              }
                          } else {
                              // iterate and compare children lists
                              var childrenMatch = true;
                              var childNode = elm.firstChild;
                              for (var i$1 = 0; i$1 < children.length; i$1++) {
                                  if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {
                                      childrenMatch = false;
                                      break
                                  }
                                  childNode = childNode.nextSibling;
                              }
                              // if childNode is not null, it means the actual childNodes list is
                              // longer than the virtual children list.
                              if (!childrenMatch || childNode) {
                                  /* istanbul ignore if */
                                  if ("development" !== 'production' &&
                                      typeof console !== 'undefined' &&
                                      !hydrationBailed
                                  ) {
                                      hydrationBailed = true;
                                      console.warn('Parent: ', elm);
                                      console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);
                                  }
                                  return false
                              }
                          }
                      }
                  }
                  if (isDef(data)) {
                      var fullInvoke = false;
                      for (var key in data) {
                          if (!isRenderedModule(key)) {
                              fullInvoke = true;
                              invokeCreateHooks(vnode, insertedVnodeQueue);
                              break
                          }
                      }
                      if (!fullInvoke && data['class']) {
                          // ensure collecting deps for deep class bindings for future updates
                          traverse(data['class']);
                      }
                  }
              } else if (elm.data !== vnode.text) {
                  elm.data = vnode.text;
              }
              return true
          }
  
          function assertNodeMatch(node, vnode, inVPre) {
              if (isDef(vnode.tag)) {
                  return vnode.tag.indexOf('vue-component') === 0 || (
                      !isUnknownElement$$1(vnode, inVPre) &&
                      vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())
                  )
              } else {
                  return node.nodeType === (vnode.isComment ? 8 : 3)
              }
          }
  
          return function patch(oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) {
              if (isUndef(vnode)) {
                  if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }
                  return
              }
  
              var isInitialPatch = false;
              var insertedVnodeQueue = [];
  
              if (isUndef(oldVnode)) {
                  // empty mount (likely as component), create new root element
                  isInitialPatch = true;
                  createElm(vnode, insertedVnodeQueue, parentElm, refElm);
              } else {
                  var isRealElement = isDef(oldVnode.nodeType);
                  if (!isRealElement && sameVnode(oldVnode, vnode)) {
                      // patch existing root node
                      patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly);
                  } else {
                      if (isRealElement) {
                          // mounting to a real element
                          // check if this is server-rendered content and if we can perform
                          // a successful hydration.
                          if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {
                              oldVnode.removeAttribute(SSR_ATTR);
                              hydrating = true;
                          }
                          if (isTrue(hydrating)) {
                              if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {
                                  invokeInsertHook(vnode, insertedVnodeQueue, true);
                                  return oldVnode
                              } else {
                                  warn(
                                      'The client-side rendered virtual DOM tree is not matching ' +
                                      'server-rendered content. This is likely caused by incorrect ' +
                                      'HTML markup, for example nesting block-level elements inside ' +
                                      '<p>, or missing <tbody>. Bailing hydration and performing ' +
                                      'full client-side render.'
                                  );
                              }
                          }
                          // either not server-rendered, or hydration failed.
                          // create an empty node and replace it
                          oldVnode = emptyNodeAt(oldVnode);
                      }
  
                      // replacing existing element
                      var oldElm = oldVnode.elm;
                      var parentElm$1 = nodeOps.parentNode(oldElm);
  
                      // create new node
                      createElm(
                          vnode,
                          insertedVnodeQueue,
                          // extremely rare edge case: do not insert if old element is in a
                          // leaving transition. Only happens when combining transition +
                          // keep-alive + HOCs. (#4590)
                          oldElm._leaveCb ? null : parentElm$1,
                          nodeOps.nextSibling(oldElm)
                      );
  
                      // update parent placeholder node element, recursively
                      if (isDef(vnode.parent)) {
                          var ancestor = vnode.parent;
                          var patchable = isPatchable(vnode);
                          while (ancestor) {
                              for (var i = 0; i < cbs.destroy.length; ++i) {
                                  cbs.destroy[i](ancestor);
                              }
                              ancestor.elm = vnode.elm;
                              if (patchable) {
                                  for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {
                                      cbs.create[i$1](emptyNode, ancestor);
                                  }
                                  // #6513
                                  // invoke insert hooks that may have been merged by create hooks.
                                  // e.g. for directives that uses the "inserted" hook.
                                  var insert = ancestor.data.hook.insert;
                                  if (insert.merged) {
                                      // start at index 1 to avoid re-invoking component mounted hook
                                      for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {
                                          insert.fns[i$2]();
                                      }
                                  }
                              } else {
                                  registerRef(ancestor);
                              }
                              ancestor = ancestor.parent;
                          }
                      }
  
                      // destroy old node
                      if (isDef(parentElm$1)) {
                          removeVnodes(parentElm$1, [oldVnode], 0, 0);
                      } else if (isDef(oldVnode.tag)) {
                          invokeDestroyHook(oldVnode);
                      }
                  }
              }
  
              invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);
              return vnode.elm
          }
      }
  
      /*  */
  
      var directives = {
          create: updateDirectives,
          update: updateDirectives,
          destroy: function unbindDirectives(vnode) {
              updateDirectives(vnode, emptyNode);
          }
      }
  
      function updateDirectives(oldVnode, vnode) {
          if (oldVnode.data.directives || vnode.data.directives) {
              _update(oldVnode, vnode);
          }
      }
  
      function _update(oldVnode, vnode) {
          var isCreate = oldVnode === emptyNode;
          var isDestroy = vnode === emptyNode;
          var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);
          var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);
  
          var dirsWithInsert = [];
          var dirsWithPostpatch = [];
  
          var key, oldDir, dir;
          for (key in newDirs) {
              oldDir = oldDirs[key];
              dir = newDirs[key];
              if (!oldDir) {
                  // new directive, bind
                  callHook$1(dir, 'bind', vnode, oldVnode);
                  if (dir.def && dir.def.inserted) {
                      dirsWithInsert.push(dir);
                  }
              } else {
                  // existing directive, update
                  dir.oldValue = oldDir.value;
                  callHook$1(dir, 'update', vnode, oldVnode);
                  if (dir.def && dir.def.componentUpdated) {
                      dirsWithPostpatch.push(dir);
                  }
              }
          }
  
          if (dirsWithInsert.length) {
              var callInsert = function () {
                  for (var i = 0; i < dirsWithInsert.length; i++) {
                      callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);
                  }
              };
              if (isCreate) {
                  mergeVNodeHook(vnode, 'insert', callInsert);
              } else {
                  callInsert();
              }
          }
  
          if (dirsWithPostpatch.length) {
              mergeVNodeHook(vnode, 'postpatch', function () {
                  for (var i = 0; i < dirsWithPostpatch.length; i++) {
                      callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);
                  }
              });
          }
  
          if (!isCreate) {
              for (key in oldDirs) {
                  if (!newDirs[key]) {
                      // no longer present, unbind
                      callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);
                  }
              }
          }
      }
  
      var emptyModifiers = Object.create(null);
  
      function normalizeDirectives$1(
          dirs,
          vm
      ) {
          var res = Object.create(null);
          if (!dirs) {
              // $flow-disable-line
              return res
          }
          var i, dir;
          for (i = 0; i < dirs.length; i++) {
              dir = dirs[i];
              if (!dir.modifiers) {
                  // $flow-disable-line
                  dir.modifiers = emptyModifiers;
              }
              res[getRawDirName(dir)] = dir;
              dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);
          }
          // $flow-disable-line
          return res
      }
  
      function getRawDirName(dir) {
          return dir.rawName || ((dir.name) + "." + (Object.keys(dir.modifiers || {}).join('.')))
      }
  
      function callHook$1(dir, hook, vnode, oldVnode, isDestroy) {
          var fn = dir.def && dir.def[hook];
          if (fn) {
              try {
                  fn(vnode.elm, dir, vnode, oldVnode, isDestroy);
              } catch (e) {
                  handleError(e, vnode.context, ("directive " + (dir.name) + " " + hook + " hook"));
              }
          }
      }
  
      var baseModules = [
          ref,
          directives
      ]
  
      /*  */
  
      function updateAttrs(oldVnode, vnode) {
          var opts = vnode.componentOptions;
          if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {
              return
          }
          if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {
              return
          }
          var key, cur, old;
          var elm = vnode.elm;
          var oldAttrs = oldVnode.data.attrs || {};
          var attrs = vnode.data.attrs || {};
          // clone observed objects, as the user probably wants to mutate it
          if (isDef(attrs.__ob__)) {
              attrs = vnode.data.attrs = extend({}, attrs);
          }
  
          for (key in attrs) {
              cur = attrs[key];
              old = oldAttrs[key];
              if (old !== cur) {
                  setAttr(elm, key, cur);
              }
          }
          // #4391: in IE9, setting type can reset value for input[type=radio]
          // #6666: IE/Edge forces progress value down to 1 before setting a max
          /* istanbul ignore if */
          if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {
              setAttr(elm, 'value', attrs.value);
          }
          for (key in oldAttrs) {
              if (isUndef(attrs[key])) {
                  if (isXlink(key)) {
                      elm.removeAttributeNS(xlinkNS, getXlinkProp(key));
                  } else if (!isEnumeratedAttr(key)) {
                      elm.removeAttribute(key);
                  }
              }
          }
      }
  
      function setAttr(el, key, value) {
          if (el.tagName.indexOf('-') > -1) {
              baseSetAttr(el, key, value);
          } else if (isBooleanAttr(key)) {
              // set attribute for blank value
              // e.g. <option disabled>Select one</option>
              if (isFalsyAttrValue(value)) {
                  el.removeAttribute(key);
              } else {
                  // technically allowfullscreen is a boolean attribute for <iframe>,
                  // but Flash expects a value of "true" when used on <embed> tag
                  value = key === 'allowfullscreen' && el.tagName === 'EMBED'
                      ? 'true'
                      : key;
                  el.setAttribute(key, value);
              }
          } else if (isEnumeratedAttr(key)) {
              el.setAttribute(key, isFalsyAttrValue(value) || value === 'false' ? 'false' : 'true');
          } else if (isXlink(key)) {
              if (isFalsyAttrValue(value)) {
                  el.removeAttributeNS(xlinkNS, getXlinkProp(key));
              } else {
                  el.setAttributeNS(xlinkNS, key, value);
              }
          } else {
              baseSetAttr(el, key, value);
          }
      }
  
      function baseSetAttr(el, key, value) {
          if (isFalsyAttrValue(value)) {
              el.removeAttribute(key);
          } else {
              // #7138: IE10 & 11 fires input event when setting placeholder on
              // <textarea>... block the first input event and remove the blocker
              // immediately.
              /* istanbul ignore if */
              if (
                  isIE && !isIE9 &&
                  el.tagName === 'TEXTAREA' &&
                  key === 'placeholder' && !el.__ieph
              ) {
                  var blocker = function (e) {
                      e.stopImmediatePropagation();
                      el.removeEventListener('input', blocker);
                  };
                  el.addEventListener('input', blocker);
                  // $flow-disable-line
                  el.__ieph = true; /* IE placeholder patched */
              }
              el.setAttribute(key, value);
          }
      }
  
      var attrs = {
          create: updateAttrs,
          update: updateAttrs
      }
  
      /*  */
  
      function updateClass(oldVnode, vnode) {
          var el = vnode.elm;
          var data = vnode.data;
          var oldData = oldVnode.data;
          if (
              isUndef(data.staticClass) &&
              isUndef(data.class) && (
                  isUndef(oldData) || (
                      isUndef(oldData.staticClass) &&
                      isUndef(oldData.class)
                  )
              )
          ) {
              return
          }
  
          var cls = genClassForVnode(vnode);
  
          // handle transition classes
          var transitionClass = el._transitionClasses;
          if (isDef(transitionClass)) {
              cls = concat(cls, stringifyClass(transitionClass));
          }
  
          // set the class
          if (cls !== el._prevClass) {
              el.setAttribute('class', cls);
              el._prevClass = cls;
          }
      }
  
      var klass = {
          create: updateClass,
          update: updateClass
      }
  
      /*  */
  
      /*  */
  
  
  
  
  
  
  
  
  
      // add a raw attr (use this in preTransforms)
  
  
  
  
  
  
  
  
      // note: this only removes the attr from the Array (attrsList) so that it
      // doesn't get processed by processAttrs.
      // By default it does NOT remove it from the map (attrsMap) because the map is
      // needed during codegen.
  
      /*  */
  
      /**
       * Cross-platform code generation for component v-model
       */
  
  
      /**
       * Cross-platform codegen helper for generating v-model value assignment code.
       */
  
      /*  */
  
      // in some cases, the event used has to be determined at runtime
      // so we used some reserved tokens during compile.
      var RANGE_TOKEN = '__r';
      var CHECKBOX_RADIO_TOKEN = '__c';
  
      /*  */
  
      // normalize v-model event tokens that can only be determined at runtime.
      // it's important to place the event as the first in the array because
      // the whole point is ensuring the v-model callback gets called before
      // user-attached handlers.
      function normalizeEvents(on) {
          /* istanbul ignore if */
          if (isDef(on[RANGE_TOKEN])) {
              // IE input[type=range] only supports `change` event
              var event = isIE ? 'change' : 'input';
              on[event] = [].concat(on[RANGE_TOKEN], on[event] || []);
              delete on[RANGE_TOKEN];
          }
          // This was originally intended to fix #4521 but no longer necessary
          // after 2.5. Keeping it for backwards compat with generated code from < 2.4
          /* istanbul ignore if */
          if (isDef(on[CHECKBOX_RADIO_TOKEN])) {
              on.change = [].concat(on[CHECKBOX_RADIO_TOKEN], on.change || []);
              delete on[CHECKBOX_RADIO_TOKEN];
          }
      }
  
      var target$1;
  
      function createOnceHandler(handler, event, capture) {
          var _target = target$1; // save current target element in closure
          return function onceHandler() {
              var res = handler.apply(null, arguments);
              if (res !== null) {
                  remove$2(event, onceHandler, capture, _target);
              }
          }
      }
  
      function add$1(
          event,
          handler,
          once$$1,
          capture,
          passive
      ) {
          handler = withMacroTask(handler);
          if (once$$1) { handler = createOnceHandler(handler, event, capture); }
          target$1.addEventListener(
              event,
              handler,
              supportsPassive
                  ? { capture: capture, passive: passive }
                  : capture
          );
      }
  
      function remove$2(
          event,
          handler,
          capture,
          _target
      ) {
          (_target || target$1).removeEventListener(
              event,
              handler._withTask || handler,
              capture
          );
      }
  
      function updateDOMListeners(oldVnode, vnode) {
          if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) {
              return
          }
          var on = vnode.data.on || {};
          var oldOn = oldVnode.data.on || {};
          target$1 = vnode.elm;
          normalizeEvents(on);
          updateListeners(on, oldOn, add$1, remove$2, vnode.context);
          target$1 = undefined;
      }
  
      var events = {
          create: updateDOMListeners,
          update: updateDOMListeners
      }
  
      /*  */
  
      function updateDOMProps(oldVnode, vnode) {
          if (isUndef(oldVnode.data.domProps) && isUndef(vnode.data.domProps)) {
              return
          }
          var key, cur;
          var elm = vnode.elm;
          var oldProps = oldVnode.data.domProps || {};
          var props = vnode.data.domProps || {};
          // clone observed objects, as the user probably wants to mutate it
          if (isDef(props.__ob__)) {
              props = vnode.data.domProps = extend({}, props);
          }
  
          for (key in oldProps) {
              if (isUndef(props[key])) {
                  elm[key] = '';
              }
          }
          for (key in props) {
              cur = props[key];
              // ignore children if the node has textContent or innerHTML,
              // as these will throw away existing DOM nodes and cause removal errors
              // on subsequent patches (#3360)
              if (key === 'textContent' || key === 'innerHTML') {
                  if (vnode.children) { vnode.children.length = 0; }
                  if (cur === oldProps[key]) { continue }
                  // #6601 work around Chrome version <= 55 bug where single textNode
                  // replaced by innerHTML/textContent retains its parentNode property
                  if (elm.childNodes.length === 1) {
                      elm.removeChild(elm.childNodes[0]);
                  }
              }
  
              if (key === 'value') {
                  // store value as _value as well since
                  // non-string values will be stringified
                  elm._value = cur;
                  // avoid resetting cursor position when value is the same
                  var strCur = isUndef(cur) ? '' : String(cur);
                  if (shouldUpdateValue(elm, strCur)) {
                      elm.value = strCur;
                  }
              } else {
                  elm[key] = cur;
              }
          }
      }
  
      // check platforms/web/util/attrs.js acceptValue
  
  
      function shouldUpdateValue(elm, checkVal) {
          return (!elm.composing && (
              elm.tagName === 'OPTION' ||
              isNotInFocusAndDirty(elm, checkVal) ||
              isDirtyWithModifiers(elm, checkVal)
          ))
      }
  
      function isNotInFocusAndDirty(elm, checkVal) {
          // return true when textbox (.number and .trim) loses focus and its value is
          // not equal to the updated value
          var notInFocus = true;
          // #6157
          // work around IE bug when accessing document.activeElement in an iframe
          try { notInFocus = document.activeElement !== elm; } catch (e) { }
          return notInFocus && elm.value !== checkVal
      }
  
      function isDirtyWithModifiers(elm, newVal) {
          var value = elm.value;
          var modifiers = elm._vModifiers; // injected by v-model runtime
          if (isDef(modifiers)) {
              if (modifiers.lazy) {
                  // inputs with lazy should only be updated when not in focus
                  return false
              }
              if (modifiers.number) {
                  return toNumber(value) !== toNumber(newVal)
              }
              if (modifiers.trim) {
                  return value.trim() !== newVal.trim()
              }
          }
          return value !== newVal
      }
  
      var domProps = {
          create: updateDOMProps,
          update: updateDOMProps
      }
  
      /*  */
  
      var parseStyleText = cached(function (cssText) {
          var res = {};
          var listDelimiter = /;(?![^(]*\))/g;
          var propertyDelimiter = /:(.+)/;
          cssText.split(listDelimiter).forEach(function (item) {
              if (item) {
                  var tmp = item.split(propertyDelimiter);
                  tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());
              }
          });
          return res
      });
  
      // merge static and dynamic style data on the same vnode
      function normalizeStyleData(data) {
          var style = normalizeStyleBinding(data.style);
          // static style is pre-processed into an object during compilation
          // and is always a fresh object, so it's safe to merge into it
          return data.staticStyle
              ? extend(data.staticStyle, style)
              : style
      }
  
      // normalize possible array / string values into Object
      function normalizeStyleBinding(bindingStyle) {
          if (Array.isArray(bindingStyle)) {
              return toObject(bindingStyle)
          }
          if (typeof bindingStyle === 'string') {
              return parseStyleText(bindingStyle)
          }
          return bindingStyle
      }
  
      /**
       * parent component style should be after child's
       * so that parent component's style could override it
       */
      function getStyle(vnode, checkChild) {
          var res = {};
          var styleData;
  
          if (checkChild) {
              var childNode = vnode;
              while (childNode.componentInstance) {
                  childNode = childNode.componentInstance._vnode;
                  if (
                      childNode && childNode.data &&
                      (styleData = normalizeStyleData(childNode.data))
                  ) {
                      extend(res, styleData);
                  }
              }
          }
  
          if ((styleData = normalizeStyleData(vnode.data))) {
              extend(res, styleData);
          }
  
          var parentNode = vnode;
          while ((parentNode = parentNode.parent)) {
              if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {
                  extend(res, styleData);
              }
          }
          return res
      }
  
      /*  */
  
      var cssVarRE = /^--/;
      var importantRE = /\s*!important$/;
      var setProp = function (el, name, val) {
          /* istanbul ignore if */
          if (cssVarRE.test(name)) {
              el.style.setProperty(name, val);
          } else if (importantRE.test(val)) {
              el.style.setProperty(name, val.replace(importantRE, ''), 'important');
          } else {
              var normalizedName = normalize(name);
              if (Array.isArray(val)) {
                  // Support values array created by autoprefixer, e.g.
                  // {display: ["-webkit-box", "-ms-flexbox", "flex"]}
                  // Set them one by one, and the browser will only set those it can recognize
                  for (var i = 0, len = val.length; i < len; i++) {
                      el.style[normalizedName] = val[i];
                  }
              } else {
                  el.style[normalizedName] = val;
              }
          }
      };
  
      var vendorNames = ['Webkit', 'Moz', 'ms'];
  
      var emptyStyle;
      var normalize = cached(function (prop) {
          emptyStyle = emptyStyle || document.createElement('div').style;
          prop = camelize(prop);
          if (prop !== 'filter' && (prop in emptyStyle)) {
              return prop
          }
          var capName = prop.charAt(0).toUpperCase() + prop.slice(1);
          for (var i = 0; i < vendorNames.length; i++) {
              var name = vendorNames[i] + capName;
              if (name in emptyStyle) {
                  return name
              }
          }
      });
  
      function updateStyle(oldVnode, vnode) {
          var data = vnode.data;
          var oldData = oldVnode.data;
  
          if (isUndef(data.staticStyle) && isUndef(data.style) &&
              isUndef(oldData.staticStyle) && isUndef(oldData.style)
          ) {
              return
          }
  
          var cur, name;
          var el = vnode.elm;
          var oldStaticStyle = oldData.staticStyle;
          var oldStyleBinding = oldData.normalizedStyle || oldData.style || {};
  
          // if static style exists, stylebinding already merged into it when doing normalizeStyleData
          var oldStyle = oldStaticStyle || oldStyleBinding;
  
          var style = normalizeStyleBinding(vnode.data.style) || {};
  
          // store normalized style under a different key for next diff
          // make sure to clone it if it's reactive, since the user likely wants
          // to mutate it.
          vnode.data.normalizedStyle = isDef(style.__ob__)
              ? extend({}, style)
              : style;
  
          var newStyle = getStyle(vnode, true);
  
          for (name in oldStyle) {
              if (isUndef(newStyle[name])) {
                  setProp(el, name, '');
              }
          }
          for (name in newStyle) {
              cur = newStyle[name];
              if (cur !== oldStyle[name]) {
                  // ie9 setting to null has no effect, must use empty string
                  setProp(el, name, cur == null ? '' : cur);
              }
          }
      }
  
      var style = {
          create: updateStyle,
          update: updateStyle
      }
  
      /*  */
  
      /**
       * Add class with compatibility for SVG since classList is not supported on
       * SVG elements in IE
       */
      function addClass(el, cls) {
          /* istanbul ignore if */
          if (!cls || !(cls = cls.trim())) {
              return
          }
  
          /* istanbul ignore else */
          if (el.classList) {
              if (cls.indexOf(' ') > -1) {
                  cls.split(/\s+/).forEach(function (c) { return el.classList.add(c); });
              } else {
                  el.classList.add(cls);
              }
          } else {
              var cur = " " + (el.getAttribute('class') || '') + " ";
              if (cur.indexOf(' ' + cls + ' ') < 0) {
                  el.setAttribute('class', (cur + cls).trim());
              }
          }
      }
  
      /**
       * Remove class with compatibility for SVG since classList is not supported on
       * SVG elements in IE
       */
      function removeClass(el, cls) {
          /* istanbul ignore if */
          if (!cls || !(cls = cls.trim())) {
              return
          }
  
          /* istanbul ignore else */
          if (el.classList) {
              if (cls.indexOf(' ') > -1) {
                  cls.split(/\s+/).forEach(function (c) { return el.classList.remove(c); });
              } else {
                  el.classList.remove(cls);
              }
              if (!el.classList.length) {
                  el.removeAttribute('class');
              }
          } else {
              var cur = " " + (el.getAttribute('class') || '') + " ";
              var tar = ' ' + cls + ' ';
              while (cur.indexOf(tar) >= 0) {
                  cur = cur.replace(tar, ' ');
              }
              cur = cur.trim();
              if (cur) {
                  el.setAttribute('class', cur);
              } else {
                  el.removeAttribute('class');
              }
          }
      }
  
      /*  */
  
      function resolveTransition(def) {
          if (!def) {
              return
          }
          /* istanbul ignore else */
          if (typeof def === 'object') {
              var res = {};
              if (def.css !== false) {
                  extend(res, autoCssTransition(def.name || 'v'));
              }
              extend(res, def);
              return res
          } else if (typeof def === 'string') {
              return autoCssTransition(def)
          }
      }
  
      var autoCssTransition = cached(function (name) {
          return {
              enterClass: (name + "-enter"),
              enterToClass: (name + "-enter-to"),
              enterActiveClass: (name + "-enter-active"),
              leaveClass: (name + "-leave"),
              leaveToClass: (name + "-leave-to"),
              leaveActiveClass: (name + "-leave-active")
          }
      });
  
      var hasTransition = inBrowser && !isIE9;
      var TRANSITION = 'transition';
      var ANIMATION = 'animation';
  
      // Transition property/event sniffing
      var transitionProp = 'transition';
      var transitionEndEvent = 'transitionend';
      var animationProp = 'animation';
      var animationEndEvent = 'animationend';
      if (hasTransition) {
          /* istanbul ignore if */
          if (window.ontransitionend === undefined &&
              window.onwebkittransitionend !== undefined
          ) {
              transitionProp = 'WebkitTransition';
              transitionEndEvent = 'webkitTransitionEnd';
          }
          if (window.onanimationend === undefined &&
              window.onwebkitanimationend !== undefined
          ) {
              animationProp = 'WebkitAnimation';
              animationEndEvent = 'webkitAnimationEnd';
          }
      }
  
      // binding to window is necessary to make hot reload work in IE in strict mode
      var raf = inBrowser
          ? window.requestAnimationFrame
              ? window.requestAnimationFrame.bind(window)
              : setTimeout
          : /* istanbul ignore next */ function (fn) { return fn(); };
  
      function nextFrame(fn) {
          raf(function () {
              raf(fn);
          });
      }
  
      function addTransitionClass(el, cls) {
          var transitionClasses = el._transitionClasses || (el._transitionClasses = []);
          if (transitionClasses.indexOf(cls) < 0) {
              transitionClasses.push(cls);
              addClass(el, cls);
          }
      }
  
      function removeTransitionClass(el, cls) {
          if (el._transitionClasses) {
              remove(el._transitionClasses, cls);
          }
          removeClass(el, cls);
      }
  
      function whenTransitionEnds(
          el,
          expectedType,
          cb
      ) {
          var ref = getTransitionInfo(el, expectedType);
          var type = ref.type;
          var timeout = ref.timeout;
          var propCount = ref.propCount;
          if (!type) { return cb() }
          var event = type === TRANSITION ? transitionEndEvent : animationEndEvent;
          var ended = 0;
          var end = function () {
              el.removeEventListener(event, onEnd);
              cb();
          };
          var onEnd = function (e) {
              if (e.target === el) {
                  if (++ended >= propCount) {
                      end();
                  }
              }
          };
          setTimeout(function () {
              if (ended < propCount) {
                  end();
              }
          }, timeout + 1);
          el.addEventListener(event, onEnd);
      }
  
      var transformRE = /\b(transform|all)(,|$)/;
  
      function getTransitionInfo(el, expectedType) {
          var styles = window.getComputedStyle(el);
          var transitionDelays = styles[transitionProp + 'Delay'].split(', ');
          var transitionDurations = styles[transitionProp + 'Duration'].split(', ');
          var transitionTimeout = getTimeout(transitionDelays, transitionDurations);
          var animationDelays = styles[animationProp + 'Delay'].split(', ');
          var animationDurations = styles[animationProp + 'Duration'].split(', ');
          var animationTimeout = getTimeout(animationDelays, animationDurations);
  
          var type;
          var timeout = 0;
          var propCount = 0;
          /* istanbul ignore if */
          if (expectedType === TRANSITION) {
              if (transitionTimeout > 0) {
                  type = TRANSITION;
                  timeout = transitionTimeout;
                  propCount = transitionDurations.length;
              }
          } else if (expectedType === ANIMATION) {
              if (animationTimeout > 0) {
                  type = ANIMATION;
                  timeout = animationTimeout;
                  propCount = animationDurations.length;
              }
          } else {
              timeout = Math.max(transitionTimeout, animationTimeout);
              type = timeout > 0
                  ? transitionTimeout > animationTimeout
                      ? TRANSITION
                      : ANIMATION
                  : null;
              propCount = type
                  ? type === TRANSITION
                      ? transitionDurations.length
                      : animationDurations.length
                  : 0;
          }
          var hasTransform =
              type === TRANSITION &&
              transformRE.test(styles[transitionProp + 'Property']);
          return {
              type: type,
              timeout: timeout,
              propCount: propCount,
              hasTransform: hasTransform
          }
      }
  
      function getTimeout(delays, durations) {
          /* istanbul ignore next */
          while (delays.length < durations.length) {
              delays = delays.concat(delays);
          }
  
          return Math.max.apply(null, durations.map(function (d, i) {
              return toMs(d) + toMs(delays[i])
          }))
      }
  
      function toMs(s) {
          return Number(s.slice(0, -1)) * 1000
      }
  
      /*  */
  
      function enter(vnode, toggleDisplay) {
          var el = vnode.elm;
  
          // call leave callback now
          if (isDef(el._leaveCb)) {
              el._leaveCb.cancelled = true;
              el._leaveCb();
          }
  
          var data = resolveTransition(vnode.data.transition);
          if (isUndef(data)) {
              return
          }
  
          /* istanbul ignore if */
          if (isDef(el._enterCb) || el.nodeType !== 1) {
              return
          }
  
          var css = data.css;
          var type = data.type;
          var enterClass = data.enterClass;
          var enterToClass = data.enterToClass;
          var enterActiveClass = data.enterActiveClass;
          var appearClass = data.appearClass;
          var appearToClass = data.appearToClass;
          var appearActiveClass = data.appearActiveClass;
          var beforeEnter = data.beforeEnter;
          var enter = data.enter;
          var afterEnter = data.afterEnter;
          var enterCancelled = data.enterCancelled;
          var beforeAppear = data.beforeAppear;
          var appear = data.appear;
          var afterAppear = data.afterAppear;
          var appearCancelled = data.appearCancelled;
          var duration = data.duration;
  
          // activeInstance will always be the <transition> component managing this
          // transition. One edge case to check is when the <transition> is placed
          // as the root node of a child component. In that case we need to check
          // <transition>'s parent for appear check.
          var context = activeInstance;
          var transitionNode = activeInstance.$vnode;
          while (transitionNode && transitionNode.parent) {
              transitionNode = transitionNode.parent;
              context = transitionNode.context;
          }
  
          var isAppear = !context._isMounted || !vnode.isRootInsert;
  
          if (isAppear && !appear && appear !== '') {
              return
          }
  
          var startClass = isAppear && appearClass
              ? appearClass
              : enterClass;
          var activeClass = isAppear && appearActiveClass
              ? appearActiveClass
              : enterActiveClass;
          var toClass = isAppear && appearToClass
              ? appearToClass
              : enterToClass;
  
          var beforeEnterHook = isAppear
              ? (beforeAppear || beforeEnter)
              : beforeEnter;
          var enterHook = isAppear
              ? (typeof appear === 'function' ? appear : enter)
              : enter;
          var afterEnterHook = isAppear
              ? (afterAppear || afterEnter)
              : afterEnter;
          var enterCancelledHook = isAppear
              ? (appearCancelled || enterCancelled)
              : enterCancelled;
  
          var explicitEnterDuration = toNumber(
              isObject(duration)
                  ? duration.enter
                  : duration
          );
  
          if ("development" !== 'production' && explicitEnterDuration != null) {
              checkDuration(explicitEnterDuration, 'enter', vnode);
          }
  
          var expectsCSS = css !== false && !isIE9;
          var userWantsControl = getHookArgumentsLength(enterHook);
  
          var cb = el._enterCb = once(function () {
              if (expectsCSS) {
                  removeTransitionClass(el, toClass);
                  removeTransitionClass(el, activeClass);
              }
              if (cb.cancelled) {
                  if (expectsCSS) {
                      removeTransitionClass(el, startClass);
                  }
                  enterCancelledHook && enterCancelledHook(el);
              } else {
                  afterEnterHook && afterEnterHook(el);
              }
              el._enterCb = null;
          });
  
          if (!vnode.data.show) {
              // remove pending leave element on enter by injecting an insert hook
              mergeVNodeHook(vnode, 'insert', function () {
                  var parent = el.parentNode;
                  var pendingNode = parent && parent._pending && parent._pending[vnode.key];
                  if (pendingNode &&
                      pendingNode.tag === vnode.tag &&
                      pendingNode.elm._leaveCb
                  ) {
                      pendingNode.elm._leaveCb();
                  }
                  enterHook && enterHook(el, cb);
              });
          }
  
          // start enter transition
          beforeEnterHook && beforeEnterHook(el);
          if (expectsCSS) {
              addTransitionClass(el, startClass);
              addTransitionClass(el, activeClass);
              nextFrame(function () {
                  removeTransitionClass(el, startClass);
                  if (!cb.cancelled) {
                      addTransitionClass(el, toClass);
                      if (!userWantsControl) {
                          if (isValidDuration(explicitEnterDuration)) {
                              setTimeout(cb, explicitEnterDuration);
                          } else {
                              whenTransitionEnds(el, type, cb);
                          }
                      }
                  }
              });
          }
  
          if (vnode.data.show) {
              toggleDisplay && toggleDisplay();
              enterHook && enterHook(el, cb);
          }
  
          if (!expectsCSS && !userWantsControl) {
              cb();
          }
      }
  
      function leave(vnode, rm) {
          var el = vnode.elm;
  
          // call enter callback now
          if (isDef(el._enterCb)) {
              el._enterCb.cancelled = true;
              el._enterCb();
          }
  
          var data = resolveTransition(vnode.data.transition);
          if (isUndef(data) || el.nodeType !== 1) {
              return rm()
          }
  
          /* istanbul ignore if */
          if (isDef(el._leaveCb)) {
              return
          }
  
          var css = data.css;
          var type = data.type;
          var leaveClass = data.leaveClass;
          var leaveToClass = data.leaveToClass;
          var leaveActiveClass = data.leaveActiveClass;
          var beforeLeave = data.beforeLeave;
          var leave = data.leave;
          var afterLeave = data.afterLeave;
          var leaveCancelled = data.leaveCancelled;
          var delayLeave = data.delayLeave;
          var duration = data.duration;
  
          var expectsCSS = css !== false && !isIE9;
          var userWantsControl = getHookArgumentsLength(leave);
  
          var explicitLeaveDuration = toNumber(
              isObject(duration)
                  ? duration.leave
                  : duration
          );
  
          if ("development" !== 'production' && isDef(explicitLeaveDuration)) {
              checkDuration(explicitLeaveDuration, 'leave', vnode);
          }
  
          var cb = el._leaveCb = once(function () {
              if (el.parentNode && el.parentNode._pending) {
                  el.parentNode._pending[vnode.key] = null;
              }
              if (expectsCSS) {
                  removeTransitionClass(el, leaveToClass);
                  removeTransitionClass(el, leaveActiveClass);
              }
              if (cb.cancelled) {
                  if (expectsCSS) {
                      removeTransitionClass(el, leaveClass);
                  }
                  leaveCancelled && leaveCancelled(el);
              } else {
                  rm();
                  afterLeave && afterLeave(el);
              }
              el._leaveCb = null;
          });
  
          if (delayLeave) {
              delayLeave(performLeave);
          } else {
              performLeave();
          }
  
          function performLeave() {
              // the delayed leave may have already been cancelled
              if (cb.cancelled) {
                  return
              }
              // record leaving element
              if (!vnode.data.show) {
                  (el.parentNode._pending || (el.parentNode._pending = {}))[(vnode.key)] = vnode;
              }
              beforeLeave && beforeLeave(el);
              if (expectsCSS) {
                  addTransitionClass(el, leaveClass);
                  addTransitionClass(el, leaveActiveClass);
                  nextFrame(function () {
                      removeTransitionClass(el, leaveClass);
                      if (!cb.cancelled) {
                          addTransitionClass(el, leaveToClass);
                          if (!userWantsControl) {
                              if (isValidDuration(explicitLeaveDuration)) {
                                  setTimeout(cb, explicitLeaveDuration);
                              } else {
                                  whenTransitionEnds(el, type, cb);
                              }
                          }
                      }
                  });
              }
              leave && leave(el, cb);
              if (!expectsCSS && !userWantsControl) {
                  cb();
              }
          }
      }
  
      // only used in dev mode
      function checkDuration(val, name, vnode) {
          if (typeof val !== 'number') {
              warn(
                  "<transition> explicit " + name + " duration is not a valid number - " +
                  "got " + (JSON.stringify(val)) + ".",
                  vnode.context
              );
          } else if (isNaN(val)) {
              warn(
                  "<transition> explicit " + name + " duration is NaN - " +
                  'the duration expression might be incorrect.',
                  vnode.context
              );
          }
      }
  
      function isValidDuration(val) {
          return typeof val === 'number' && !isNaN(val)
      }
  
      /**
       * Normalize a transition hook's argument length. The hook may be:
       * - a merged hook (invoker) with the original in .fns
       * - a wrapped component method (check ._length)
       * - a plain function (.length)
       */
      function getHookArgumentsLength(fn) {
          if (isUndef(fn)) {
              return false
          }
          var invokerFns = fn.fns;
          if (isDef(invokerFns)) {
              // invoker
              return getHookArgumentsLength(
                  Array.isArray(invokerFns)
                      ? invokerFns[0]
                      : invokerFns
              )
          } else {
              return (fn._length || fn.length) > 1
          }
      }
  
      function _enter(_, vnode) {
          if (vnode.data.show !== true) {
              enter(vnode);
          }
      }
  
      var transition = inBrowser ? {
          create: _enter,
          activate: _enter,
          remove: function remove$$1(vnode, rm) {
              /* istanbul ignore else */
              if (vnode.data.show !== true) {
                  leave(vnode, rm);
              } else {
                  rm();
              }
          }
      } : {}
  
      var platformModules = [
          attrs,
          klass,
          events,
          domProps,
          style,
          transition
      ]
  
      /*  */
  
      // the directive module should be applied last, after all
      // built-in modules have been applied.
      var modules = platformModules.concat(baseModules);
  
      var patch = createPatchFunction({ nodeOps: nodeOps, modules: modules });
  
      /**
       * Not type checking this file because flow doesn't like attaching
       * properties to Elements.
       */
  
      /* istanbul ignore if */
      if (isIE9) {
          // http://www.matts411.com/post/internet-explorer-9-oninput/
          document.addEventListener('selectionchange', function () {
              var el = document.activeElement;
              if (el && el.vmodel) {
                  trigger(el, 'input');
              }
          });
      }
  
      var directive = {
          inserted: function inserted(el, binding, vnode, oldVnode) {
              if (vnode.tag === 'select') {
                  // #6903
                  if (oldVnode.elm && !oldVnode.elm._vOptions) {
                      mergeVNodeHook(vnode, 'postpatch', function () {
                          directive.componentUpdated(el, binding, vnode);
                      });
                  } else {
                      setSelected(el, binding, vnode.context);
                  }
                  el._vOptions = [].map.call(el.options, getValue);
              } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {
                  el._vModifiers = binding.modifiers;
                  if (!binding.modifiers.lazy) {
                      el.addEventListener('compositionstart', onCompositionStart);
                      el.addEventListener('compositionend', onCompositionEnd);
                      // Safari < 10.2 & UIWebView doesn't fire compositionend when
                      // switching focus before confirming composition choice
                      // this also fixes the issue where some browsers e.g. iOS Chrome
                      // fires "change" instead of "input" on autocomplete.
                      el.addEventListener('change', onCompositionEnd);
                      /* istanbul ignore if */
                      if (isIE9) {
                          el.vmodel = true;
                      }
                  }
              }
          },
  
          componentUpdated: function componentUpdated(el, binding, vnode) {
              if (vnode.tag === 'select') {
                  setSelected(el, binding, vnode.context);
                  // in case the options rendered by v-for have changed,
                  // it's possible that the value is out-of-sync with the rendered options.
                  // detect such cases and filter out values that no longer has a matching
                  // option in the DOM.
                  var prevOptions = el._vOptions;
                  var curOptions = el._vOptions = [].map.call(el.options, getValue);
                  if (curOptions.some(function (o, i) { return !looseEqual(o, prevOptions[i]); })) {
                      // trigger change event if
                      // no matching option found for at least one value
                      var needReset = el.multiple
                          ? binding.value.some(function (v) { return hasNoMatchingOption(v, curOptions); })
                          : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions);
                      if (needReset) {
                          trigger(el, 'change');
                      }
                  }
              }
          }
      };
  
      function setSelected(el, binding, vm) {
          actuallySetSelected(el, binding, vm);
          /* istanbul ignore if */
          if (isIE || isEdge) {
              setTimeout(function () {
                  actuallySetSelected(el, binding, vm);
              }, 0);
          }
      }
  
      function actuallySetSelected(el, binding, vm) {
          var value = binding.value;
          var isMultiple = el.multiple;
          if (isMultiple && !Array.isArray(value)) {
              "development" !== 'production' && warn(
                  "<select multiple v-model=\"" + (binding.expression) + "\"> " +
                  "expects an Array value for its binding, but got " + (Object.prototype.toString.call(value).slice(8, -1)),
                  vm
              );
              return
          }
          var selected, option;
          for (var i = 0, l = el.options.length; i < l; i++) {
              option = el.options[i];
              if (isMultiple) {
                  selected = looseIndexOf(value, getValue(option)) > -1;
                  if (option.selected !== selected) {
                      option.selected = selected;
                  }
              } else {
                  if (looseEqual(getValue(option), value)) {
                      if (el.selectedIndex !== i) {
                          el.selectedIndex = i;
                      }
                      return
                  }
              }
          }
          if (!isMultiple) {
              el.selectedIndex = -1;
          }
      }
  
      function hasNoMatchingOption(value, options) {
          return options.every(function (o) { return !looseEqual(o, value); })
      }
  
      function getValue(option) {
          return '_value' in option
              ? option._value
              : option.value
      }
  
      function onCompositionStart(e) {
          e.target.composing = true;
      }
  
      function onCompositionEnd(e) {
          // prevent triggering an input event for no reason
          if (!e.target.composing) { return }
          e.target.composing = false;
          trigger(e.target, 'input');
      }
  
      function trigger(el, type) {
          var e = document.createEvent('HTMLEvents');
          e.initEvent(type, true, true);
          el.dispatchEvent(e);
      }
  
      /*  */
  
      // recursively search for possible transition defined inside the component root
      function locateNode(vnode) {
          return vnode.componentInstance && (!vnode.data || !vnode.data.transition)
              ? locateNode(vnode.componentInstance._vnode)
              : vnode
      }
  
      var show = {
          bind: function bind(el, ref, vnode) {
              var value = ref.value;
  
              vnode = locateNode(vnode);
              var transition$$1 = vnode.data && vnode.data.transition;
              var originalDisplay = el.__vOriginalDisplay =
                  el.style.display === 'none' ? '' : el.style.display;
              if (value && transition$$1) {
                  vnode.data.show = true;
                  enter(vnode, function () {
                      el.style.display = originalDisplay;
                  });
              } else {
                  el.style.display = value ? originalDisplay : 'none';
              }
          },
  
          update: function update(el, ref, vnode) {
              var value = ref.value;
              var oldValue = ref.oldValue;
  
              /* istanbul ignore if */
              if (!value === !oldValue) { return }
              vnode = locateNode(vnode);
              var transition$$1 = vnode.data && vnode.data.transition;
              if (transition$$1) {
                  vnode.data.show = true;
                  if (value) {
                      enter(vnode, function () {
                          el.style.display = el.__vOriginalDisplay;
                      });
                  } else {
                      leave(vnode, function () {
                          el.style.display = 'none';
                      });
                  }
              } else {
                  el.style.display = value ? el.__vOriginalDisplay : 'none';
              }
          },
  
          unbind: function unbind(
              el,
              binding,
              vnode,
              oldVnode,
              isDestroy
          ) {
              if (!isDestroy) {
                  el.style.display = el.__vOriginalDisplay;
              }
          }
      }
  
      var platformDirectives = {
          model: directive,
          show: show
      }
  
      /*  */
  
      // Provides transition support for a single element/component.
      // supports transition mode (out-in / in-out)
  
      var transitionProps = {
          name: String,
          appear: Boolean,
          css: Boolean,
          mode: String,
          type: String,
          enterClass: String,
          leaveClass: String,
          enterToClass: String,
          leaveToClass: String,
          enterActiveClass: String,
          leaveActiveClass: String,
          appearClass: String,
          appearActiveClass: String,
          appearToClass: String,
          duration: [Number, String, Object]
      };
  
      // in case the child is also an abstract component, e.g. <keep-alive>
      // we want to recursively retrieve the real component to be rendered
      function getRealChild(vnode) {
          var compOptions = vnode && vnode.componentOptions;
          if (compOptions && compOptions.Ctor.options.abstract) {
              return getRealChild(getFirstComponentChild(compOptions.children))
          } else {
              return vnode
          }
      }
  
      function extractTransitionData(comp) {
          var data = {};
          var options = comp.$options;
          // props
          for (var key in options.propsData) {
              data[key] = comp[key];
          }
          // events.
          // extract listeners and pass them directly to the transition methods
          var listeners = options._parentListeners;
          for (var key$1 in listeners) {
              data[camelize(key$1)] = listeners[key$1];
          }
          return data
      }
  
      function placeholder(h, rawChild) {
          if (/\d-keep-alive$/.test(rawChild.tag)) {
              return h('keep-alive', {
                  props: rawChild.componentOptions.propsData
              })
          }
      }
  
      function hasParentTransition(vnode) {
          while ((vnode = vnode.parent)) {
              if (vnode.data.transition) {
                  return true
              }
          }
      }
  
      function isSameChild(child, oldChild) {
          return oldChild.key === child.key && oldChild.tag === child.tag
      }
  
      var Transition = {
          name: 'transition',
          props: transitionProps,
          abstract: true,
  
          render: function render(h) {
              var this$1 = this;
  
              var children = this.$slots.default;
              if (!children) {
                  return
              }
  
              // filter out text nodes (possible whitespaces)
              children = children.filter(function (c) { return c.tag || isAsyncPlaceholder(c); });
              /* istanbul ignore if */
              if (!children.length) {
                  return
              }
  
              // warn multiple elements
              if ("development" !== 'production' && children.length > 1) {
                  warn(
                      '<transition> can only be used on a single element. Use ' +
                      '<transition-group> for lists.',
                      this.$parent
                  );
              }
  
              var mode = this.mode;
  
              // warn invalid mode
              if ("development" !== 'production' &&
                  mode && mode !== 'in-out' && mode !== 'out-in'
              ) {
                  warn(
                      'invalid <transition> mode: ' + mode,
                      this.$parent
                  );
              }
  
              var rawChild = children[0];
  
              // if this is a component root node and the component's
              // parent container node also has transition, skip.
              if (hasParentTransition(this.$vnode)) {
                  return rawChild
              }
  
              // apply transition data to child
              // use getRealChild() to ignore abstract components e.g. keep-alive
              var child = getRealChild(rawChild);
              /* istanbul ignore if */
              if (!child) {
                  return rawChild
              }
  
              if (this._leaving) {
                  return placeholder(h, rawChild)
              }
  
              // ensure a key that is unique to the vnode type and to this transition
              // component instance. This key will be used to remove pending leaving nodes
              // during entering.
              var id = "__transition-" + (this._uid) + "-";
              child.key = child.key == null
                  ? child.isComment
                      ? id + 'comment'
                      : id + child.tag
                  : isPrimitive(child.key)
                      ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)
                      : child.key;
  
              var data = (child.data || (child.data = {})).transition = extractTransitionData(this);
              var oldRawChild = this._vnode;
              var oldChild = getRealChild(oldRawChild);
  
              // mark v-show
              // so that the transition module can hand over the control to the directive
              if (child.data.directives && child.data.directives.some(function (d) { return d.name === 'show'; })) {
                  child.data.show = true;
              }
  
              if (
                  oldChild &&
                  oldChild.data &&
                  !isSameChild(child, oldChild) &&
                  !isAsyncPlaceholder(oldChild) &&
                  // #6687 component root is a comment node
                  !(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)
              ) {
                  // replace old child transition data with fresh one
                  // important for dynamic transitions!
                  var oldData = oldChild.data.transition = extend({}, data);
                  // handle transition mode
                  if (mode === 'out-in') {
                      // return placeholder node and queue update when leave finishes
                      this._leaving = true;
                      mergeVNodeHook(oldData, 'afterLeave', function () {
                          this$1._leaving = false;
                          this$1.$forceUpdate();
                      });
                      return placeholder(h, rawChild)
                  } else if (mode === 'in-out') {
                      if (isAsyncPlaceholder(child)) {
                          return oldRawChild
                      }
                      var delayedLeave;
                      var performLeave = function () { delayedLeave(); };
                      mergeVNodeHook(data, 'afterEnter', performLeave);
                      mergeVNodeHook(data, 'enterCancelled', performLeave);
                      mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });
                  }
              }
  
              return rawChild
          }
      }
  
      /*  */
  
      // Provides transition support for list items.
      // supports move transitions using the FLIP technique.
  
      // Because the vdom's children update algorithm is "unstable" - i.e.
      // it doesn't guarantee the relative positioning of removed elements,
      // we force transition-group to update its children into two passes:
      // in the first pass, we remove all nodes that need to be removed,
      // triggering their leaving transition; in the second pass, we insert/move
      // into the final desired state. This way in the second pass removed
      // nodes will remain where they should be.
  
      var props = extend({
          tag: String,
          moveClass: String
      }, transitionProps);
  
      delete props.mode;
  
      var TransitionGroup = {
          props: props,
  
          render: function render(h) {
              var tag = this.tag || this.$vnode.data.tag || 'span';
              var map = Object.create(null);
              var prevChildren = this.prevChildren = this.children;
              var rawChildren = this.$slots.default || [];
              var children = this.children = [];
              var transitionData = extractTransitionData(this);
  
              for (var i = 0; i < rawChildren.length; i++) {
                  var c = rawChildren[i];
                  if (c.tag) {
                      if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {
                          children.push(c);
                          map[c.key] = c
                              ; (c.data || (c.data = {})).transition = transitionData;
                      } else {
                          var opts = c.componentOptions;
                          var name = opts ? (opts.Ctor.options.name || opts.tag || '') : c.tag;
                          warn(("<transition-group> children must be keyed: <" + name + ">"));
                      }
                  }
              }
  
              if (prevChildren) {
                  var kept = [];
                  var removed = [];
                  for (var i$1 = 0; i$1 < prevChildren.length; i$1++) {
                      var c$1 = prevChildren[i$1];
                      c$1.data.transition = transitionData;
                      c$1.data.pos = c$1.elm.getBoundingClientRect();
                      if (map[c$1.key]) {
                          kept.push(c$1);
                      } else {
                          removed.push(c$1);
                      }
                  }
                  this.kept = h(tag, null, kept);
                  this.removed = removed;
              }
  
              return h(tag, null, children)
          },
  
          beforeUpdate: function beforeUpdate() {
              // force removing pass
              this.__patch__(
                  this._vnode,
                  this.kept,
                  false, // hydrating
                  true // removeOnly (!important, avoids unnecessary moves)
              );
              this._vnode = this.kept;
          },
  
          updated: function updated() {
              var children = this.prevChildren;
              var moveClass = this.moveClass || ((this.name || 'v') + '-move');
              if (!children.length || !this.hasMove(children[0].elm, moveClass)) {
                  return
              }
  
              // we divide the work into three loops to avoid mixing DOM reads and writes
              // in each iteration - which helps prevent layout thrashing.
              children.forEach(callPendingCbs);
              children.forEach(recordPosition);
              children.forEach(applyTranslation);
  
              // force reflow to put everything in position
              // assign to this to avoid being removed in tree-shaking
              // $flow-disable-line
              this._reflow = document.body.offsetHeight;
  
              children.forEach(function (c) {
                  if (c.data.moved) {
                      var el = c.elm;
                      var s = el.style;
                      addTransitionClass(el, moveClass);
                      s.transform = s.WebkitTransform = s.transitionDuration = '';
                      el.addEventListener(transitionEndEvent, el._moveCb = function cb(e) {
                          if (!e || /transform$/.test(e.propertyName)) {
                              el.removeEventListener(transitionEndEvent, cb);
                              el._moveCb = null;
                              removeTransitionClass(el, moveClass);
                          }
                      });
                  }
              });
          },
  
          methods: {
              hasMove: function hasMove(el, moveClass) {
                  /* istanbul ignore if */
                  if (!hasTransition) {
                      return false
                  }
                  /* istanbul ignore if */
                  if (this._hasMove) {
                      return this._hasMove
                  }
                  // Detect whether an element with the move class applied has
                  // CSS transitions. Since the element may be inside an entering
                  // transition at this very moment, we make a clone of it and remove
                  // all other transition classes applied to ensure only the move class
                  // is applied.
                  var clone = el.cloneNode();
                  if (el._transitionClasses) {
                      el._transitionClasses.forEach(function (cls) { removeClass(clone, cls); });
                  }
                  addClass(clone, moveClass);
                  clone.style.display = 'none';
                  this.$el.appendChild(clone);
                  var info = getTransitionInfo(clone);
                  this.$el.removeChild(clone);
                  return (this._hasMove = info.hasTransform)
              }
          }
      }
  
      function callPendingCbs(c) {
          /* istanbul ignore if */
          if (c.elm._moveCb) {
              c.elm._moveCb();
          }
          /* istanbul ignore if */
          if (c.elm._enterCb) {
              c.elm._enterCb();
          }
      }
  
      function recordPosition(c) {
          c.data.newPos = c.elm.getBoundingClientRect();
      }
  
      function applyTranslation(c) {
          var oldPos = c.data.pos;
          var newPos = c.data.newPos;
          var dx = oldPos.left - newPos.left;
          var dy = oldPos.top - newPos.top;
          if (dx || dy) {
              c.data.moved = true;
              var s = c.elm.style;
              s.transform = s.WebkitTransform = "translate(" + dx + "px," + dy + "px)";
              s.transitionDuration = '0s';
          }
      }
  
      var platformComponents = {
          Transition: Transition,
          TransitionGroup: TransitionGroup
      }
  
      /*  */
  
      // install platform specific utils
      Vue.config.mustUseProp = mustUseProp;
      Vue.config.isReservedTag = isReservedTag;
      Vue.config.isReservedAttr = isReservedAttr;
      Vue.config.getTagNamespace = getTagNamespace;
      Vue.config.isUnknownElement = isUnknownElement;
  
      // install platform runtime directives & components
      extend(Vue.options.directives, platformDirectives);
      extend(Vue.options.components, platformComponents);
  
      // install platform patch function
      Vue.prototype.__patch__ = inBrowser ? patch : noop;
  
      // public mount method
      Vue.prototype.$mount = function (
          el,
          hydrating
      ) {
          el = el && inBrowser ? query(el) : undefined;
          return mountComponent(this, el, hydrating)
      };
  
      // devtools global hook
      /* istanbul ignore next */
      if (inBrowser) {
          setTimeout(function () {
              if (config.devtools) {
                  if (devtools) {
                      devtools.emit('init', Vue);
                  } else if (
                      "development" !== 'production' &&
                      "development" !== 'test' &&
                      isChrome
                  ) {
                      console[console.info ? 'info' : 'log'](
                          'Download the Vue Devtools extension for a better development experience:\n' +
                          'https://github.com/vuejs/vue-devtools'
                      );
                  }
              }
              if ("development" !== 'production' &&
                  "development" !== 'test' &&
                  config.productionTip !== false &&
                  typeof console !== 'undefined'
              ) {
                  console[console.info ? 'info' : 'log'](
                      "You are running Vue in development mode.\n" +
                      "Make sure to turn on production mode when deploying for production.\n" +
                      "See more tips at https://vuejs.org/guide/deployment.html"
                  );
              }
          }, 0);
      }
  
      /*  */
  
      return Vue;
  
  })));
  