| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164 | /*!  * vue-router v3.6.5  * (c) 2022 Evan You  * @license MIT  */(function (global, factory) {  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :  typeof define === 'function' && define.amd ? define(factory) :  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.VueRouter = factory());})(this, (function () { 'use strict';  /*  */  function assert (condition, message) {    if (!condition) {      throw new Error(("[vue-router] " + message))    }  }  function warn (condition, message) {    if (!condition) {      typeof console !== 'undefined' && console.warn(("[vue-router] " + message));    }  }  function extend (a, b) {    for (var key in b) {      a[key] = b[key];    }    return a  }  /*  */  var encodeReserveRE = /[!'()*]/g;  var encodeReserveReplacer = function (c) { return '%' + c.charCodeAt(0).toString(16); };  var commaRE = /%2C/g;  // fixed encodeURIComponent which is more conformant to RFC3986:  // - escapes [!'()*]  // - preserve commas  var encode = function (str) { return encodeURIComponent(str)      .replace(encodeReserveRE, encodeReserveReplacer)      .replace(commaRE, ','); };  function decode (str) {    try {      return decodeURIComponent(str)    } catch (err) {      {        warn(false, ("Error decoding \"" + str + "\". Leaving it intact."));      }    }    return str  }  function resolveQuery (    query,    extraQuery,    _parseQuery  ) {    if ( extraQuery === void 0 ) extraQuery = {};    var parse = _parseQuery || parseQuery;    var parsedQuery;    try {      parsedQuery = parse(query || '');    } catch (e) {      warn(false, e.message);      parsedQuery = {};    }    for (var key in extraQuery) {      var value = extraQuery[key];      parsedQuery[key] = Array.isArray(value)        ? value.map(castQueryParamValue)        : castQueryParamValue(value);    }    return parsedQuery  }  var castQueryParamValue = function (value) { return (value == null || typeof value === 'object' ? value : String(value)); };  function parseQuery (query) {    var res = {};    query = query.trim().replace(/^(\?|#|&)/, '');    if (!query) {      return res    }    query.split('&').forEach(function (param) {      var parts = param.replace(/\+/g, ' ').split('=');      var key = decode(parts.shift());      var val = parts.length > 0 ? decode(parts.join('=')) : null;      if (res[key] === undefined) {        res[key] = val;      } else if (Array.isArray(res[key])) {        res[key].push(val);      } else {        res[key] = [res[key], val];      }    });    return res  }  function stringifyQuery (obj) {    var res = obj      ? Object.keys(obj)        .map(function (key) {          var val = obj[key];          if (val === undefined) {            return ''          }          if (val === null) {            return encode(key)          }          if (Array.isArray(val)) {            var result = [];            val.forEach(function (val2) {              if (val2 === undefined) {                return              }              if (val2 === null) {                result.push(encode(key));              } else {                result.push(encode(key) + '=' + encode(val2));              }            });            return result.join('&')          }          return encode(key) + '=' + encode(val)        })        .filter(function (x) { return x.length > 0; })        .join('&')      : null;    return res ? ("?" + res) : ''  }  /*  */  var trailingSlashRE = /\/?$/;  function createRoute (    record,    location,    redirectedFrom,    router  ) {    var stringifyQuery = router && router.options.stringifyQuery;    var query = location.query || {};    try {      query = clone(query);    } catch (e) {}    var route = {      name: location.name || (record && record.name),      meta: (record && record.meta) || {},      path: location.path || '/',      hash: location.hash || '',      query: query,      params: location.params || {},      fullPath: getFullPath(location, stringifyQuery),      matched: record ? formatMatch(record) : []    };    if (redirectedFrom) {      route.redirectedFrom = getFullPath(redirectedFrom, stringifyQuery);    }    return Object.freeze(route)  }  function clone (value) {    if (Array.isArray(value)) {      return value.map(clone)    } else if (value && typeof value === 'object') {      var res = {};      for (var key in value) {        res[key] = clone(value[key]);      }      return res    } else {      return value    }  }  // the starting route that represents the initial state  var START = createRoute(null, {    path: '/'  });  function formatMatch (record) {    var res = [];    while (record) {      res.unshift(record);      record = record.parent;    }    return res  }  function getFullPath (    ref,    _stringifyQuery  ) {    var path = ref.path;    var query = ref.query; if ( query === void 0 ) query = {};    var hash = ref.hash; if ( hash === void 0 ) hash = '';    var stringify = _stringifyQuery || stringifyQuery;    return (path || '/') + stringify(query) + hash  }  function isSameRoute (a, b, onlyPath) {    if (b === START) {      return a === b    } else if (!b) {      return false    } else if (a.path && b.path) {      return a.path.replace(trailingSlashRE, '') === b.path.replace(trailingSlashRE, '') && (onlyPath ||        a.hash === b.hash &&        isObjectEqual(a.query, b.query))    } else if (a.name && b.name) {      return (        a.name === b.name &&        (onlyPath || (          a.hash === b.hash &&        isObjectEqual(a.query, b.query) &&        isObjectEqual(a.params, b.params))        )      )    } else {      return false    }  }  function isObjectEqual (a, b) {    if ( a === void 0 ) a = {};    if ( b === void 0 ) b = {};    // handle null value #1566    if (!a || !b) { return a === b }    var aKeys = Object.keys(a).sort();    var bKeys = Object.keys(b).sort();    if (aKeys.length !== bKeys.length) {      return false    }    return aKeys.every(function (key, i) {      var aVal = a[key];      var bKey = bKeys[i];      if (bKey !== key) { return false }      var bVal = b[key];      // query values can be null and undefined      if (aVal == null || bVal == null) { return aVal === bVal }      // check nested equality      if (typeof aVal === 'object' && typeof bVal === 'object') {        return isObjectEqual(aVal, bVal)      }      return String(aVal) === String(bVal)    })  }  function isIncludedRoute (current, target) {    return (      current.path.replace(trailingSlashRE, '/').indexOf(        target.path.replace(trailingSlashRE, '/')      ) === 0 &&      (!target.hash || current.hash === target.hash) &&      queryIncludes(current.query, target.query)    )  }  function queryIncludes (current, target) {    for (var key in target) {      if (!(key in current)) {        return false      }    }    return true  }  function handleRouteEntered (route) {    for (var i = 0; i < route.matched.length; i++) {      var record = route.matched[i];      for (var name in record.instances) {        var instance = record.instances[name];        var cbs = record.enteredCbs[name];        if (!instance || !cbs) { continue }        delete record.enteredCbs[name];        for (var i$1 = 0; i$1 < cbs.length; i$1++) {          if (!instance._isBeingDestroyed) { cbs[i$1](instance); }        }      }    }  }  var View = {    name: 'RouterView',    functional: true,    props: {      name: {        type: String,        default: 'default'      }    },    render: function render (_, ref) {      var props = ref.props;      var children = ref.children;      var parent = ref.parent;      var data = ref.data;      // used by devtools to display a router-view badge      data.routerView = true;      // directly use parent context's createElement() function      // so that components rendered by router-view can resolve named slots      var h = parent.$createElement;      var name = props.name;      var route = parent.$route;      var cache = parent._routerViewCache || (parent._routerViewCache = {});      // determine current view depth, also check to see if the tree      // has been toggled inactive but kept-alive.      var depth = 0;      var inactive = false;      while (parent && parent._routerRoot !== parent) {        var vnodeData = parent.$vnode ? parent.$vnode.data : {};        if (vnodeData.routerView) {          depth++;        }        if (vnodeData.keepAlive && parent._directInactive && parent._inactive) {          inactive = true;        }        parent = parent.$parent;      }      data.routerViewDepth = depth;      // render previous view if the tree is inactive and kept-alive      if (inactive) {        var cachedData = cache[name];        var cachedComponent = cachedData && cachedData.component;        if (cachedComponent) {          // #2301          // pass props          if (cachedData.configProps) {            fillPropsinData(cachedComponent, data, cachedData.route, cachedData.configProps);          }          return h(cachedComponent, data, children)        } else {          // render previous empty view          return h()        }      }      var matched = route.matched[depth];      var component = matched && matched.components[name];      // render empty node if no matched route or no config component      if (!matched || !component) {        cache[name] = null;        return h()      }      // cache component      cache[name] = { component: component };      // attach instance registration hook      // this will be called in the instance's injected lifecycle hooks      data.registerRouteInstance = function (vm, val) {        // val could be undefined for unregistration        var current = matched.instances[name];        if (          (val && current !== vm) ||          (!val && current === vm)        ) {          matched.instances[name] = val;        }      }      // also register instance in prepatch hook      // in case the same component instance is reused across different routes      ;(data.hook || (data.hook = {})).prepatch = function (_, vnode) {        matched.instances[name] = vnode.componentInstance;      };      // register instance in init hook      // in case kept-alive component be actived when routes changed      data.hook.init = function (vnode) {        if (vnode.data.keepAlive &&          vnode.componentInstance &&          vnode.componentInstance !== matched.instances[name]        ) {          matched.instances[name] = vnode.componentInstance;        }        // if the route transition has already been confirmed then we weren't        // able to call the cbs during confirmation as the component was not        // registered yet, so we call it here.        handleRouteEntered(route);      };      var configProps = matched.props && matched.props[name];      // save route and configProps in cache      if (configProps) {        extend(cache[name], {          route: route,          configProps: configProps        });        fillPropsinData(component, data, route, configProps);      }      return h(component, data, children)    }  };  function fillPropsinData (component, data, route, configProps) {    // resolve props    var propsToPass = data.props = resolveProps(route, configProps);    if (propsToPass) {      // clone to prevent mutation      propsToPass = data.props = extend({}, propsToPass);      // pass non-declared props as attrs      var attrs = data.attrs = data.attrs || {};      for (var key in propsToPass) {        if (!component.props || !(key in component.props)) {          attrs[key] = propsToPass[key];          delete propsToPass[key];        }      }    }  }  function resolveProps (route, config) {    switch (typeof config) {      case 'undefined':        return      case 'object':        return config      case 'function':        return config(route)      case 'boolean':        return config ? route.params : undefined      default:        {          warn(            false,            "props in \"" + (route.path) + "\" is a " + (typeof config) + ", " +            "expecting an object, function or boolean."          );        }    }  }  /*  */  function resolvePath (    relative,    base,    append  ) {    var firstChar = relative.charAt(0);    if (firstChar === '/') {      return relative    }    if (firstChar === '?' || firstChar === '#') {      return base + relative    }    var stack = base.split('/');    // remove trailing segment if:    // - not appending    // - appending to trailing slash (last segment is empty)    if (!append || !stack[stack.length - 1]) {      stack.pop();    }    // resolve relative path    var segments = relative.replace(/^\//, '').split('/');    for (var i = 0; i < segments.length; i++) {      var segment = segments[i];      if (segment === '..') {        stack.pop();      } else if (segment !== '.') {        stack.push(segment);      }    }    // ensure leading slash    if (stack[0] !== '') {      stack.unshift('');    }    return stack.join('/')  }  function parsePath (path) {    var hash = '';    var query = '';    var hashIndex = path.indexOf('#');    if (hashIndex >= 0) {      hash = path.slice(hashIndex);      path = path.slice(0, hashIndex);    }    var queryIndex = path.indexOf('?');    if (queryIndex >= 0) {      query = path.slice(queryIndex + 1);      path = path.slice(0, queryIndex);    }    return {      path: path,      query: query,      hash: hash    }  }  function cleanPath (path) {    return path.replace(/\/(?:\s*\/)+/g, '/')  }  var isarray = Array.isArray || function (arr) {    return Object.prototype.toString.call(arr) == '[object Array]';  };  /**   * Expose `pathToRegexp`.   */  var pathToRegexp_1 = pathToRegexp;  var parse_1 = parse;  var compile_1 = compile;  var tokensToFunction_1 = tokensToFunction;  var tokensToRegExp_1 = tokensToRegExp;  /**   * The main path matching regexp utility.   *   * @type {RegExp}   */  var PATH_REGEXP = new RegExp([    // Match escaped characters that would otherwise appear in future matches.    // This allows the user to escape special characters that won't transform.    '(\\\\.)',    // Match Express-style parameters and un-named parameters with a prefix    // and optional suffixes. Matches appear as:    //    // "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined]    // "/route(\\d+)"  => [undefined, undefined, undefined, "\d+", undefined, undefined]    // "/*"            => ["/", undefined, undefined, undefined, undefined, "*"]    '([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))'  ].join('|'), 'g');  /**   * Parse a string for the raw tokens.   *   * @param  {string}  str   * @param  {Object=} options   * @return {!Array}   */  function parse (str, options) {    var tokens = [];    var key = 0;    var index = 0;    var path = '';    var defaultDelimiter = options && options.delimiter || '/';    var res;    while ((res = PATH_REGEXP.exec(str)) != null) {      var m = res[0];      var escaped = res[1];      var offset = res.index;      path += str.slice(index, offset);      index = offset + m.length;      // Ignore already escaped sequences.      if (escaped) {        path += escaped[1];        continue      }      var next = str[index];      var prefix = res[2];      var name = res[3];      var capture = res[4];      var group = res[5];      var modifier = res[6];      var asterisk = res[7];      // Push the current path onto the tokens.      if (path) {        tokens.push(path);        path = '';      }      var partial = prefix != null && next != null && next !== prefix;      var repeat = modifier === '+' || modifier === '*';      var optional = modifier === '?' || modifier === '*';      var delimiter = res[2] || defaultDelimiter;      var pattern = capture || group;      tokens.push({        name: name || key++,        prefix: prefix || '',        delimiter: delimiter,        optional: optional,        repeat: repeat,        partial: partial,        asterisk: !!asterisk,        pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')      });    }    // Match any characters still remaining.    if (index < str.length) {      path += str.substr(index);    }    // If the path exists, push it onto the end.    if (path) {      tokens.push(path);    }    return tokens  }  /**   * Compile a string to a template function for the path.   *   * @param  {string}             str   * @param  {Object=}            options   * @return {!function(Object=, Object=)}   */  function compile (str, options) {    return tokensToFunction(parse(str, options), options)  }  /**   * Prettier encoding of URI path segments.   *   * @param  {string}   * @return {string}   */  function encodeURIComponentPretty (str) {    return encodeURI(str).replace(/[\/?#]/g, function (c) {      return '%' + c.charCodeAt(0).toString(16).toUpperCase()    })  }  /**   * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.   *   * @param  {string}   * @return {string}   */  function encodeAsterisk (str) {    return encodeURI(str).replace(/[?#]/g, function (c) {      return '%' + c.charCodeAt(0).toString(16).toUpperCase()    })  }  /**   * Expose a method for transforming tokens into the path function.   */  function tokensToFunction (tokens, options) {    // Compile all the tokens into regexps.    var matches = new Array(tokens.length);    // Compile all the patterns before compilation.    for (var i = 0; i < tokens.length; i++) {      if (typeof tokens[i] === 'object') {        matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options));      }    }    return function (obj, opts) {      var path = '';      var data = obj || {};      var options = opts || {};      var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent;      for (var i = 0; i < tokens.length; i++) {        var token = tokens[i];        if (typeof token === 'string') {          path += token;          continue        }        var value = data[token.name];        var segment;        if (value == null) {          if (token.optional) {            // Prepend partial segment prefixes.            if (token.partial) {              path += token.prefix;            }            continue          } else {            throw new TypeError('Expected "' + token.name + '" to be defined')          }        }        if (isarray(value)) {          if (!token.repeat) {            throw new TypeError('Expected "' + token.name + '" to not repeat, but received `' + JSON.stringify(value) + '`')          }          if (value.length === 0) {            if (token.optional) {              continue            } else {              throw new TypeError('Expected "' + token.name + '" to not be empty')            }          }          for (var j = 0; j < value.length; j++) {            segment = encode(value[j]);            if (!matches[i].test(segment)) {              throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received `' + JSON.stringify(segment) + '`')            }            path += (j === 0 ? token.prefix : token.delimiter) + segment;          }          continue        }        segment = token.asterisk ? encodeAsterisk(value) : encode(value);        if (!matches[i].test(segment)) {          throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"')        }        path += token.prefix + segment;      }      return path    }  }  /**   * Escape a regular expression string.   *   * @param  {string} str   * @return {string}   */  function escapeString (str) {    return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, '\\$1')  }  /**   * Escape the capturing group by escaping special characters and meaning.   *   * @param  {string} group   * @return {string}   */  function escapeGroup (group) {    return group.replace(/([=!:$\/()])/g, '\\$1')  }  /**   * Attach the keys as a property of the regexp.   *   * @param  {!RegExp} re   * @param  {Array}   keys   * @return {!RegExp}   */  function attachKeys (re, keys) {    re.keys = keys;    return re  }  /**   * Get the flags for a regexp from the options.   *   * @param  {Object} options   * @return {string}   */  function flags (options) {    return options && options.sensitive ? '' : 'i'  }  /**   * Pull out keys from a regexp.   *   * @param  {!RegExp} path   * @param  {!Array}  keys   * @return {!RegExp}   */  function regexpToRegexp (path, keys) {    // Use a negative lookahead to match only capturing groups.    var groups = path.source.match(/\((?!\?)/g);    if (groups) {      for (var i = 0; i < groups.length; i++) {        keys.push({          name: i,          prefix: null,          delimiter: null,          optional: false,          repeat: false,          partial: false,          asterisk: false,          pattern: null        });      }    }    return attachKeys(path, keys)  }  /**   * Transform an array into a regexp.   *   * @param  {!Array}  path   * @param  {Array}   keys   * @param  {!Object} options   * @return {!RegExp}   */  function arrayToRegexp (path, keys, options) {    var parts = [];    for (var i = 0; i < path.length; i++) {      parts.push(pathToRegexp(path[i], keys, options).source);    }    var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options));    return attachKeys(regexp, keys)  }  /**   * Create a path regexp from string input.   *   * @param  {string}  path   * @param  {!Array}  keys   * @param  {!Object} options   * @return {!RegExp}   */  function stringToRegexp (path, keys, options) {    return tokensToRegExp(parse(path, options), keys, options)  }  /**   * Expose a function for taking tokens and returning a RegExp.   *   * @param  {!Array}          tokens   * @param  {(Array|Object)=} keys   * @param  {Object=}         options   * @return {!RegExp}   */  function tokensToRegExp (tokens, keys, options) {    if (!isarray(keys)) {      options = /** @type {!Object} */ (keys || options);      keys = [];    }    options = options || {};    var strict = options.strict;    var end = options.end !== false;    var route = '';    // Iterate over the tokens and create our regexp string.    for (var i = 0; i < tokens.length; i++) {      var token = tokens[i];      if (typeof token === 'string') {        route += escapeString(token);      } else {        var prefix = escapeString(token.prefix);        var capture = '(?:' + token.pattern + ')';        keys.push(token);        if (token.repeat) {          capture += '(?:' + prefix + capture + ')*';        }        if (token.optional) {          if (!token.partial) {            capture = '(?:' + prefix + '(' + capture + '))?';          } else {            capture = prefix + '(' + capture + ')?';          }        } else {          capture = prefix + '(' + capture + ')';        }        route += capture;      }    }    var delimiter = escapeString(options.delimiter || '/');    var endsWithDelimiter = route.slice(-delimiter.length) === delimiter;    // In non-strict mode we allow a slash at the end of match. If the path to    // match already ends with a slash, we remove it for consistency. The slash    // is valid at the end of a path match, not in the middle. This is important    // in non-ending mode, where "/test/" shouldn't match "/test//route".    if (!strict) {      route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?';    }    if (end) {      route += '$';    } else {      // In non-ending mode, we need the capturing groups to match as much as      // possible by using a positive lookahead to the end or next path segment.      route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)';    }    return attachKeys(new RegExp('^' + route, flags(options)), keys)  }  /**   * Normalize the given path string, returning a regular expression.   *   * An empty array can be passed in for the keys, which will hold the   * placeholder key descriptions. For example, using `/user/:id`, `keys` will   * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.   *   * @param  {(string|RegExp|Array)} path   * @param  {(Array|Object)=}       keys   * @param  {Object=}               options   * @return {!RegExp}   */  function pathToRegexp (path, keys, options) {    if (!isarray(keys)) {      options = /** @type {!Object} */ (keys || options);      keys = [];    }    options = options || {};    if (path instanceof RegExp) {      return regexpToRegexp(path, /** @type {!Array} */ (keys))    }    if (isarray(path)) {      return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)    }    return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)  }  pathToRegexp_1.parse = parse_1;  pathToRegexp_1.compile = compile_1;  pathToRegexp_1.tokensToFunction = tokensToFunction_1;  pathToRegexp_1.tokensToRegExp = tokensToRegExp_1;  /*  */  // $flow-disable-line  var regexpCompileCache = Object.create(null);  function fillParams (    path,    params,    routeMsg  ) {    params = params || {};    try {      var filler =        regexpCompileCache[path] ||        (regexpCompileCache[path] = pathToRegexp_1.compile(path));      // Fix #2505 resolving asterisk routes { name: 'not-found', params: { pathMatch: '/not-found' }}      // and fix #3106 so that you can work with location descriptor object having params.pathMatch equal to empty string      if (typeof params.pathMatch === 'string') { params[0] = params.pathMatch; }      return filler(params, { pretty: true })    } catch (e) {      {        // Fix #3072 no warn if `pathMatch` is string        warn(typeof params.pathMatch === 'string', ("missing param for " + routeMsg + ": " + (e.message)));      }      return ''    } finally {      // delete the 0 if it was added      delete params[0];    }  }  /*  */  function normalizeLocation (    raw,    current,    append,    router  ) {    var next = typeof raw === 'string' ? { path: raw } : raw;    // named target    if (next._normalized) {      return next    } else if (next.name) {      next = extend({}, raw);      var params = next.params;      if (params && typeof params === 'object') {        next.params = extend({}, params);      }      return next    }    // relative params    if (!next.path && next.params && current) {      next = extend({}, next);      next._normalized = true;      var params$1 = extend(extend({}, current.params), next.params);      if (current.name) {        next.name = current.name;        next.params = params$1;      } else if (current.matched.length) {        var rawPath = current.matched[current.matched.length - 1].path;        next.path = fillParams(rawPath, params$1, ("path " + (current.path)));      } else {        warn(false, "relative params navigation requires a current route.");      }      return next    }    var parsedPath = parsePath(next.path || '');    var basePath = (current && current.path) || '/';    var path = parsedPath.path      ? resolvePath(parsedPath.path, basePath, append || next.append)      : basePath;    var query = resolveQuery(      parsedPath.query,      next.query,      router && router.options.parseQuery    );    var hash = next.hash || parsedPath.hash;    if (hash && hash.charAt(0) !== '#') {      hash = "#" + hash;    }    return {      _normalized: true,      path: path,      query: query,      hash: hash    }  }  /*  */  // work around weird flow bug  var toTypes = [String, Object];  var eventTypes = [String, Array];  var noop = function () {};  var warnedCustomSlot;  var warnedTagProp;  var warnedEventProp;  var Link = {    name: 'RouterLink',    props: {      to: {        type: toTypes,        required: true      },      tag: {        type: String,        default: 'a'      },      custom: Boolean,      exact: Boolean,      exactPath: Boolean,      append: Boolean,      replace: Boolean,      activeClass: String,      exactActiveClass: String,      ariaCurrentValue: {        type: String,        default: 'page'      },      event: {        type: eventTypes,        default: 'click'      }    },    render: function render (h) {      var this$1$1 = this;      var router = this.$router;      var current = this.$route;      var ref = router.resolve(        this.to,        current,        this.append      );      var location = ref.location;      var route = ref.route;      var href = ref.href;      var classes = {};      var globalActiveClass = router.options.linkActiveClass;      var globalExactActiveClass = router.options.linkExactActiveClass;      // Support global empty active class      var activeClassFallback =        globalActiveClass == null ? 'router-link-active' : globalActiveClass;      var exactActiveClassFallback =        globalExactActiveClass == null          ? 'router-link-exact-active'          : globalExactActiveClass;      var activeClass =        this.activeClass == null ? activeClassFallback : this.activeClass;      var exactActiveClass =        this.exactActiveClass == null          ? exactActiveClassFallback          : this.exactActiveClass;      var compareTarget = route.redirectedFrom        ? createRoute(null, normalizeLocation(route.redirectedFrom), null, router)        : route;      classes[exactActiveClass] = isSameRoute(current, compareTarget, this.exactPath);      classes[activeClass] = this.exact || this.exactPath        ? classes[exactActiveClass]        : isIncludedRoute(current, compareTarget);      var ariaCurrentValue = classes[exactActiveClass] ? this.ariaCurrentValue : null;      var handler = function (e) {        if (guardEvent(e)) {          if (this$1$1.replace) {            router.replace(location, noop);          } else {            router.push(location, noop);          }        }      };      var on = { click: guardEvent };      if (Array.isArray(this.event)) {        this.event.forEach(function (e) {          on[e] = handler;        });      } else {        on[this.event] = handler;      }      var data = { class: classes };      var scopedSlot =        !this.$scopedSlots.$hasNormal &&        this.$scopedSlots.default &&        this.$scopedSlots.default({          href: href,          route: route,          navigate: handler,          isActive: classes[activeClass],          isExactActive: classes[exactActiveClass]        });      if (scopedSlot) {        if (!this.custom) {          !warnedCustomSlot && warn(false, 'In Vue Router 4, the v-slot API will by default wrap its content with an <a> element. Use the custom prop to remove this warning:\n<router-link v-slot="{ navigate, href }" custom></router-link>\n');          warnedCustomSlot = true;        }        if (scopedSlot.length === 1) {          return scopedSlot[0]        } else if (scopedSlot.length > 1 || !scopedSlot.length) {          {            warn(              false,              ("<router-link> with to=\"" + (this.to) + "\" is trying to use a scoped slot but it didn't provide exactly one child. Wrapping the content with a span element.")            );          }          return scopedSlot.length === 0 ? h() : h('span', {}, scopedSlot)        }      }      {        if ('tag' in this.$options.propsData && !warnedTagProp) {          warn(            false,            "<router-link>'s tag prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning: https://next.router.vuejs.org/guide/migration/#removal-of-event-and-tag-props-in-router-link."          );          warnedTagProp = true;        }        if ('event' in this.$options.propsData && !warnedEventProp) {          warn(            false,            "<router-link>'s event prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning: https://next.router.vuejs.org/guide/migration/#removal-of-event-and-tag-props-in-router-link."          );          warnedEventProp = true;        }      }      if (this.tag === 'a') {        data.on = on;        data.attrs = { href: href, 'aria-current': ariaCurrentValue };      } else {        // find the first <a> child and apply listener and href        var a = findAnchor(this.$slots.default);        if (a) {          // in case the <a> is a static node          a.isStatic = false;          var aData = (a.data = extend({}, a.data));          aData.on = aData.on || {};          // transform existing events in both objects into arrays so we can push later          for (var event in aData.on) {            var handler$1 = aData.on[event];            if (event in on) {              aData.on[event] = Array.isArray(handler$1) ? handler$1 : [handler$1];            }          }          // append new listeners for router-link          for (var event$1 in on) {            if (event$1 in aData.on) {              // on[event] is always a function              aData.on[event$1].push(on[event$1]);            } else {              aData.on[event$1] = handler;            }          }          var aAttrs = (a.data.attrs = extend({}, a.data.attrs));          aAttrs.href = href;          aAttrs['aria-current'] = ariaCurrentValue;        } else {          // doesn't have <a> child, apply listener to self          data.on = on;        }      }      return h(this.tag, data, this.$slots.default)    }  };  function guardEvent (e) {    // don't redirect with control keys    if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) { return }    // don't redirect when preventDefault called    if (e.defaultPrevented) { return }    // don't redirect on right click    if (e.button !== undefined && e.button !== 0) { return }    // don't redirect if `target="_blank"`    if (e.currentTarget && e.currentTarget.getAttribute) {      var target = e.currentTarget.getAttribute('target');      if (/\b_blank\b/i.test(target)) { return }    }    // this may be a Weex event which doesn't have this method    if (e.preventDefault) {      e.preventDefault();    }    return true  }  function findAnchor (children) {    if (children) {      var child;      for (var i = 0; i < children.length; i++) {        child = children[i];        if (child.tag === 'a') {          return child        }        if (child.children && (child = findAnchor(child.children))) {          return child        }      }    }  }  var _Vue;  function install (Vue) {    if (install.installed && _Vue === Vue) { return }    install.installed = true;    _Vue = Vue;    var isDef = function (v) { return v !== undefined; };    var registerInstance = function (vm, callVal) {      var i = vm.$options._parentVnode;      if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) {        i(vm, callVal);      }    };    Vue.mixin({      beforeCreate: function beforeCreate () {        if (isDef(this.$options.router)) {          this._routerRoot = this;          this._router = this.$options.router;          this._router.init(this);          Vue.util.defineReactive(this, '_route', this._router.history.current);        } else {          this._routerRoot = (this.$parent && this.$parent._routerRoot) || this;        }        registerInstance(this, this);      },      destroyed: function destroyed () {        registerInstance(this);      }    });    Object.defineProperty(Vue.prototype, '$router', {      get: function get () { return this._routerRoot._router }    });    Object.defineProperty(Vue.prototype, '$route', {      get: function get () { return this._routerRoot._route }    });    Vue.component('RouterView', View);    Vue.component('RouterLink', Link);    var strats = Vue.config.optionMergeStrategies;    // use the same hook merging strategy for route hooks    strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created;  }  /*  */  var inBrowser = typeof window !== 'undefined';  /*  */  function createRouteMap (    routes,    oldPathList,    oldPathMap,    oldNameMap,    parentRoute  ) {    // the path list is used to control path matching priority    var pathList = oldPathList || [];    // $flow-disable-line    var pathMap = oldPathMap || Object.create(null);    // $flow-disable-line    var nameMap = oldNameMap || Object.create(null);    routes.forEach(function (route) {      addRouteRecord(pathList, pathMap, nameMap, route, parentRoute);    });    // ensure wildcard routes are always at the end    for (var i = 0, l = pathList.length; i < l; i++) {      if (pathList[i] === '*') {        pathList.push(pathList.splice(i, 1)[0]);        l--;        i--;      }    }    {      // warn if routes do not include leading slashes      var found = pathList      // check for missing leading slash        .filter(function (path) { return path && path.charAt(0) !== '*' && path.charAt(0) !== '/'; });      if (found.length > 0) {        var pathNames = found.map(function (path) { return ("- " + path); }).join('\n');        warn(false, ("Non-nested routes must include a leading slash character. Fix the following routes: \n" + pathNames));      }    }    return {      pathList: pathList,      pathMap: pathMap,      nameMap: nameMap    }  }  function addRouteRecord (    pathList,    pathMap,    nameMap,    route,    parent,    matchAs  ) {    var path = route.path;    var name = route.name;    {      assert(path != null, "\"path\" is required in a route configuration.");      assert(        typeof route.component !== 'string',        "route config \"component\" for path: " + (String(          path || name        )) + " cannot be a " + "string id. Use an actual component instead."      );      warn(        // eslint-disable-next-line no-control-regex        !/[^\u0000-\u007F]+/.test(path),        "Route with path \"" + path + "\" contains unencoded characters, make sure " +          "your path is correctly encoded before passing it to the router. Use " +          "encodeURI to encode static segments of your path."      );    }    var pathToRegexpOptions =      route.pathToRegexpOptions || {};    var normalizedPath = normalizePath(path, parent, pathToRegexpOptions.strict);    if (typeof route.caseSensitive === 'boolean') {      pathToRegexpOptions.sensitive = route.caseSensitive;    }    var record = {      path: normalizedPath,      regex: compileRouteRegex(normalizedPath, pathToRegexpOptions),      components: route.components || { default: route.component },      alias: route.alias        ? typeof route.alias === 'string'          ? [route.alias]          : route.alias        : [],      instances: {},      enteredCbs: {},      name: name,      parent: parent,      matchAs: matchAs,      redirect: route.redirect,      beforeEnter: route.beforeEnter,      meta: route.meta || {},      props:        route.props == null          ? {}          : route.components            ? route.props            : { default: route.props }    };    if (route.children) {      // Warn if route is named, does not redirect and has a default child route.      // If users navigate to this route by name, the default child will      // not be rendered (GH Issue #629)      {        if (          route.name &&          !route.redirect &&          route.children.some(function (child) { return /^\/?$/.test(child.path); })        ) {          warn(            false,            "Named Route '" + (route.name) + "' has a default child route. " +              "When navigating to this named route (:to=\"{name: '" + (route.name) + "'}\"), " +              "the default child route will not be rendered. Remove the name from " +              "this route and use the name of the default child route for named " +              "links instead."          );        }      }      route.children.forEach(function (child) {        var childMatchAs = matchAs          ? cleanPath((matchAs + "/" + (child.path)))          : undefined;        addRouteRecord(pathList, pathMap, nameMap, child, record, childMatchAs);      });    }    if (!pathMap[record.path]) {      pathList.push(record.path);      pathMap[record.path] = record;    }    if (route.alias !== undefined) {      var aliases = Array.isArray(route.alias) ? route.alias : [route.alias];      for (var i = 0; i < aliases.length; ++i) {        var alias = aliases[i];        if (alias === path) {          warn(            false,            ("Found an alias with the same value as the path: \"" + path + "\". You have to remove that alias. It will be ignored in development.")          );          // skip in dev to make it work          continue        }        var aliasRoute = {          path: alias,          children: route.children        };        addRouteRecord(          pathList,          pathMap,          nameMap,          aliasRoute,          parent,          record.path || '/' // matchAs        );      }    }    if (name) {      if (!nameMap[name]) {        nameMap[name] = record;      } else if (!matchAs) {        warn(          false,          "Duplicate named routes definition: " +            "{ name: \"" + name + "\", path: \"" + (record.path) + "\" }"        );      }    }  }  function compileRouteRegex (    path,    pathToRegexpOptions  ) {    var regex = pathToRegexp_1(path, [], pathToRegexpOptions);    {      var keys = Object.create(null);      regex.keys.forEach(function (key) {        warn(          !keys[key.name],          ("Duplicate param keys in route with path: \"" + path + "\"")        );        keys[key.name] = true;      });    }    return regex  }  function normalizePath (    path,    parent,    strict  ) {    if (!strict) { path = path.replace(/\/$/, ''); }    if (path[0] === '/') { return path }    if (parent == null) { return path }    return cleanPath(((parent.path) + "/" + path))  }  /*  */  function createMatcher (    routes,    router  ) {    var ref = createRouteMap(routes);    var pathList = ref.pathList;    var pathMap = ref.pathMap;    var nameMap = ref.nameMap;    function addRoutes (routes) {      createRouteMap(routes, pathList, pathMap, nameMap);    }    function addRoute (parentOrRoute, route) {      var parent = (typeof parentOrRoute !== 'object') ? nameMap[parentOrRoute] : undefined;      // $flow-disable-line      createRouteMap([route || parentOrRoute], pathList, pathMap, nameMap, parent);      // add aliases of parent      if (parent && parent.alias.length) {        createRouteMap(          // $flow-disable-line route is defined if parent is          parent.alias.map(function (alias) { return ({ path: alias, children: [route] }); }),          pathList,          pathMap,          nameMap,          parent        );      }    }    function getRoutes () {      return pathList.map(function (path) { return pathMap[path]; })    }    function match (      raw,      currentRoute,      redirectedFrom    ) {      var location = normalizeLocation(raw, currentRoute, false, router);      var name = location.name;      if (name) {        var record = nameMap[name];        {          warn(record, ("Route with name '" + name + "' does not exist"));        }        if (!record) { return _createRoute(null, location) }        var paramNames = record.regex.keys          .filter(function (key) { return !key.optional; })          .map(function (key) { return key.name; });        if (typeof location.params !== 'object') {          location.params = {};        }        if (currentRoute && typeof currentRoute.params === 'object') {          for (var key in currentRoute.params) {            if (!(key in location.params) && paramNames.indexOf(key) > -1) {              location.params[key] = currentRoute.params[key];            }          }        }        location.path = fillParams(record.path, location.params, ("named route \"" + name + "\""));        return _createRoute(record, location, redirectedFrom)      } else if (location.path) {        location.params = {};        for (var i = 0; i < pathList.length; i++) {          var path = pathList[i];          var record$1 = pathMap[path];          if (matchRoute(record$1.regex, location.path, location.params)) {            return _createRoute(record$1, location, redirectedFrom)          }        }      }      // no match      return _createRoute(null, location)    }    function redirect (      record,      location    ) {      var originalRedirect = record.redirect;      var redirect = typeof originalRedirect === 'function'        ? originalRedirect(createRoute(record, location, null, router))        : originalRedirect;      if (typeof redirect === 'string') {        redirect = { path: redirect };      }      if (!redirect || typeof redirect !== 'object') {        {          warn(            false, ("invalid redirect option: " + (JSON.stringify(redirect)))          );        }        return _createRoute(null, location)      }      var re = redirect;      var name = re.name;      var path = re.path;      var query = location.query;      var hash = location.hash;      var params = location.params;      query = re.hasOwnProperty('query') ? re.query : query;      hash = re.hasOwnProperty('hash') ? re.hash : hash;      params = re.hasOwnProperty('params') ? re.params : params;      if (name) {        // resolved named direct        var targetRecord = nameMap[name];        {          assert(targetRecord, ("redirect failed: named route \"" + name + "\" not found."));        }        return match({          _normalized: true,          name: name,          query: query,          hash: hash,          params: params        }, undefined, location)      } else if (path) {        // 1. resolve relative redirect        var rawPath = resolveRecordPath(path, record);        // 2. resolve params        var resolvedPath = fillParams(rawPath, params, ("redirect route with path \"" + rawPath + "\""));        // 3. rematch with existing query and hash        return match({          _normalized: true,          path: resolvedPath,          query: query,          hash: hash        }, undefined, location)      } else {        {          warn(false, ("invalid redirect option: " + (JSON.stringify(redirect))));        }        return _createRoute(null, location)      }    }    function alias (      record,      location,      matchAs    ) {      var aliasedPath = fillParams(matchAs, location.params, ("aliased route with path \"" + matchAs + "\""));      var aliasedMatch = match({        _normalized: true,        path: aliasedPath      });      if (aliasedMatch) {        var matched = aliasedMatch.matched;        var aliasedRecord = matched[matched.length - 1];        location.params = aliasedMatch.params;        return _createRoute(aliasedRecord, location)      }      return _createRoute(null, location)    }    function _createRoute (      record,      location,      redirectedFrom    ) {      if (record && record.redirect) {        return redirect(record, redirectedFrom || location)      }      if (record && record.matchAs) {        return alias(record, location, record.matchAs)      }      return createRoute(record, location, redirectedFrom, router)    }    return {      match: match,      addRoute: addRoute,      getRoutes: getRoutes,      addRoutes: addRoutes    }  }  function matchRoute (    regex,    path,    params  ) {    var m = path.match(regex);    if (!m) {      return false    } else if (!params) {      return true    }    for (var i = 1, len = m.length; i < len; ++i) {      var key = regex.keys[i - 1];      if (key) {        // Fix #1994: using * with props: true generates a param named 0        params[key.name || 'pathMatch'] = typeof m[i] === 'string' ? decode(m[i]) : m[i];      }    }    return true  }  function resolveRecordPath (path, record) {    return resolvePath(path, record.parent ? record.parent.path : '/', true)  }  /*  */  // use User Timing api (if present) for more accurate key precision  var Time =    inBrowser && window.performance && window.performance.now      ? window.performance      : Date;  function genStateKey () {    return Time.now().toFixed(3)  }  var _key = genStateKey();  function getStateKey () {    return _key  }  function setStateKey (key) {    return (_key = key)  }  /*  */  var positionStore = Object.create(null);  function setupScroll () {    // Prevent browser scroll behavior on History popstate    if ('scrollRestoration' in window.history) {      window.history.scrollRestoration = 'manual';    }    // Fix for #1585 for Firefox    // Fix for #2195 Add optional third attribute to workaround a bug in safari https://bugs.webkit.org/show_bug.cgi?id=182678    // Fix for #2774 Support for apps loaded from Windows file shares not mapped to network drives: replaced location.origin with    // window.location.protocol + '//' + window.location.host    // location.host contains the port and location.hostname doesn't    var protocolAndPath = window.location.protocol + '//' + window.location.host;    var absolutePath = window.location.href.replace(protocolAndPath, '');    // preserve existing history state as it could be overriden by the user    var stateCopy = extend({}, window.history.state);    stateCopy.key = getStateKey();    window.history.replaceState(stateCopy, '', absolutePath);    window.addEventListener('popstate', handlePopState);    return function () {      window.removeEventListener('popstate', handlePopState);    }  }  function handleScroll (    router,    to,    from,    isPop  ) {    if (!router.app) {      return    }    var behavior = router.options.scrollBehavior;    if (!behavior) {      return    }    {      assert(typeof behavior === 'function', "scrollBehavior must be a function");    }    // wait until re-render finishes before scrolling    router.app.$nextTick(function () {      var position = getScrollPosition();      var shouldScroll = behavior.call(        router,        to,        from,        isPop ? position : null      );      if (!shouldScroll) {        return      }      if (typeof shouldScroll.then === 'function') {        shouldScroll          .then(function (shouldScroll) {            scrollToPosition((shouldScroll), position);          })          .catch(function (err) {            {              assert(false, err.toString());            }          });      } else {        scrollToPosition(shouldScroll, position);      }    });  }  function saveScrollPosition () {    var key = getStateKey();    if (key) {      positionStore[key] = {        x: window.pageXOffset,        y: window.pageYOffset      };    }  }  function handlePopState (e) {    saveScrollPosition();    if (e.state && e.state.key) {      setStateKey(e.state.key);    }  }  function getScrollPosition () {    var key = getStateKey();    if (key) {      return positionStore[key]    }  }  function getElementPosition (el, offset) {    var docEl = document.documentElement;    var docRect = docEl.getBoundingClientRect();    var elRect = el.getBoundingClientRect();    return {      x: elRect.left - docRect.left - offset.x,      y: elRect.top - docRect.top - offset.y    }  }  function isValidPosition (obj) {    return isNumber(obj.x) || isNumber(obj.y)  }  function normalizePosition (obj) {    return {      x: isNumber(obj.x) ? obj.x : window.pageXOffset,      y: isNumber(obj.y) ? obj.y : window.pageYOffset    }  }  function normalizeOffset (obj) {    return {      x: isNumber(obj.x) ? obj.x : 0,      y: isNumber(obj.y) ? obj.y : 0    }  }  function isNumber (v) {    return typeof v === 'number'  }  var hashStartsWithNumberRE = /^#\d/;  function scrollToPosition (shouldScroll, position) {    var isObject = typeof shouldScroll === 'object';    if (isObject && typeof shouldScroll.selector === 'string') {      // getElementById would still fail if the selector contains a more complicated query like #main[data-attr]      // but at the same time, it doesn't make much sense to select an element with an id and an extra selector      var el = hashStartsWithNumberRE.test(shouldScroll.selector) // $flow-disable-line        ? document.getElementById(shouldScroll.selector.slice(1)) // $flow-disable-line        : document.querySelector(shouldScroll.selector);      if (el) {        var offset =          shouldScroll.offset && typeof shouldScroll.offset === 'object'            ? shouldScroll.offset            : {};        offset = normalizeOffset(offset);        position = getElementPosition(el, offset);      } else if (isValidPosition(shouldScroll)) {        position = normalizePosition(shouldScroll);      }    } else if (isObject && isValidPosition(shouldScroll)) {      position = normalizePosition(shouldScroll);    }    if (position) {      // $flow-disable-line      if ('scrollBehavior' in document.documentElement.style) {        window.scrollTo({          left: position.x,          top: position.y,          // $flow-disable-line          behavior: shouldScroll.behavior        });      } else {        window.scrollTo(position.x, position.y);      }    }  }  /*  */  var supportsPushState =    inBrowser &&    (function () {      var ua = window.navigator.userAgent;      if (        (ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) &&        ua.indexOf('Mobile Safari') !== -1 &&        ua.indexOf('Chrome') === -1 &&        ua.indexOf('Windows Phone') === -1      ) {        return false      }      return window.history && typeof window.history.pushState === 'function'    })();  function pushState (url, replace) {    saveScrollPosition();    // try...catch the pushState call to get around Safari    // DOM Exception 18 where it limits to 100 pushState calls    var history = window.history;    try {      if (replace) {        // preserve existing history state as it could be overriden by the user        var stateCopy = extend({}, history.state);        stateCopy.key = getStateKey();        history.replaceState(stateCopy, '', url);      } else {        history.pushState({ key: setStateKey(genStateKey()) }, '', url);      }    } catch (e) {      window.location[replace ? 'replace' : 'assign'](url);    }  }  function replaceState (url) {    pushState(url, true);  }  // When changing thing, also edit router.d.ts  var NavigationFailureType = {    redirected: 2,    aborted: 4,    cancelled: 8,    duplicated: 16  };  function createNavigationRedirectedError (from, to) {    return createRouterError(      from,      to,      NavigationFailureType.redirected,      ("Redirected when going from \"" + (from.fullPath) + "\" to \"" + (stringifyRoute(        to      )) + "\" via a navigation guard.")    )  }  function createNavigationDuplicatedError (from, to) {    var error = createRouterError(      from,      to,      NavigationFailureType.duplicated,      ("Avoided redundant navigation to current location: \"" + (from.fullPath) + "\".")    );    // backwards compatible with the first introduction of Errors    error.name = 'NavigationDuplicated';    return error  }  function createNavigationCancelledError (from, to) {    return createRouterError(      from,      to,      NavigationFailureType.cancelled,      ("Navigation cancelled from \"" + (from.fullPath) + "\" to \"" + (to.fullPath) + "\" with a new navigation.")    )  }  function createNavigationAbortedError (from, to) {    return createRouterError(      from,      to,      NavigationFailureType.aborted,      ("Navigation aborted from \"" + (from.fullPath) + "\" to \"" + (to.fullPath) + "\" via a navigation guard.")    )  }  function createRouterError (from, to, type, message) {    var error = new Error(message);    error._isRouter = true;    error.from = from;    error.to = to;    error.type = type;    return error  }  var propertiesToLog = ['params', 'query', 'hash'];  function stringifyRoute (to) {    if (typeof to === 'string') { return to }    if ('path' in to) { return to.path }    var location = {};    propertiesToLog.forEach(function (key) {      if (key in to) { location[key] = to[key]; }    });    return JSON.stringify(location, null, 2)  }  function isError (err) {    return Object.prototype.toString.call(err).indexOf('Error') > -1  }  function isNavigationFailure (err, errorType) {    return (      isError(err) &&      err._isRouter &&      (errorType == null || err.type === errorType)    )  }  /*  */  function runQueue (queue, fn, cb) {    var step = function (index) {      if (index >= queue.length) {        cb();      } else {        if (queue[index]) {          fn(queue[index], function () {            step(index + 1);          });        } else {          step(index + 1);        }      }    };    step(0);  }  /*  */  function resolveAsyncComponents (matched) {    return function (to, from, next) {      var hasAsync = false;      var pending = 0;      var error = null;      flatMapComponents(matched, function (def, _, match, key) {        // if it's a function and doesn't have cid attached,        // assume it's an async component resolve function.        // we are not using Vue's default async resolving mechanism because        // we want to halt the navigation until the incoming component has been        // resolved.        if (typeof def === 'function' && def.cid === undefined) {          hasAsync = true;          pending++;          var resolve = once(function (resolvedDef) {            if (isESModule(resolvedDef)) {              resolvedDef = resolvedDef.default;            }            // save resolved on async factory in case it's used elsewhere            def.resolved = typeof resolvedDef === 'function'              ? resolvedDef              : _Vue.extend(resolvedDef);            match.components[key] = resolvedDef;            pending--;            if (pending <= 0) {              next();            }          });          var reject = once(function (reason) {            var msg = "Failed to resolve async component " + key + ": " + reason;            warn(false, msg);            if (!error) {              error = isError(reason)                ? reason                : new Error(msg);              next(error);            }          });          var res;          try {            res = def(resolve, reject);          } catch (e) {            reject(e);          }          if (res) {            if (typeof res.then === 'function') {              res.then(resolve, reject);            } else {              // new syntax in Vue 2.3              var comp = res.component;              if (comp && typeof comp.then === 'function') {                comp.then(resolve, reject);              }            }          }        }      });      if (!hasAsync) { next(); }    }  }  function flatMapComponents (    matched,    fn  ) {    return flatten(matched.map(function (m) {      return Object.keys(m.components).map(function (key) { return fn(        m.components[key],        m.instances[key],        m, key      ); })    }))  }  function flatten (arr) {    return Array.prototype.concat.apply([], arr)  }  var hasSymbol =    typeof Symbol === 'function' &&    typeof Symbol.toStringTag === 'symbol';  function isESModule (obj) {    return obj.__esModule || (hasSymbol && obj[Symbol.toStringTag] === 'Module')  }  // in Webpack 2, require.ensure now also returns a Promise  // so the resolve/reject functions may get called an extra time  // if the user uses an arrow function shorthand that happens to  // return that Promise.  function once (fn) {    var called = false;    return function () {      var args = [], len = arguments.length;      while ( len-- ) args[ len ] = arguments[ len ];      if (called) { return }      called = true;      return fn.apply(this, args)    }  }  /*  */  var History = function History (router, base) {    this.router = router;    this.base = normalizeBase(base);    // start with a route object that stands for "nowhere"    this.current = START;    this.pending = null;    this.ready = false;    this.readyCbs = [];    this.readyErrorCbs = [];    this.errorCbs = [];    this.listeners = [];  };  History.prototype.listen = function listen (cb) {    this.cb = cb;  };  History.prototype.onReady = function onReady (cb, errorCb) {    if (this.ready) {      cb();    } else {      this.readyCbs.push(cb);      if (errorCb) {        this.readyErrorCbs.push(errorCb);      }    }  };  History.prototype.onError = function onError (errorCb) {    this.errorCbs.push(errorCb);  };  History.prototype.transitionTo = function transitionTo (    location,    onComplete,    onAbort  ) {      var this$1$1 = this;    var route;    // catch redirect option https://github.com/vuejs/vue-router/issues/3201    try {      route = this.router.match(location, this.current);    } catch (e) {      this.errorCbs.forEach(function (cb) {        cb(e);      });      // Exception should still be thrown      throw e    }    var prev = this.current;    this.confirmTransition(      route,      function () {        this$1$1.updateRoute(route);        onComplete && onComplete(route);        this$1$1.ensureURL();        this$1$1.router.afterHooks.forEach(function (hook) {          hook && hook(route, prev);        });        // fire ready cbs once        if (!this$1$1.ready) {          this$1$1.ready = true;          this$1$1.readyCbs.forEach(function (cb) {            cb(route);          });        }      },      function (err) {        if (onAbort) {          onAbort(err);        }        if (err && !this$1$1.ready) {          // Initial redirection should not mark the history as ready yet          // because it's triggered by the redirection instead          // https://github.com/vuejs/vue-router/issues/3225          // https://github.com/vuejs/vue-router/issues/3331          if (!isNavigationFailure(err, NavigationFailureType.redirected) || prev !== START) {            this$1$1.ready = true;            this$1$1.readyErrorCbs.forEach(function (cb) {              cb(err);            });          }        }      }    );  };  History.prototype.confirmTransition = function confirmTransition (route, onComplete, onAbort) {      var this$1$1 = this;    var current = this.current;    this.pending = route;    var abort = function (err) {      // changed after adding errors with      // https://github.com/vuejs/vue-router/pull/3047 before that change,      // redirect and aborted navigation would produce an err == null      if (!isNavigationFailure(err) && isError(err)) {        if (this$1$1.errorCbs.length) {          this$1$1.errorCbs.forEach(function (cb) {            cb(err);          });        } else {          {            warn(false, 'uncaught error during route navigation:');          }          console.error(err);        }      }      onAbort && onAbort(err);    };    var lastRouteIndex = route.matched.length - 1;    var lastCurrentIndex = current.matched.length - 1;    if (      isSameRoute(route, current) &&      // in the case the route map has been dynamically appended to      lastRouteIndex === lastCurrentIndex &&      route.matched[lastRouteIndex] === current.matched[lastCurrentIndex]    ) {      this.ensureURL();      if (route.hash) {        handleScroll(this.router, current, route, false);      }      return abort(createNavigationDuplicatedError(current, route))    }    var ref = resolveQueue(      this.current.matched,      route.matched    );      var updated = ref.updated;      var deactivated = ref.deactivated;      var activated = ref.activated;    var queue = [].concat(      // in-component leave guards      extractLeaveGuards(deactivated),      // global before hooks      this.router.beforeHooks,      // in-component update hooks      extractUpdateHooks(updated),      // in-config enter guards      activated.map(function (m) { return m.beforeEnter; }),      // async components      resolveAsyncComponents(activated)    );    var iterator = function (hook, next) {      if (this$1$1.pending !== route) {        return abort(createNavigationCancelledError(current, route))      }      try {        hook(route, current, function (to) {          if (to === false) {            // next(false) -> abort navigation, ensure current URL            this$1$1.ensureURL(true);            abort(createNavigationAbortedError(current, route));          } else if (isError(to)) {            this$1$1.ensureURL(true);            abort(to);          } else if (            typeof to === 'string' ||            (typeof to === 'object' &&              (typeof to.path === 'string' || typeof to.name === 'string'))          ) {            // next('/') or next({ path: '/' }) -> redirect            abort(createNavigationRedirectedError(current, route));            if (typeof to === 'object' && to.replace) {              this$1$1.replace(to);            } else {              this$1$1.push(to);            }          } else {            // confirm transition and pass on the value            next(to);          }        });      } catch (e) {        abort(e);      }    };    runQueue(queue, iterator, function () {      // wait until async components are resolved before      // extracting in-component enter guards      var enterGuards = extractEnterGuards(activated);      var queue = enterGuards.concat(this$1$1.router.resolveHooks);      runQueue(queue, iterator, function () {        if (this$1$1.pending !== route) {          return abort(createNavigationCancelledError(current, route))        }        this$1$1.pending = null;        onComplete(route);        if (this$1$1.router.app) {          this$1$1.router.app.$nextTick(function () {            handleRouteEntered(route);          });        }      });    });  };  History.prototype.updateRoute = function updateRoute (route) {    this.current = route;    this.cb && this.cb(route);  };  History.prototype.setupListeners = function setupListeners () {    // Default implementation is empty  };  History.prototype.teardown = function teardown () {    // clean up event listeners    // https://github.com/vuejs/vue-router/issues/2341    this.listeners.forEach(function (cleanupListener) {      cleanupListener();    });    this.listeners = [];    // reset current history route    // https://github.com/vuejs/vue-router/issues/3294    this.current = START;    this.pending = null;  };  function normalizeBase (base) {    if (!base) {      if (inBrowser) {        // respect <base> tag        var baseEl = document.querySelector('base');        base = (baseEl && baseEl.getAttribute('href')) || '/';        // strip full URL origin        base = base.replace(/^https?:\/\/[^\/]+/, '');      } else {        base = '/';      }    }    // make sure there's the starting slash    if (base.charAt(0) !== '/') {      base = '/' + base;    }    // remove trailing slash    return base.replace(/\/$/, '')  }  function resolveQueue (    current,    next  ) {    var i;    var max = Math.max(current.length, next.length);    for (i = 0; i < max; i++) {      if (current[i] !== next[i]) {        break      }    }    return {      updated: next.slice(0, i),      activated: next.slice(i),      deactivated: current.slice(i)    }  }  function extractGuards (    records,    name,    bind,    reverse  ) {    var guards = flatMapComponents(records, function (def, instance, match, key) {      var guard = extractGuard(def, name);      if (guard) {        return Array.isArray(guard)          ? guard.map(function (guard) { return bind(guard, instance, match, key); })          : bind(guard, instance, match, key)      }    });    return flatten(reverse ? guards.reverse() : guards)  }  function extractGuard (    def,    key  ) {    if (typeof def !== 'function') {      // extend now so that global mixins are applied.      def = _Vue.extend(def);    }    return def.options[key]  }  function extractLeaveGuards (deactivated) {    return extractGuards(deactivated, 'beforeRouteLeave', bindGuard, true)  }  function extractUpdateHooks (updated) {    return extractGuards(updated, 'beforeRouteUpdate', bindGuard)  }  function bindGuard (guard, instance) {    if (instance) {      return function boundRouteGuard () {        return guard.apply(instance, arguments)      }    }  }  function extractEnterGuards (    activated  ) {    return extractGuards(      activated,      'beforeRouteEnter',      function (guard, _, match, key) {        return bindEnterGuard(guard, match, key)      }    )  }  function bindEnterGuard (    guard,    match,    key  ) {    return function routeEnterGuard (to, from, next) {      return guard(to, from, function (cb) {        if (typeof cb === 'function') {          if (!match.enteredCbs[key]) {            match.enteredCbs[key] = [];          }          match.enteredCbs[key].push(cb);        }        next(cb);      })    }  }  /*  */  var HTML5History = /*@__PURE__*/(function (History) {    function HTML5History (router, base) {      History.call(this, router, base);      this._startLocation = getLocation(this.base);    }    if ( History ) HTML5History.__proto__ = History;    HTML5History.prototype = Object.create( History && History.prototype );    HTML5History.prototype.constructor = HTML5History;    HTML5History.prototype.setupListeners = function setupListeners () {      var this$1$1 = this;      if (this.listeners.length > 0) {        return      }      var router = this.router;      var expectScroll = router.options.scrollBehavior;      var supportsScroll = supportsPushState && expectScroll;      if (supportsScroll) {        this.listeners.push(setupScroll());      }      var handleRoutingEvent = function () {        var current = this$1$1.current;        // Avoiding first `popstate` event dispatched in some browsers but first        // history route not updated since async guard at the same time.        var location = getLocation(this$1$1.base);        if (this$1$1.current === START && location === this$1$1._startLocation) {          return        }        this$1$1.transitionTo(location, function (route) {          if (supportsScroll) {            handleScroll(router, route, current, true);          }        });      };      window.addEventListener('popstate', handleRoutingEvent);      this.listeners.push(function () {        window.removeEventListener('popstate', handleRoutingEvent);      });    };    HTML5History.prototype.go = function go (n) {      window.history.go(n);    };    HTML5History.prototype.push = function push (location, onComplete, onAbort) {      var this$1$1 = this;      var ref = this;      var fromRoute = ref.current;      this.transitionTo(location, function (route) {        pushState(cleanPath(this$1$1.base + route.fullPath));        handleScroll(this$1$1.router, route, fromRoute, false);        onComplete && onComplete(route);      }, onAbort);    };    HTML5History.prototype.replace = function replace (location, onComplete, onAbort) {      var this$1$1 = this;      var ref = this;      var fromRoute = ref.current;      this.transitionTo(location, function (route) {        replaceState(cleanPath(this$1$1.base + route.fullPath));        handleScroll(this$1$1.router, route, fromRoute, false);        onComplete && onComplete(route);      }, onAbort);    };    HTML5History.prototype.ensureURL = function ensureURL (push) {      if (getLocation(this.base) !== this.current.fullPath) {        var current = cleanPath(this.base + this.current.fullPath);        push ? pushState(current) : replaceState(current);      }    };    HTML5History.prototype.getCurrentLocation = function getCurrentLocation () {      return getLocation(this.base)    };    return HTML5History;  }(History));  function getLocation (base) {    var path = window.location.pathname;    var pathLowerCase = path.toLowerCase();    var baseLowerCase = base.toLowerCase();    // base="/a" shouldn't turn path="/app" into "/a/pp"    // https://github.com/vuejs/vue-router/issues/3555    // so we ensure the trailing slash in the base    if (base && ((pathLowerCase === baseLowerCase) ||      (pathLowerCase.indexOf(cleanPath(baseLowerCase + '/')) === 0))) {      path = path.slice(base.length);    }    return (path || '/') + window.location.search + window.location.hash  }  /*  */  var HashHistory = /*@__PURE__*/(function (History) {    function HashHistory (router, base, fallback) {      History.call(this, router, base);      // check history fallback deeplinking      if (fallback && checkFallback(this.base)) {        return      }      ensureSlash();    }    if ( History ) HashHistory.__proto__ = History;    HashHistory.prototype = Object.create( History && History.prototype );    HashHistory.prototype.constructor = HashHistory;    // this is delayed until the app mounts    // to avoid the hashchange listener being fired too early    HashHistory.prototype.setupListeners = function setupListeners () {      var this$1$1 = this;      if (this.listeners.length > 0) {        return      }      var router = this.router;      var expectScroll = router.options.scrollBehavior;      var supportsScroll = supportsPushState && expectScroll;      if (supportsScroll) {        this.listeners.push(setupScroll());      }      var handleRoutingEvent = function () {        var current = this$1$1.current;        if (!ensureSlash()) {          return        }        this$1$1.transitionTo(getHash(), function (route) {          if (supportsScroll) {            handleScroll(this$1$1.router, route, current, true);          }          if (!supportsPushState) {            replaceHash(route.fullPath);          }        });      };      var eventType = supportsPushState ? 'popstate' : 'hashchange';      window.addEventListener(        eventType,        handleRoutingEvent      );      this.listeners.push(function () {        window.removeEventListener(eventType, handleRoutingEvent);      });    };    HashHistory.prototype.push = function push (location, onComplete, onAbort) {      var this$1$1 = this;      var ref = this;      var fromRoute = ref.current;      this.transitionTo(        location,        function (route) {          pushHash(route.fullPath);          handleScroll(this$1$1.router, route, fromRoute, false);          onComplete && onComplete(route);        },        onAbort      );    };    HashHistory.prototype.replace = function replace (location, onComplete, onAbort) {      var this$1$1 = this;      var ref = this;      var fromRoute = ref.current;      this.transitionTo(        location,        function (route) {          replaceHash(route.fullPath);          handleScroll(this$1$1.router, route, fromRoute, false);          onComplete && onComplete(route);        },        onAbort      );    };    HashHistory.prototype.go = function go (n) {      window.history.go(n);    };    HashHistory.prototype.ensureURL = function ensureURL (push) {      var current = this.current.fullPath;      if (getHash() !== current) {        push ? pushHash(current) : replaceHash(current);      }    };    HashHistory.prototype.getCurrentLocation = function getCurrentLocation () {      return getHash()    };    return HashHistory;  }(History));  function checkFallback (base) {    var location = getLocation(base);    if (!/^\/#/.test(location)) {      window.location.replace(cleanPath(base + '/#' + location));      return true    }  }  function ensureSlash () {    var path = getHash();    if (path.charAt(0) === '/') {      return true    }    replaceHash('/' + path);    return false  }  function getHash () {    // We can't use window.location.hash here because it's not    // consistent across browsers - Firefox will pre-decode it!    var href = window.location.href;    var index = href.indexOf('#');    // empty path    if (index < 0) { return '' }    href = href.slice(index + 1);    return href  }  function getUrl (path) {    var href = window.location.href;    var i = href.indexOf('#');    var base = i >= 0 ? href.slice(0, i) : href;    return (base + "#" + path)  }  function pushHash (path) {    if (supportsPushState) {      pushState(getUrl(path));    } else {      window.location.hash = path;    }  }  function replaceHash (path) {    if (supportsPushState) {      replaceState(getUrl(path));    } else {      window.location.replace(getUrl(path));    }  }  /*  */  var AbstractHistory = /*@__PURE__*/(function (History) {    function AbstractHistory (router, base) {      History.call(this, router, base);      this.stack = [];      this.index = -1;    }    if ( History ) AbstractHistory.__proto__ = History;    AbstractHistory.prototype = Object.create( History && History.prototype );    AbstractHistory.prototype.constructor = AbstractHistory;    AbstractHistory.prototype.push = function push (location, onComplete, onAbort) {      var this$1$1 = this;      this.transitionTo(        location,        function (route) {          this$1$1.stack = this$1$1.stack.slice(0, this$1$1.index + 1).concat(route);          this$1$1.index++;          onComplete && onComplete(route);        },        onAbort      );    };    AbstractHistory.prototype.replace = function replace (location, onComplete, onAbort) {      var this$1$1 = this;      this.transitionTo(        location,        function (route) {          this$1$1.stack = this$1$1.stack.slice(0, this$1$1.index).concat(route);          onComplete && onComplete(route);        },        onAbort      );    };    AbstractHistory.prototype.go = function go (n) {      var this$1$1 = this;      var targetIndex = this.index + n;      if (targetIndex < 0 || targetIndex >= this.stack.length) {        return      }      var route = this.stack[targetIndex];      this.confirmTransition(        route,        function () {          var prev = this$1$1.current;          this$1$1.index = targetIndex;          this$1$1.updateRoute(route);          this$1$1.router.afterHooks.forEach(function (hook) {            hook && hook(route, prev);          });        },        function (err) {          if (isNavigationFailure(err, NavigationFailureType.duplicated)) {            this$1$1.index = targetIndex;          }        }      );    };    AbstractHistory.prototype.getCurrentLocation = function getCurrentLocation () {      var current = this.stack[this.stack.length - 1];      return current ? current.fullPath : '/'    };    AbstractHistory.prototype.ensureURL = function ensureURL () {      // noop    };    return AbstractHistory;  }(History));  /*  */  var VueRouter = function VueRouter (options) {    if ( options === void 0 ) options = {};    {      warn(this instanceof VueRouter, "Router must be called with the new operator.");    }    this.app = null;    this.apps = [];    this.options = options;    this.beforeHooks = [];    this.resolveHooks = [];    this.afterHooks = [];    this.matcher = createMatcher(options.routes || [], this);    var mode = options.mode || 'hash';    this.fallback =      mode === 'history' && !supportsPushState && options.fallback !== false;    if (this.fallback) {      mode = 'hash';    }    if (!inBrowser) {      mode = 'abstract';    }    this.mode = mode;    switch (mode) {      case 'history':        this.history = new HTML5History(this, options.base);        break      case 'hash':        this.history = new HashHistory(this, options.base, this.fallback);        break      case 'abstract':        this.history = new AbstractHistory(this, options.base);        break      default:        {          assert(false, ("invalid mode: " + mode));        }    }  };  var prototypeAccessors = { currentRoute: { configurable: true } };  VueRouter.prototype.match = function match (raw, current, redirectedFrom) {    return this.matcher.match(raw, current, redirectedFrom)  };  prototypeAccessors.currentRoute.get = function () {    return this.history && this.history.current  };  VueRouter.prototype.init = function init (app /* Vue component instance */) {      var this$1$1 = this;    assert(        install.installed,        "not installed. Make sure to call `Vue.use(VueRouter)` " +          "before creating root instance."      );    this.apps.push(app);    // set up app destroyed handler    // https://github.com/vuejs/vue-router/issues/2639    app.$once('hook:destroyed', function () {      // clean out app from this.apps array once destroyed      var index = this$1$1.apps.indexOf(app);      if (index > -1) { this$1$1.apps.splice(index, 1); }      // ensure we still have a main app or null if no apps      // we do not release the router so it can be reused      if (this$1$1.app === app) { this$1$1.app = this$1$1.apps[0] || null; }      if (!this$1$1.app) { this$1$1.history.teardown(); }    });    // main app previously initialized    // return as we don't need to set up new history listener    if (this.app) {      return    }    this.app = app;    var history = this.history;    if (history instanceof HTML5History || history instanceof HashHistory) {      var handleInitialScroll = function (routeOrError) {        var from = history.current;        var expectScroll = this$1$1.options.scrollBehavior;        var supportsScroll = supportsPushState && expectScroll;        if (supportsScroll && 'fullPath' in routeOrError) {          handleScroll(this$1$1, routeOrError, from, false);        }      };      var setupListeners = function (routeOrError) {        history.setupListeners();        handleInitialScroll(routeOrError);      };      history.transitionTo(        history.getCurrentLocation(),        setupListeners,        setupListeners      );    }    history.listen(function (route) {      this$1$1.apps.forEach(function (app) {        app._route = route;      });    });  };  VueRouter.prototype.beforeEach = function beforeEach (fn) {    return registerHook(this.beforeHooks, fn)  };  VueRouter.prototype.beforeResolve = function beforeResolve (fn) {    return registerHook(this.resolveHooks, fn)  };  VueRouter.prototype.afterEach = function afterEach (fn) {    return registerHook(this.afterHooks, fn)  };  VueRouter.prototype.onReady = function onReady (cb, errorCb) {    this.history.onReady(cb, errorCb);  };  VueRouter.prototype.onError = function onError (errorCb) {    this.history.onError(errorCb);  };  VueRouter.prototype.push = function push (location, onComplete, onAbort) {      var this$1$1 = this;    // $flow-disable-line    if (!onComplete && !onAbort && typeof Promise !== 'undefined') {      return new Promise(function (resolve, reject) {        this$1$1.history.push(location, resolve, reject);      })    } else {      this.history.push(location, onComplete, onAbort);    }  };  VueRouter.prototype.replace = function replace (location, onComplete, onAbort) {      var this$1$1 = this;    // $flow-disable-line    if (!onComplete && !onAbort && typeof Promise !== 'undefined') {      return new Promise(function (resolve, reject) {        this$1$1.history.replace(location, resolve, reject);      })    } else {      this.history.replace(location, onComplete, onAbort);    }  };  VueRouter.prototype.go = function go (n) {    this.history.go(n);  };  VueRouter.prototype.back = function back () {    this.go(-1);  };  VueRouter.prototype.forward = function forward () {    this.go(1);  };  VueRouter.prototype.getMatchedComponents = function getMatchedComponents (to) {    var route = to      ? to.matched        ? to        : this.resolve(to).route      : this.currentRoute;    if (!route) {      return []    }    return [].concat.apply(      [],      route.matched.map(function (m) {        return Object.keys(m.components).map(function (key) {          return m.components[key]        })      })    )  };  VueRouter.prototype.resolve = function resolve (    to,    current,    append  ) {    current = current || this.history.current;    var location = normalizeLocation(to, current, append, this);    var route = this.match(location, current);    var fullPath = route.redirectedFrom || route.fullPath;    var base = this.history.base;    var href = createHref(base, fullPath, this.mode);    return {      location: location,      route: route,      href: href,      // for backwards compat      normalizedTo: location,      resolved: route    }  };  VueRouter.prototype.getRoutes = function getRoutes () {    return this.matcher.getRoutes()  };  VueRouter.prototype.addRoute = function addRoute (parentOrRoute, route) {    this.matcher.addRoute(parentOrRoute, route);    if (this.history.current !== START) {      this.history.transitionTo(this.history.getCurrentLocation());    }  };  VueRouter.prototype.addRoutes = function addRoutes (routes) {    {      warn(false, 'router.addRoutes() is deprecated and has been removed in Vue Router 4. Use router.addRoute() instead.');    }    this.matcher.addRoutes(routes);    if (this.history.current !== START) {      this.history.transitionTo(this.history.getCurrentLocation());    }  };  Object.defineProperties( VueRouter.prototype, prototypeAccessors );  var VueRouter$1 = VueRouter;  function registerHook (list, fn) {    list.push(fn);    return function () {      var i = list.indexOf(fn);      if (i > -1) { list.splice(i, 1); }    }  }  function createHref (base, fullPath, mode) {    var path = mode === 'hash' ? '#' + fullPath : fullPath;    return base ? cleanPath(base + '/' + path) : path  }  // We cannot remove this as it would be a breaking change  VueRouter.install = install;  VueRouter.version = '3.6.5';  VueRouter.isNavigationFailure = isNavigationFailure;  VueRouter.NavigationFailureType = NavigationFailureType;  VueRouter.START_LOCATION = START;  if (inBrowser && window.Vue) {    window.Vue.use(VueRouter);  }  return VueRouter$1;}));
 |