mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 lines
564 KiB
1 lines
564 KiB
{"version":3,"file":"_router-chunk.mjs","sources":["../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/shared.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/utils/first_value_from.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/utils/collection.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/url_tree.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/create_url_tree.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/events.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/router_outlet_context.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/utils/tree.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/router_state.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/directives/router_outlet.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/components/empty_outlet.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/create_router_state.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/models.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/navigation_canceling_error.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/operators/activate_routes.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/utils/preactivation.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/utils/type_guards.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/operators/prioritized_guard_value.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/utils/abort_signal_to_observable.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/operators/check_guards.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/apply_redirects.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/utils/config.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/utils/config_matching.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/recognize.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/operators/recognize.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/operators/resolve_data.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/operators/switch_tap.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/page_title_strategy.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/router_config.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/router_config_loader.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/url_handling_strategy.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/utils/view_transition.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/navigation_transition.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/route_injector_cleanup.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/route_reuse_strategy.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/statemanager/state_manager.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/utils/navigations.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/router/src/router.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {Route, UrlMatchResult} from './models';\nimport type {UrlSegment, UrlSegmentGroup} from './url_tree';\n\n/**\n * The primary routing outlet.\n *\n * @publicApi\n */\nexport const PRIMARY_OUTLET = 'primary';\n\n/**\n * A private symbol used to store the value of `Route.title` inside the `Route.data` if it is a\n * static string or `Route.resolve` if anything else. This allows us to reuse the existing route\n * data/resolvers to support the title feature without new instrumentation in the `Router` pipeline.\n */\nexport const RouteTitleKey: unique symbol = /* @__PURE__ */ Symbol('RouteTitle');\n\n/**\n * A collection of matrix and query URL parameters.\n * @see {@link convertToParamMap}\n * @see {@link ParamMap}\n *\n * @publicApi\n */\nexport type Params = {\n [key: string]: any;\n};\n\n/**\n * A map that provides access to the required and optional parameters\n * specific to a route.\n * The map supports retrieving a single value with `get()`\n * or multiple values with `getAll()`.\n *\n * @see [URLSearchParams](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams)\n *\n * @publicApi\n */\nexport interface ParamMap {\n /**\n * Reports whether the map contains a given parameter.\n * @param name The parameter name.\n * @returns True if the map contains the given parameter, false otherwise.\n */\n has(name: string): boolean;\n /**\n * Retrieves a single value for a parameter.\n * @param name The parameter name.\n * @return The parameter's single value,\n * or the first value if the parameter has multiple values,\n * or `null` when there is no such parameter.\n */\n get(name: string): string | null;\n /**\n * Retrieves multiple values for a parameter.\n * @param name The parameter name.\n * @return An array containing one or more values,\n * or an empty array if there is no such parameter.\n *\n */\n getAll(name: string): string[];\n\n /** Names of the parameters in the map. */\n readonly keys: string[];\n}\n\nclass ParamsAsMap implements ParamMap {\n private params: Params;\n\n constructor(params: Params) {\n this.params = params || {};\n }\n\n has(name: string): boolean {\n return Object.prototype.hasOwnProperty.call(this.params, name);\n }\n\n get(name: string): string | null {\n if (this.has(name)) {\n const v = this.params[name];\n return Array.isArray(v) ? v[0] : v;\n }\n\n return null;\n }\n\n getAll(name: string): string[] {\n if (this.has(name)) {\n const v = this.params[name];\n return Array.isArray(v) ? v : [v];\n }\n\n return [];\n }\n\n get keys(): string[] {\n return Object.keys(this.params);\n }\n}\n\n/**\n * Converts a `Params` instance to a `ParamMap`.\n * @param params The instance to convert.\n * @returns The new map instance.\n *\n * @publicApi\n */\nexport function convertToParamMap(params: Params): ParamMap {\n return new ParamsAsMap(params);\n}\n\nfunction matchParts(\n routeParts: string[],\n urlSegments: UrlSegment[],\n posParams: {[key: string]: UrlSegment},\n): boolean {\n for (let i = 0; i < routeParts.length; i++) {\n const part = routeParts[i];\n const segment = urlSegments[i];\n const isParameter = part[0] === ':';\n if (isParameter) {\n posParams[part.substring(1)] = segment;\n } else if (part !== segment.path) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Matches the route configuration (`route`) against the actual URL (`segments`).\n *\n * When no matcher is defined on a `Route`, this is the matcher used by the Router by default.\n *\n * @param segments The remaining unmatched segments in the current navigation\n * @param segmentGroup The current segment group being matched\n * @param route The `Route` to match against.\n *\n * @see {@link UrlMatchResult}\n * @see {@link Route}\n *\n * @returns The resulting match information or `null` if the `route` should not match.\n * @publicApi\n */\nexport function defaultUrlMatcher(\n segments: UrlSegment[],\n segmentGroup: UrlSegmentGroup,\n route: Route,\n): UrlMatchResult | null {\n const parts = route.path!.split('/');\n const wildcardIndex = parts.indexOf('**');\n if (wildcardIndex === -1) {\n // No wildcard, use original logic\n if (parts.length > segments.length) {\n // The actual URL is shorter than the config, no match\n return null;\n }\n\n if (\n route.pathMatch === 'full' &&\n (segmentGroup.hasChildren() || parts.length < segments.length)\n ) {\n // The config is longer than the actual URL but we are looking for a full match, return null\n return null;\n }\n\n const posParams: {[key: string]: UrlSegment} = {};\n const consumed = segments.slice(0, parts.length);\n if (!matchParts(parts, consumed, posParams)) {\n return null;\n }\n return {consumed, posParams};\n }\n\n // Path has a wildcard.\n if (wildcardIndex !== parts.lastIndexOf('**')) {\n // We do not support more than one wildcard segment in the path\n return null;\n }\n\n const pre = parts.slice(0, wildcardIndex);\n const post = parts.slice(wildcardIndex + 1);\n\n if (pre.length + post.length > segments.length) {\n // The actual URL is shorter than the config, no match\n return null;\n }\n\n if (route.pathMatch === 'full' && segmentGroup.hasChildren() && route.path !== '**') {\n // The config is longer than the actual URL but we are looking for a full match, return null\n return null;\n }\n\n const posParams: {[key: string]: UrlSegment} = {};\n\n // Match the segments before the wildcard\n if (!matchParts(pre, segments.slice(0, pre.length), posParams)) {\n return null;\n }\n // Match the segments after the wildcard\n if (!matchParts(post, segments.slice(segments.length - post.length), posParams)) {\n return null;\n }\n\n // TODO(atscott): put the wildcard segments into a _splat param.\n // this would require a breaking change to the UrlMatchResult to allow UrlSegment[]\n // since the splat could be multiple segments.\n\n return {consumed: segments, posParams};\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Observable} from 'rxjs';\nimport {first} from 'rxjs/operators';\n\n/** replacement for firstValueFrom in rxjs 7. We must support rxjs v6 so we cannot use it */\nexport function firstValueFrom<T>(source: Observable<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n source.pipe(first()).subscribe({\n next: (value) => resolve(value),\n error: (err) => reject(err),\n });\n });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ɵisPromise as isPromise} from '@angular/core';\nimport {from, isObservable, Observable, of} from 'rxjs';\nimport {firstValueFrom} from './first_value_from';\n\nexport function shallowEqualArrays(a: readonly any[], b: readonly any[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; ++i) {\n if (!shallowEqual(a[i], b[i])) return false;\n }\n return true;\n}\n\nexport function shallowEqual(\n a: {[key: string | symbol]: any},\n b: {[key: string | symbol]: any},\n): boolean {\n // While `undefined` should never be possible, it would sometimes be the case in IE 11\n // and pre-chromium Edge. The check below accounts for this edge case.\n const k1 = a ? getDataKeys(a) : undefined;\n const k2 = b ? getDataKeys(b) : undefined;\n if (!k1 || !k2 || k1.length != k2.length) {\n return false;\n }\n let key: string | symbol;\n for (let i = 0; i < k1.length; i++) {\n key = k1[i];\n if (!equalArraysOrString(a[key], b[key])) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Gets the keys of an object, including `symbol` keys.\n */\nexport function getDataKeys(obj: Object): Array<string | symbol> {\n return [...Object.keys(obj), ...Object.getOwnPropertySymbols(obj)];\n}\n\n/**\n * Test equality for arrays of strings or a string.\n */\nexport function equalArraysOrString(\n a: string | readonly string[],\n b: string | readonly string[],\n): boolean {\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n const aSorted = [...a].sort();\n const bSorted = [...b].sort();\n return aSorted.every((val, index) => bSorted[index] === val);\n } else {\n return a === b;\n }\n}\n\n/**\n * Return the last element of an array.\n */\nexport function last<T>(a: readonly T[]): T | null {\n return a.length > 0 ? a[a.length - 1] : null;\n}\n\nexport function wrapIntoObservable<T>(value: T | Promise<T> | Observable<T>): Observable<T> {\n if (isObservable(value)) {\n return value;\n }\n\n if (isPromise(value)) {\n // Use `Promise.resolve()` to wrap promise-like instances.\n // Required ie when a Resolver returns a AngularJS `$q` promise to correctly trigger the\n // change detection.\n return from(Promise.resolve(value));\n }\n\n return of(value);\n}\n\nexport function wrapIntoPromise<T>(value: T | Promise<T> | Observable<T>): Promise<T> {\n if (isObservable(value)) {\n return firstValueFrom(value);\n }\n return Promise.resolve(value);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {computed, Injectable, ɵRuntimeError as RuntimeError, Signal} from '@angular/core';\n\nimport {RuntimeErrorCode} from './errors';\nimport {convertToParamMap, ParamMap, Params, PRIMARY_OUTLET} from './shared';\nimport {equalArraysOrString, shallowEqual} from './utils/collection';\nimport type {Router} from './router';\n\n/**\n * A set of options which specify how to determine if a `UrlTree` is active, given the `UrlTree`\n * for the current router state.\n *\n * @publicApi\n * @see {@link isActive}\n */\nexport interface IsActiveMatchOptions {\n /**\n * Defines the strategy for comparing the matrix parameters of two `UrlTree`s.\n *\n * The matrix parameter matching is dependent on the strategy for matching the\n * segments. That is, if the `paths` option is set to `'subset'`, only\n * the matrix parameters of the matching segments will be compared.\n *\n * - `'exact'`: Requires that matching segments also have exact matrix parameter\n * matches.\n * - `'subset'`: The matching segments in the router's active `UrlTree` may contain\n * extra matrix parameters, but those that exist in the `UrlTree` in question must match.\n * - `'ignored'`: When comparing `UrlTree`s, matrix params will be ignored.\n */\n matrixParams: 'exact' | 'subset' | 'ignored';\n /**\n * Defines the strategy for comparing the query parameters of two `UrlTree`s.\n *\n * - `'exact'`: the query parameters must match exactly.\n * - `'subset'`: the active `UrlTree` may contain extra parameters,\n * but must match the key and value of any that exist in the `UrlTree` in question.\n * - `'ignored'`: When comparing `UrlTree`s, query params will be ignored.\n */\n queryParams: 'exact' | 'subset' | 'ignored';\n /**\n * Defines the strategy for comparing the `UrlSegment`s of the `UrlTree`s.\n *\n * - `'exact'`: all segments in each `UrlTree` must match.\n * - `'subset'`: a `UrlTree` will be determined to be active if it\n * is a subtree of the active route. That is, the active route may contain extra\n * segments, but must at least have all the segments of the `UrlTree` in question.\n */\n paths: 'exact' | 'subset';\n /**\n * - `'exact'`: indicates that the `UrlTree` fragments must be equal.\n * - `'ignored'`: the fragments will not be compared when determining if a\n * `UrlTree` is active.\n */\n fragment: 'exact' | 'ignored';\n}\n\ntype ParamMatchOptions = 'exact' | 'subset' | 'ignored';\n\ntype PathCompareFn = (\n container: UrlSegmentGroup,\n containee: UrlSegmentGroup,\n matrixParams: ParamMatchOptions,\n) => boolean;\ntype ParamCompareFn = (container: Params, containee: Params) => boolean;\n\nconst pathCompareMap: Record<IsActiveMatchOptions['paths'], PathCompareFn> = {\n 'exact': equalSegmentGroups,\n 'subset': containsSegmentGroup,\n};\nconst paramCompareMap: Record<ParamMatchOptions, ParamCompareFn> = {\n 'exact': equalParams,\n 'subset': containsParams,\n 'ignored': () => true,\n};\n\n/**\n * Returns a computed signal of whether the given url is activated in the Router.\n *\n * As the router state changes, the signal will update to reflect whether the url is active.\n *\n * @see [Check if a URL is active](guide/routing/read-route-state#check-if-a-url-is-active)\n * @publicApi 21.1\n */\nexport function isActive(\n url: string | UrlTree,\n router: Router,\n matchOptions: IsActiveMatchOptions,\n): Signal<boolean> {\n const urlTree = url instanceof UrlTree ? url : router.parseUrl(url);\n return computed(() =>\n containsTree(\n router.lastSuccessfulNavigation()?.finalUrl ?? new UrlTree(),\n urlTree,\n matchOptions,\n ),\n );\n}\n\nexport function containsTree(\n container: UrlTree,\n containee: UrlTree,\n options: IsActiveMatchOptions,\n): boolean {\n return (\n pathCompareMap[options.paths](container.root, containee.root, options.matrixParams) &&\n paramCompareMap[options.queryParams](container.queryParams, containee.queryParams) &&\n !(options.fragment === 'exact' && container.fragment !== containee.fragment)\n );\n}\n\nfunction equalParams(container: Params, containee: Params): boolean {\n // TODO: This does not handle array params correctly.\n return shallowEqual(container, containee);\n}\n\nfunction equalSegmentGroups(\n container: UrlSegmentGroup,\n containee: UrlSegmentGroup,\n matrixParams: ParamMatchOptions,\n): boolean {\n if (!equalPath(container.segments, containee.segments)) return false;\n if (!matrixParamsMatch(container.segments, containee.segments, matrixParams)) {\n return false;\n }\n if (container.numberOfChildren !== containee.numberOfChildren) return false;\n for (const c in containee.children) {\n if (!container.children[c]) return false;\n if (!equalSegmentGroups(container.children[c], containee.children[c], matrixParams))\n return false;\n }\n return true;\n}\n\nfunction containsParams(container: Params, containee: Params): boolean {\n return (\n Object.keys(containee).length <= Object.keys(container).length &&\n Object.keys(containee).every((key) => equalArraysOrString(container[key], containee[key]))\n );\n}\n\nfunction containsSegmentGroup(\n container: UrlSegmentGroup,\n containee: UrlSegmentGroup,\n matrixParams: ParamMatchOptions,\n): boolean {\n return containsSegmentGroupHelper(container, containee, containee.segments, matrixParams);\n}\n\nfunction containsSegmentGroupHelper(\n container: UrlSegmentGroup,\n containee: UrlSegmentGroup,\n containeePaths: UrlSegment[],\n matrixParams: ParamMatchOptions,\n): boolean {\n if (container.segments.length > containeePaths.length) {\n const current = container.segments.slice(0, containeePaths.length);\n if (!equalPath(current, containeePaths)) return false;\n if (containee.hasChildren()) return false;\n if (!matrixParamsMatch(current, containeePaths, matrixParams)) return false;\n return true;\n } else if (container.segments.length === containeePaths.length) {\n if (!equalPath(container.segments, containeePaths)) return false;\n if (!matrixParamsMatch(container.segments, containeePaths, matrixParams)) return false;\n for (const c in containee.children) {\n if (!container.children[c]) return false;\n if (!containsSegmentGroup(container.children[c], containee.children[c], matrixParams)) {\n return false;\n }\n }\n return true;\n } else {\n const current = containeePaths.slice(0, container.segments.length);\n const next = containeePaths.slice(container.segments.length);\n if (!equalPath(container.segments, current)) return false;\n if (!matrixParamsMatch(container.segments, current, matrixParams)) return false;\n if (!container.children[PRIMARY_OUTLET]) return false;\n return containsSegmentGroupHelper(\n container.children[PRIMARY_OUTLET],\n containee,\n next,\n matrixParams,\n );\n }\n}\n\nfunction matrixParamsMatch(\n containerPaths: UrlSegment[],\n containeePaths: UrlSegment[],\n options: ParamMatchOptions,\n) {\n return containeePaths.every((containeeSegment, i) => {\n return paramCompareMap[options](containerPaths[i].parameters, containeeSegment.parameters);\n });\n}\n\n/**\n * @description\n *\n * Represents the parsed URL.\n *\n * Since a router state is a tree, and the URL is nothing but a serialized state, the URL is a\n * serialized tree.\n * UrlTree is a data structure that provides a lot of affordances in dealing with URLs\n *\n * @usageNotes\n * ### Example\n *\n * ```ts\n * @Component({templateUrl:'template.html'})\n * class MyComponent {\n * constructor(router: Router) {\n * const tree: UrlTree =\n * router.parseUrl('/team/33/(user/victor//support:help)?debug=true#fragment');\n * const f = tree.fragment; // return 'fragment'\n * const q = tree.queryParams; // returns {debug: 'true'}\n * const g: UrlSegmentGroup = tree.root.children[PRIMARY_OUTLET];\n * const s: UrlSegment[] = g.segments; // returns 2 segments 'team' and '33'\n * g.children[PRIMARY_OUTLET].segments; // returns 2 segments 'user' and 'victor'\n * g.children['support'].segments; // return 1 segment 'help'\n * }\n * }\n * ```\n *\n * @publicApi\n */\nexport class UrlTree {\n /** @internal */\n _queryParamMap?: ParamMap;\n\n constructor(\n /** The root segment group of the URL tree */\n public root: UrlSegmentGroup = new UrlSegmentGroup([], {}),\n /** The query params of the URL */\n public queryParams: Params = {},\n /** The fragment of the URL */\n public fragment: string | null = null,\n ) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (root.segments.length > 0) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROOT_URL_SEGMENT,\n 'The root `UrlSegmentGroup` should not contain `segments`. ' +\n 'Instead, these segments belong in the `children` so they can be associated with a named outlet.',\n );\n }\n }\n }\n\n get queryParamMap(): ParamMap {\n this._queryParamMap ??= convertToParamMap(this.queryParams);\n return this._queryParamMap;\n }\n\n /** @docsNotRequired */\n toString(): string {\n return DEFAULT_SERIALIZER.serialize(this);\n }\n}\n\n/**\n * @description\n *\n * Represents the parsed URL segment group.\n *\n * See `UrlTree` for more information.\n *\n * @publicApi\n */\nexport class UrlSegmentGroup {\n /** The parent node in the url tree */\n parent: UrlSegmentGroup | null = null;\n\n constructor(\n /** The URL segments of this group. See `UrlSegment` for more information */\n public segments: UrlSegment[],\n /** The list of children of this group */\n public children: {[key: string]: UrlSegmentGroup},\n ) {\n Object.values(children).forEach((v) => (v.parent = this));\n }\n\n /** Whether the segment has child segments */\n hasChildren(): boolean {\n return this.numberOfChildren > 0;\n }\n\n /** Number of child segments */\n get numberOfChildren(): number {\n return Object.keys(this.children).length;\n }\n\n /** @docsNotRequired */\n toString(): string {\n return serializePaths(this);\n }\n}\n\n/**\n * @description\n *\n * Represents a single URL segment.\n *\n * A UrlSegment is a part of a URL between the two slashes. It contains a path and the matrix\n * parameters associated with the segment.\n *\n * @usageNotes\n * ### Example\n *\n * ```ts\n * @Component({templateUrl:'template.html'})\n * class MyComponent {\n * constructor(router: Router) {\n * const tree: UrlTree = router.parseUrl('/team;id=33');\n * const g: UrlSegmentGroup = tree.root.children[PRIMARY_OUTLET];\n * const s: UrlSegment[] = g.segments;\n * s[0].path; // returns 'team'\n * s[0].parameters; // returns {id: 33}\n * }\n * }\n * ```\n *\n * @publicApi\n */\nexport class UrlSegment {\n /** @internal */\n _parameterMap?: ParamMap;\n\n constructor(\n /** The path part of a URL segment */\n public path: string,\n\n /** The matrix parameters associated with a segment */\n public parameters: {[name: string]: string},\n ) {}\n\n get parameterMap(): ParamMap {\n this._parameterMap ??= convertToParamMap(this.parameters);\n return this._parameterMap;\n }\n\n /** @docsNotRequired */\n toString(): string {\n return serializePath(this);\n }\n}\n\nexport function equalSegments(as: UrlSegment[], bs: UrlSegment[]): boolean {\n return equalPath(as, bs) && as.every((a, i) => shallowEqual(a.parameters, bs[i].parameters));\n}\n\nexport function equalPath(as: UrlSegment[], bs: UrlSegment[]): boolean {\n if (as.length !== bs.length) return false;\n return as.every((a, i) => a.path === bs[i].path);\n}\n\nexport function mapChildrenIntoArray<T>(\n segment: UrlSegmentGroup,\n fn: (v: UrlSegmentGroup, k: string) => T[],\n): T[] {\n let res: T[] = [];\n Object.entries(segment.children).forEach(([childOutlet, child]) => {\n if (childOutlet === PRIMARY_OUTLET) {\n res = res.concat(fn(child, childOutlet));\n }\n });\n Object.entries(segment.children).forEach(([childOutlet, child]) => {\n if (childOutlet !== PRIMARY_OUTLET) {\n res = res.concat(fn(child, childOutlet));\n }\n });\n return res;\n}\n\n/**\n * @description\n *\n * Serializes and deserializes a URL string into a URL tree.\n *\n * The url serialization strategy is customizable. You can\n * make all URLs case insensitive by providing a custom UrlSerializer.\n *\n * See `DefaultUrlSerializer` for an example of a URL serializer.\n *\n * @publicApi\n */\n@Injectable({providedIn: 'root', useFactory: () => new DefaultUrlSerializer()})\nexport abstract class UrlSerializer {\n /** Parse a url into a `UrlTree` */\n abstract parse(url: string): UrlTree;\n\n /** Converts a `UrlTree` into a url */\n abstract serialize(tree: UrlTree): string;\n}\n\n/**\n * @description\n *\n * A default implementation of the `UrlSerializer`.\n *\n * Example URLs:\n *\n * ```\n * /inbox/33(popup:compose)\n * /inbox/33;open=true/messages/44\n * ```\n *\n * DefaultUrlSerializer uses parentheses to serialize secondary segments (e.g., popup:compose), the\n * colon syntax to specify the outlet, and the ';parameter=value' syntax (e.g., open=true) to\n * specify route specific parameters.\n *\n * @publicApi\n */\nexport class DefaultUrlSerializer implements UrlSerializer {\n /** Parses a url into a `UrlTree` */\n parse(url: string): UrlTree {\n const p = new UrlParser(url);\n return new UrlTree(p.parseRootSegment(), p.parseQueryParams(), p.parseFragment());\n }\n\n /** Converts a `UrlTree` into a url */\n serialize(tree: UrlTree): string {\n const segment = `/${serializeSegment(tree.root, true)}`;\n const query = serializeQueryParams(tree.queryParams);\n const fragment =\n typeof tree.fragment === `string` ? `#${encodeUriFragment(tree.fragment)}` : '';\n\n return `${segment}${query}${fragment}`;\n }\n}\n\nconst DEFAULT_SERIALIZER = new DefaultUrlSerializer();\n\nexport function serializePaths(segment: UrlSegmentGroup): string {\n return segment.segments.map((p) => serializePath(p)).join('/');\n}\n\nfunction serializeSegment(segment: UrlSegmentGroup, root: boolean): string {\n if (!segment.hasChildren()) {\n return serializePaths(segment);\n }\n\n if (root) {\n const primary = segment.children[PRIMARY_OUTLET]\n ? serializeSegment(segment.children[PRIMARY_OUTLET], false)\n : '';\n const children: string[] = [];\n\n Object.entries(segment.children).forEach(([k, v]) => {\n if (k !== PRIMARY_OUTLET) {\n children.push(`${k}:${serializeSegment(v, false)}`);\n }\n });\n\n return children.length > 0 ? `${primary}(${children.join('//')})` : primary;\n } else {\n const children = mapChildrenIntoArray(segment, (v: UrlSegmentGroup, k: string) => {\n if (k === PRIMARY_OUTLET) {\n return [serializeSegment(segment.children[PRIMARY_OUTLET], false)];\n }\n\n return [`${k}:${serializeSegment(v, false)}`];\n });\n\n // use no parenthesis if the only child is a primary outlet route\n if (Object.keys(segment.children).length === 1 && segment.children[PRIMARY_OUTLET] != null) {\n return `${serializePaths(segment)}/${children[0]}`;\n }\n\n return `${serializePaths(segment)}/(${children.join('//')})`;\n }\n}\n\n/**\n * Encodes a URI string with the default encoding. This function will only ever be called from\n * `encodeUriQuery` or `encodeUriSegment` as it's the base set of encodings to be used. We need\n * a custom encoding because encodeURIComponent is too aggressive and encodes stuff that doesn't\n * have to be encoded per https://url.spec.whatwg.org.\n */\nfunction encodeUriString(s: string): string {\n return encodeURIComponent(s)\n .replace(/%40/g, '@')\n .replace(/%3A/gi, ':')\n .replace(/%24/g, '$')\n .replace(/%2C/gi, ',');\n}\n\n/**\n * This function should be used to encode both keys and values in a query string key/value. In\n * the following URL, you need to call encodeUriQuery on \"k\" and \"v\":\n *\n * http://www.site.org/html;mk=mv?k=v#f\n */\nexport function encodeUriQuery(s: string): string {\n return encodeUriString(s).replace(/%3B/gi, ';');\n}\n\n/**\n * This function should be used to encode a URL fragment. In the following URL, you need to call\n * encodeUriFragment on \"f\":\n *\n * http://www.site.org/html;mk=mv?k=v#f\n */\nexport function encodeUriFragment(s: string): string {\n return encodeURI(s);\n}\n\n/**\n * This function should be run on any URI segment as well as the key and value in a key/value\n * pair for matrix params. In the following URL, you need to call encodeUriSegment on \"html\",\n * \"mk\", and \"mv\":\n *\n * http://www.site.org/html;mk=mv?k=v#f\n */\nexport function encodeUriSegment(s: string): string {\n return encodeUriString(s).replace(/\\(/g, '%28').replace(/\\)/g, '%29').replace(/%26/gi, '&');\n}\n\nexport function decode(s: string): string {\n return decodeURIComponent(s);\n}\n\n// Query keys/values should have the \"+\" replaced first, as \"+\" in a query string is \" \".\n// decodeURIComponent function will not decode \"+\" as a space.\nexport function decodeQuery(s: string): string {\n return decode(s.replace(/\\+/g, '%20'));\n}\n\nexport function serializePath(path: UrlSegment): string {\n return `${encodeUriSegment(path.path)}${serializeMatrixParams(path.parameters)}`;\n}\n\nfunction serializeMatrixParams(params: {[key: string]: string}): string {\n return Object.entries(params)\n .map(([key, value]) => `;${encodeUriSegment(key)}=${encodeUriSegment(value)}`)\n .join('');\n}\n\nfunction serializeQueryParams(params: {[key: string]: any}): string {\n const strParams: string[] = Object.entries(params)\n .map(([name, value]) => {\n return Array.isArray(value)\n ? value.map((v) => `${encodeUriQuery(name)}=${encodeUriQuery(v)}`).join('&')\n : `${encodeUriQuery(name)}=${encodeUriQuery(value)}`;\n })\n .filter((s) => s);\n\n return strParams.length ? `?${strParams.join('&')}` : '';\n}\n\nconst SEGMENT_RE = /^[^\\/()?;#]+/;\nfunction matchSegments(str: string): string {\n const match = str.match(SEGMENT_RE);\n return match ? match[0] : '';\n}\n\nconst MATRIX_PARAM_SEGMENT_RE = /^[^\\/()?;=#]+/;\nfunction matchMatrixKeySegments(str: string): string {\n const match = str.match(MATRIX_PARAM_SEGMENT_RE);\n return match ? match[0] : '';\n}\n\nconst QUERY_PARAM_RE = /^[^=?&#]+/;\n// Return the name of the query param at the start of the string or an empty string\nfunction matchQueryParams(str: string): string {\n const match = str.match(QUERY_PARAM_RE);\n return match ? match[0] : '';\n}\n\nconst QUERY_PARAM_VALUE_RE = /^[^&#]+/;\n// Return the value of the query param at the start of the string or an empty string\nfunction matchUrlQueryParamValue(str: string): string {\n const match = str.match(QUERY_PARAM_VALUE_RE);\n return match ? match[0] : '';\n}\n\nclass UrlParser {\n private remaining: string;\n\n constructor(private url: string) {\n this.remaining = url;\n }\n\n parseRootSegment(): UrlSegmentGroup {\n this.consumeOptional('/');\n\n if (this.remaining === '' || this.peekStartsWith('?') || this.peekStartsWith('#')) {\n return new UrlSegmentGroup([], {});\n }\n\n // The root segment group never has segments\n return new UrlSegmentGroup([], this.parseChildren());\n }\n\n parseQueryParams(): Params {\n const params: Params = {};\n if (this.consumeOptional('?')) {\n do {\n this.parseQueryParam(params);\n } while (this.consumeOptional('&'));\n }\n return params;\n }\n\n parseFragment(): string | null {\n return this.consumeOptional('#') ? decodeURIComponent(this.remaining) : null;\n }\n\n private parseChildren(): {[outlet: string]: UrlSegmentGroup} {\n if (this.remaining === '') {\n return {};\n }\n\n this.consumeOptional('/');\n\n const segments: UrlSegment[] = [];\n if (!this.peekStartsWith('(')) {\n segments.push(this.parseSegment());\n }\n\n while (this.peekStartsWith('/') && !this.peekStartsWith('//') && !this.peekStartsWith('/(')) {\n this.capture('/');\n segments.push(this.parseSegment());\n }\n\n let children: {[outlet: string]: UrlSegmentGroup} = {};\n if (this.peekStartsWith('/(')) {\n this.capture('/');\n children = this.parseParens(true);\n }\n\n let res: {[outlet: string]: UrlSegmentGroup} = {};\n if (this.peekStartsWith('(')) {\n res = this.parseParens(false);\n }\n\n if (segments.length > 0 || Object.keys(children).length > 0) {\n res[PRIMARY_OUTLET] = new UrlSegmentGroup(segments, children);\n }\n\n return res;\n }\n\n // parse a segment with its matrix parameters\n // ie `name;k1=v1;k2`\n private parseSegment(): UrlSegment {\n const path = matchSegments(this.remaining);\n if (path === '' && this.peekStartsWith(';')) {\n throw new RuntimeError(\n RuntimeErrorCode.EMPTY_PATH_WITH_PARAMS,\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n `Empty path url segment cannot have parameters: '${this.remaining}'.`,\n );\n }\n\n this.capture(path);\n return new UrlSegment(decode(path), this.parseMatrixParams());\n }\n\n private parseMatrixParams(): {[key: string]: string} {\n const params: {[key: string]: string} = {};\n while (this.consumeOptional(';')) {\n this.parseParam(params);\n }\n return params;\n }\n\n private parseParam(params: {[key: string]: string}): void {\n const key = matchMatrixKeySegments(this.remaining);\n if (!key) {\n return;\n }\n this.capture(key);\n let value: any = '';\n if (this.consumeOptional('=')) {\n const valueMatch = matchSegments(this.remaining);\n if (valueMatch) {\n value = valueMatch;\n this.capture(value);\n }\n }\n\n params[decode(key)] = decode(value);\n }\n\n // Parse a single query parameter `name[=value]`\n private parseQueryParam(params: Params): void {\n const key = matchQueryParams(this.remaining);\n if (!key) {\n return;\n }\n this.capture(key);\n let value: any = '';\n if (this.consumeOptional('=')) {\n const valueMatch = matchUrlQueryParamValue(this.remaining);\n if (valueMatch) {\n value = valueMatch;\n this.capture(value);\n }\n }\n\n const decodedKey = decodeQuery(key);\n const decodedVal = decodeQuery(value);\n\n if (params.hasOwnProperty(decodedKey)) {\n // Append to existing values\n let currentVal = params[decodedKey];\n if (!Array.isArray(currentVal)) {\n currentVal = [currentVal];\n params[decodedKey] = currentVal;\n }\n currentVal.push(decodedVal);\n } else {\n // Create a new value\n params[decodedKey] = decodedVal;\n }\n }\n\n // parse `(a/b//outlet_name:c/d)`\n private parseParens(allowPrimary: boolean): {[outlet: string]: UrlSegmentGroup} {\n const segments: {[key: string]: UrlSegmentGroup} = {};\n this.capture('(');\n\n while (!this.consumeOptional(')') && this.remaining.length > 0) {\n const path = matchSegments(this.remaining);\n\n const next = this.remaining[path.length];\n\n // if is is not one of these characters, then the segment was unescaped\n // or the group was not closed\n if (next !== '/' && next !== ')' && next !== ';') {\n throw new RuntimeError(\n RuntimeErrorCode.UNPARSABLE_URL,\n (typeof ngDevMode === 'undefined' || ngDevMode) && `Cannot parse url '${this.url}'`,\n );\n }\n\n let outletName: string | undefined;\n if (path.indexOf(':') > -1) {\n outletName = path.slice(0, path.indexOf(':'));\n this.capture(outletName);\n this.capture(':');\n } else if (allowPrimary) {\n outletName = PRIMARY_OUTLET;\n }\n\n const children = this.parseChildren();\n segments[outletName ?? PRIMARY_OUTLET] =\n Object.keys(children).length === 1 && children[PRIMARY_OUTLET]\n ? children[PRIMARY_OUTLET]\n : new UrlSegmentGroup([], children);\n this.consumeOptional('//');\n }\n\n return segments;\n }\n\n private peekStartsWith(str: string): boolean {\n return this.remaining.startsWith(str);\n }\n\n // Consumes the prefix when it is present and returns whether it has been consumed\n private consumeOptional(str: string): boolean {\n if (this.peekStartsWith(str)) {\n this.remaining = this.remaining.substring(str.length);\n return true;\n }\n return false;\n }\n\n private capture(str: string): void {\n if (!this.consumeOptional(str)) {\n throw new RuntimeError(\n RuntimeErrorCode.UNEXPECTED_VALUE_IN_URL,\n (typeof ngDevMode === 'undefined' || ngDevMode) && `Expected \"${str}\".`,\n );\n }\n }\n}\n\nexport function createRoot(rootCandidate: UrlSegmentGroup): UrlSegmentGroup {\n return rootCandidate.segments.length > 0\n ? new UrlSegmentGroup([], {[PRIMARY_OUTLET]: rootCandidate})\n : rootCandidate;\n}\n\n/**\n * Recursively\n * - merges primary segment children into their parents\n * - drops empty children (those which have no segments and no children themselves). This latter\n * prevents serializing a group into something like `/a(aux:)`, where `aux` is an empty child\n * segment.\n * - merges named outlets without a primary segment sibling into the children. This prevents\n * serializing a URL like `//(a:a)(b:b) instead of `/(a:a//b:b)` when the aux b route lives on the\n * root but the `a` route lives under an empty path primary route.\n */\nexport function squashSegmentGroup(segmentGroup: UrlSegmentGroup): UrlSegmentGroup {\n const newChildren: Record<string, UrlSegmentGroup> = {};\n for (const [childOutlet, child] of Object.entries(segmentGroup.children)) {\n const childCandidate = squashSegmentGroup(child);\n // moves named children in an empty path primary child into this group\n if (\n childOutlet === PRIMARY_OUTLET &&\n childCandidate.segments.length === 0 &&\n childCandidate.hasChildren()\n ) {\n for (const [grandChildOutlet, grandChild] of Object.entries(childCandidate.children)) {\n newChildren[grandChildOutlet] = grandChild;\n }\n } // don't add empty children\n else if (childCandidate.segments.length > 0 || childCandidate.hasChildren()) {\n newChildren[childOutlet] = childCandidate;\n }\n }\n const s = new UrlSegmentGroup(segmentGroup.segments, newChildren);\n return mergeTrivialChildren(s);\n}\n\n/**\n * When possible, merges the primary outlet child into the parent `UrlSegmentGroup`.\n *\n * When a segment group has only one child which is a primary outlet, merges that child into the\n * parent. That is, the child segment group's segments are merged into the `s` and the child's\n * children become the children of `s`. Think of this like a 'squash', merging the child segment\n * group into the parent.\n */\nfunction mergeTrivialChildren(s: UrlSegmentGroup): UrlSegmentGroup {\n if (s.numberOfChildren === 1 && s.children[PRIMARY_OUTLET]) {\n const c = s.children[PRIMARY_OUTLET];\n return new UrlSegmentGroup(s.segments.concat(c.segments), c.children);\n }\n\n return s;\n}\n\nexport function isUrlTree(v: any): v is UrlTree {\n return v instanceof UrlTree;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ɵRuntimeError as RuntimeError} from '@angular/core';\n\nimport {RuntimeErrorCode} from './errors';\nimport {ActivatedRouteSnapshot} from './router_state';\nimport {Params, PRIMARY_OUTLET} from './shared';\nimport {\n createRoot,\n DefaultUrlSerializer,\n squashSegmentGroup,\n UrlSegment,\n UrlSegmentGroup,\n UrlSerializer,\n UrlTree,\n} from './url_tree';\nimport {last, shallowEqual} from './utils/collection';\n\n/**\n * Creates a `UrlTree` relative to an `ActivatedRouteSnapshot`.\n *\n * @publicApi\n *\n *\n * @param relativeTo The `ActivatedRouteSnapshot` to apply the commands to\n * @param commands An array of URL fragments with which to construct the new URL tree.\n * If the path is static, can be the literal URL string. For a dynamic path, pass an array of path\n * segments, followed by the parameters for each segment.\n * The fragments are applied to the one provided in the `relativeTo` parameter.\n * @param queryParams The query parameters for the `UrlTree`. `null` if the `UrlTree` does not have\n * any query parameters.\n * @param fragment The fragment for the `UrlTree`. `null` if the `UrlTree` does not have a fragment.\n * @param urlSerializer The `UrlSerializer` to use for handling query parameter normalization.\n * You should provide your application's custom `UrlSerializer` if one is configured to parse and\n * serialize query parameter values to and from objects other than strings/string arrays.\n *\n * @usageNotes\n *\n * ```ts\n * // create /team/33/user/11\n * createUrlTreeFromSnapshot(snapshot, ['/team', 33, 'user', 11]);\n *\n * // create /team/33;expand=true/user/11\n * createUrlTreeFromSnapshot(snapshot, ['/team', 33, {expand: true}, 'user', 11]);\n *\n * // you can collapse static segments like this (this works only with the first passed-in value):\n * createUrlTreeFromSnapshot(snapshot, ['/team/33/user', userId]);\n *\n * // If the first segment can contain slashes, and you do not want the router to split it,\n * // you can do the following:\n * createUrlTreeFromSnapshot(snapshot, [{segmentPath: '/one/two'}]);\n *\n * // create /team/33/(user/11//right:chat)\n * createUrlTreeFromSnapshot(snapshot, ['/team', 33, {outlets: {primary: 'user/11', right:\n * 'chat'}}], null, null);\n *\n * // remove the right secondary node\n * createUrlTreeFromSnapshot(snapshot, ['/team', 33, {outlets: {primary: 'user/11', right: null}}]);\n *\n * // For the examples below, assume the current URL is for the `/team/33/user/11` and the\n * `ActivatedRouteSnapshot` points to `user/11`:\n *\n * // navigate to /team/33/user/11/details\n * createUrlTreeFromSnapshot(snapshot, ['details']);\n *\n * // navigate to /team/33/user/22\n * createUrlTreeFromSnapshot(snapshot, ['../22']);\n *\n * // navigate to /team/44/user/22\n * createUrlTreeFromSnapshot(snapshot, ['../../team/44/user/22']);\n * ```\n */\nexport function createUrlTreeFromSnapshot(\n relativeTo: ActivatedRouteSnapshot,\n commands: readonly any[],\n queryParams: Params | null = null,\n fragment: string | null = null,\n urlSerializer = new DefaultUrlSerializer(),\n): UrlTree {\n const relativeToUrlSegmentGroup = createSegmentGroupFromRoute(relativeTo);\n return createUrlTreeFromSegmentGroup(\n relativeToUrlSegmentGroup,\n commands,\n queryParams,\n fragment,\n urlSerializer,\n );\n}\n\nexport function createSegmentGroupFromRoute(route: ActivatedRouteSnapshot): UrlSegmentGroup {\n let targetGroup: UrlSegmentGroup | undefined;\n\n function createSegmentGroupFromRouteRecursive(\n currentRoute: ActivatedRouteSnapshot,\n ): UrlSegmentGroup {\n const childOutlets: {[outlet: string]: UrlSegmentGroup} = {};\n for (const childSnapshot of currentRoute.children) {\n const root = createSegmentGroupFromRouteRecursive(childSnapshot);\n childOutlets[childSnapshot.outlet] = root;\n }\n const segmentGroup = new UrlSegmentGroup(currentRoute.url, childOutlets);\n if (currentRoute === route) {\n targetGroup = segmentGroup;\n }\n return segmentGroup;\n }\n const rootCandidate = createSegmentGroupFromRouteRecursive(route.root);\n const rootSegmentGroup = createRoot(rootCandidate);\n\n return targetGroup ?? rootSegmentGroup;\n}\n\nexport function createUrlTreeFromSegmentGroup(\n relativeTo: UrlSegmentGroup,\n commands: readonly any[],\n queryParams: Params | null,\n fragment: string | null,\n urlSerializer: UrlSerializer,\n): UrlTree {\n let root = relativeTo;\n while (root.parent) {\n root = root.parent;\n }\n // There are no commands so the `UrlTree` goes to the same path as the one created from the\n // `UrlSegmentGroup`. All we need to do is update the `queryParams` and `fragment` without\n // applying any other logic.\n if (commands.length === 0) {\n return tree(root, root, root, queryParams, fragment, urlSerializer);\n }\n\n const nav = computeNavigation(commands);\n\n if (nav.toRoot()) {\n return tree(root, root, new UrlSegmentGroup([], {}), queryParams, fragment, urlSerializer);\n }\n\n const position = findStartingPositionForTargetGroup(nav, root, relativeTo);\n const newSegmentGroup = position.processChildren\n ? updateSegmentGroupChildren(position.segmentGroup, position.index, nav.commands)\n : updateSegmentGroup(position.segmentGroup, position.index, nav.commands);\n return tree(root, position.segmentGroup, newSegmentGroup, queryParams, fragment, urlSerializer);\n}\n\nfunction isMatrixParams(command: any): boolean {\n return typeof command === 'object' && command != null && !command.outlets && !command.segmentPath;\n}\n\n/**\n * Determines if a given command has an `outlets` map. When we encounter a command\n * with an outlets k/v map, we need to apply each outlet individually to the existing segment.\n */\nfunction isCommandWithOutlets(command: any): command is {outlets: {[key: string]: any}} {\n return typeof command === 'object' && command != null && command.outlets;\n}\n\n/**\n * Normalizes a query parameter value by using the `UrlSerializer` to serialize then parse the value.\n *\n * This ensures that the value is consistent between parsing a URL in the browser on a fresh page load (or page refresh)\n * and a navigation where the query parameter value is passed directly to the router.\n *\n * This also allows custom `UrlSerializer` implementations to define how query parameter values are represented\n * in a `UrlTree`. Since `UrlSerializer` already has a `parse` that takes a string, it already has control\n * over how a browser URL is parsed into a `UrlTree` on initial load/page refresh.\n */\nfunction normalizeQueryParams(k: string, v: unknown, urlSerializer: UrlSerializer): unknown {\n // Hack for empty string query param, which, for whatever reason, happens\n // in a test. Parsing drops empty key params (which might not really be necessary).\n // It's probably really a test issue but I don't have the time to fix it...\n k ||= 'ɵ';\n const tree = new UrlTree();\n tree.queryParams = {[k]: v};\n return urlSerializer.parse(urlSerializer.serialize(tree)).queryParams[k];\n}\n\nfunction tree(\n oldRoot: UrlSegmentGroup,\n oldSegmentGroup: UrlSegmentGroup,\n newSegmentGroup: UrlSegmentGroup,\n queryParams: Params | null,\n fragment: string | null,\n urlSerializer: UrlSerializer,\n): UrlTree {\n const qp: Params = {};\n for (const [key, value] of Object.entries(queryParams ?? {})) {\n // This retains old behavior where each item in the array was stringified individually This\n // helps remove special-case handling for empty and single-item arrays where the default\n // serializer removes empty arrays when serialized then parsed or converts them to non-arrays\n // for single-item arrays. Changing this could have breaking change implications. Prior code\n // always returned arrays of strings for array inputs so tests, applications, serializers,\n // etc. may only be set up to handle string arrays. We could consider changing this in the\n // future to serialize the entire array as a single value. For now, this feels safer and is\n // at least a step in the right direction.\n qp[key] = Array.isArray(value)\n ? value.map((v) => normalizeQueryParams(key, v, urlSerializer))\n : normalizeQueryParams(key, value, urlSerializer);\n }\n\n let rootCandidate: UrlSegmentGroup;\n if (oldRoot === oldSegmentGroup) {\n rootCandidate = newSegmentGroup;\n } else {\n rootCandidate = replaceSegment(oldRoot, oldSegmentGroup, newSegmentGroup);\n }\n\n const newRoot = createRoot(squashSegmentGroup(rootCandidate));\n return new UrlTree(newRoot, qp, fragment);\n}\n\n/**\n * Replaces the `oldSegment` which is located in some child of the `current` with the `newSegment`.\n * This also has the effect of creating new `UrlSegmentGroup` copies to update references. This\n * shouldn't be necessary but the fallback logic for an invalid ActivatedRoute in the creation uses\n * the Router's current url tree. If we don't create new segment groups, we end up modifying that\n * value.\n */\nfunction replaceSegment(\n current: UrlSegmentGroup,\n oldSegment: UrlSegmentGroup,\n newSegment: UrlSegmentGroup,\n): UrlSegmentGroup {\n const children: {[key: string]: UrlSegmentGroup} = {};\n Object.entries(current.children).forEach(([outletName, c]) => {\n if (c === oldSegment) {\n children[outletName] = newSegment;\n } else {\n children[outletName] = replaceSegment(c, oldSegment, newSegment);\n }\n });\n return new UrlSegmentGroup(current.segments, children);\n}\n\nclass Navigation {\n constructor(\n public isAbsolute: boolean,\n public numberOfDoubleDots: number,\n public commands: readonly any[],\n ) {\n if (isAbsolute && commands.length > 0 && isMatrixParams(commands[0])) {\n throw new RuntimeError(\n RuntimeErrorCode.ROOT_SEGMENT_MATRIX_PARAMS,\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n 'Root segment cannot have matrix parameters',\n );\n }\n\n const cmdWithOutlet = commands.find(isCommandWithOutlets);\n if (cmdWithOutlet && cmdWithOutlet !== last(commands)) {\n throw new RuntimeError(\n RuntimeErrorCode.MISPLACED_OUTLETS_COMMAND,\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n '{outlets:{}} has to be the last command',\n );\n }\n }\n\n public toRoot(): boolean {\n return this.isAbsolute && this.commands.length === 1 && this.commands[0] == '/';\n }\n}\n\n/** Transforms commands to a normalized `Navigation` */\nfunction computeNavigation(commands: readonly any[]): Navigation {\n if (typeof commands[0] === 'string' && commands.length === 1 && commands[0] === '/') {\n return new Navigation(true, 0, commands);\n }\n\n let numberOfDoubleDots = 0;\n let isAbsolute = false;\n\n const res: any[] = commands.reduce((res, cmd, cmdIdx) => {\n if (typeof cmd === 'object' && cmd != null) {\n if (cmd.outlets) {\n const outlets: {[k: string]: any} = {};\n Object.entries(cmd.outlets).forEach(([name, commands]) => {\n outlets[name] = typeof commands === 'string' ? commands.split('/') : commands;\n });\n return [...res, {outlets}];\n }\n\n if (cmd.segmentPath) {\n return [...res, cmd.segmentPath];\n }\n }\n\n if (!(typeof cmd === 'string')) {\n return [...res, cmd];\n }\n\n if (cmdIdx === 0) {\n cmd.split('/').forEach((urlPart, partIndex) => {\n if (partIndex == 0 && urlPart === '.') {\n // skip './a'\n } else if (partIndex == 0 && urlPart === '') {\n // '/a'\n isAbsolute = true;\n } else if (urlPart === '..') {\n // '../a'\n numberOfDoubleDots++;\n } else if (urlPart != '') {\n res.push(urlPart);\n }\n });\n\n return res;\n }\n\n return [...res, cmd];\n }, []);\n\n return new Navigation(isAbsolute, numberOfDoubleDots, res);\n}\n\nclass Position {\n constructor(\n public segmentGroup: UrlSegmentGroup,\n public processChildren: boolean,\n public index: number,\n ) {}\n}\n\nfunction findStartingPositionForTargetGroup(\n nav: Navigation,\n root: UrlSegmentGroup,\n target: UrlSegmentGroup,\n): Position {\n if (nav.isAbsolute) {\n return new Position(root, true, 0);\n }\n\n if (!target) {\n // `NaN` is used only to maintain backwards compatibility with incorrectly mocked\n // `ActivatedRouteSnapshot` in tests. In prior versions of this code, the position here was\n // determined based on an internal property that was rarely mocked, resulting in `NaN`. In\n // reality, this code path should _never_ be touched since `target` is not allowed to be falsey.\n return new Position(root, false, NaN);\n }\n if (target.parent === null) {\n return new Position(target, true, 0);\n }\n\n const modifier = isMatrixParams(nav.commands[0]) ? 0 : 1;\n const index = target.segments.length - 1 + modifier;\n return createPositionApplyingDoubleDots(target, index, nav.numberOfDoubleDots);\n}\n\nfunction createPositionApplyingDoubleDots(\n group: UrlSegmentGroup,\n index: number,\n numberOfDoubleDots: number,\n): Position {\n let g = group;\n let ci = index;\n let dd = numberOfDoubleDots;\n while (dd > ci) {\n dd -= ci;\n g = g.parent!;\n if (!g) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_DOUBLE_DOTS,\n (typeof ngDevMode === 'undefined' || ngDevMode) && \"Invalid number of '../'\",\n );\n }\n ci = g.segments.length;\n }\n return new Position(g, false, ci - dd);\n}\n\nfunction getOutlets(commands: readonly unknown[]): {[k: string]: readonly unknown[] | string} {\n if (isCommandWithOutlets(commands[0])) {\n return commands[0].outlets;\n }\n\n return {[PRIMARY_OUTLET]: commands};\n}\n\nfunction updateSegmentGroup(\n segmentGroup: UrlSegmentGroup | undefined,\n startIndex: number,\n commands: readonly any[],\n): UrlSegmentGroup {\n segmentGroup ??= new UrlSegmentGroup([], {});\n if (segmentGroup.segments.length === 0 && segmentGroup.hasChildren()) {\n return updateSegmentGroupChildren(segmentGroup, startIndex, commands);\n }\n\n const m = prefixedWith(segmentGroup, startIndex, commands);\n const slicedCommands = commands.slice(m.commandIndex);\n if (m.match && m.pathIndex < segmentGroup.segments.length) {\n const g = new UrlSegmentGroup(segmentGroup.segments.slice(0, m.pathIndex), {});\n g.children[PRIMARY_OUTLET] = new UrlSegmentGroup(\n segmentGroup.segments.slice(m.pathIndex),\n segmentGroup.children,\n );\n return updateSegmentGroupChildren(g, 0, slicedCommands);\n } else if (m.match && slicedCommands.length === 0) {\n return new UrlSegmentGroup(segmentGroup.segments, {});\n } else if (m.match && !segmentGroup.hasChildren()) {\n return createNewSegmentGroup(segmentGroup, startIndex, commands);\n } else if (m.match) {\n return updateSegmentGroupChildren(segmentGroup, 0, slicedCommands);\n } else {\n return createNewSegmentGroup(segmentGroup, startIndex, commands);\n }\n}\n\nfunction updateSegmentGroupChildren(\n segmentGroup: UrlSegmentGroup,\n startIndex: number,\n commands: readonly any[],\n): UrlSegmentGroup {\n if (commands.length === 0) {\n return new UrlSegmentGroup(segmentGroup.segments, {});\n } else {\n const outlets = getOutlets(commands);\n const children: {[key: string]: UrlSegmentGroup} = {};\n // If the set of commands applies to anything other than the primary outlet and the child\n // segment is an empty path primary segment on its own, we want to apply the commands to the\n // empty child path rather than here. The outcome is that the empty primary child is effectively\n // removed from the final output UrlTree. Imagine the following config:\n //\n // {path: '', children: [{path: '**', outlet: 'popup'}]}.\n //\n // Navigation to /(popup:a) will activate the child outlet correctly Given a follow-up\n // navigation with commands\n // ['/', {outlets: {'popup': 'b'}}], we _would not_ want to apply the outlet commands to the\n // root segment because that would result in\n // //(popup:a)(popup:b) since the outlet command got applied one level above where it appears in\n // the `ActivatedRoute` rather than updating the existing one.\n //\n // Because empty paths do not appear in the URL segments and the fact that the segments used in\n // the output `UrlTree` are squashed to eliminate these empty paths where possible\n // https://github.com/angular/angular/blob/13f10de40e25c6900ca55bd83b36bd533dacfa9e/packages/router/src/url_tree.ts#L755\n // it can be hard to determine what is the right thing to do when applying commands to a\n // `UrlSegmentGroup` that is created from an \"unsquashed\"/expanded `ActivatedRoute` tree.\n // This code effectively \"squashes\" empty path primary routes when they have no siblings on\n // the same level of the tree.\n if (\n Object.keys(outlets).some((o) => o !== PRIMARY_OUTLET) &&\n segmentGroup.children[PRIMARY_OUTLET] &&\n segmentGroup.numberOfChildren === 1 &&\n segmentGroup.children[PRIMARY_OUTLET].segments.length === 0\n ) {\n const childrenOfEmptyChild = updateSegmentGroupChildren(\n segmentGroup.children[PRIMARY_OUTLET],\n startIndex,\n commands,\n );\n return new UrlSegmentGroup(segmentGroup.segments, childrenOfEmptyChild.children);\n }\n\n Object.entries(outlets).forEach(([outlet, commands]) => {\n if (typeof commands === 'string') {\n commands = [commands];\n }\n if (commands !== null) {\n children[outlet] = updateSegmentGroup(segmentGroup.children[outlet], startIndex, commands);\n }\n });\n\n Object.entries(segmentGroup.children).forEach(([childOutlet, child]) => {\n if (outlets[childOutlet] === undefined) {\n children[childOutlet] = child;\n }\n });\n return new UrlSegmentGroup(segmentGroup.segments, children);\n }\n}\n\nfunction prefixedWith(segmentGroup: UrlSegmentGroup, startIndex: number, commands: readonly any[]) {\n let currentCommandIndex = 0;\n let currentPathIndex = startIndex;\n\n const noMatch = {match: false, pathIndex: 0, commandIndex: 0};\n while (currentPathIndex < segmentGroup.segments.length) {\n if (currentCommandIndex >= commands.length) return noMatch;\n const path = segmentGroup.segments[currentPathIndex];\n const command = commands[currentCommandIndex];\n // Do not try to consume command as part of the prefixing if it has outlets because it can\n // contain outlets other than the one being processed. Consuming the outlets command would\n // result in other outlets being ignored.\n if (isCommandWithOutlets(command)) {\n break;\n }\n const curr = `${command}`;\n const next =\n currentCommandIndex < commands.length - 1 ? commands[currentCommandIndex + 1] : null;\n\n if (currentPathIndex > 0 && curr === undefined) break;\n\n if (curr && next && typeof next === 'object' && next.outlets === undefined) {\n if (!compare(curr, next, path)) return noMatch;\n currentCommandIndex += 2;\n } else {\n if (!compare(curr, {}, path)) return noMatch;\n currentCommandIndex++;\n }\n currentPathIndex++;\n }\n\n return {match: true, pathIndex: currentPathIndex, commandIndex: currentCommandIndex};\n}\n\nfunction createNewSegmentGroup(\n segmentGroup: UrlSegmentGroup,\n startIndex: number,\n commands: readonly any[],\n): UrlSegmentGroup {\n const paths = segmentGroup.segments.slice(0, startIndex);\n\n let i = 0;\n while (i < commands.length) {\n const command = commands[i];\n if (isCommandWithOutlets(command)) {\n const children = createNewSegmentChildren(command.outlets);\n return new UrlSegmentGroup(paths, children);\n }\n\n // if we start with an object literal, we need to reuse the path part from the segment\n if (i === 0 && isMatrixParams(commands[0])) {\n const p = segmentGroup.segments[startIndex];\n paths.push(new UrlSegment(p.path, stringify(commands[0])));\n i++;\n continue;\n }\n\n const curr = isCommandWithOutlets(command) ? command.outlets[PRIMARY_OUTLET] : `${command}`;\n const next = i < commands.length - 1 ? commands[i + 1] : null;\n if (curr && next && isMatrixParams(next)) {\n paths.push(new UrlSegment(curr, stringify(next)));\n i += 2;\n } else {\n paths.push(new UrlSegment(curr, {}));\n i++;\n }\n }\n return new UrlSegmentGroup(paths, {});\n}\n\nfunction createNewSegmentChildren(outlets: {[name: string]: readonly unknown[] | string}): {\n [outlet: string]: UrlSegmentGroup;\n} {\n const children: {[outlet: string]: UrlSegmentGroup} = {};\n Object.entries(outlets).forEach(([outlet, commands]) => {\n if (typeof commands === 'string') {\n commands = [commands];\n }\n if (commands !== null) {\n children[outlet] = createNewSegmentGroup(new UrlSegmentGroup([], {}), 0, commands);\n }\n });\n return children;\n}\n\nfunction stringify(params: {[key: string]: any}): {[key: string]: string} {\n const res: {[key: string]: string} = {};\n Object.entries(params).forEach(([k, v]) => (res[k] = `${v}`));\n return res;\n}\n\nfunction compare(path: string, params: {[key: string]: any}, segment: UrlSegment): boolean {\n return path == segment.path && shallowEqual(params, segment.parameters);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NavigationBehaviorOptions, Route} from './models';\nimport {ActivatedRouteSnapshot, RouterStateSnapshot} from './router_state';\nimport {UrlTree} from './url_tree';\nimport type {Navigation} from './navigation_transition';\n\n/**\n * Identifies the call or event that triggered a navigation.\n *\n * * 'imperative': Triggered by `router.navigateByUrl()` or `router.navigate()`.\n * * 'popstate' : Triggered by a `popstate` event.\n * * 'hashchange'-: Triggered by a `hashchange` event.\n *\n * @publicApi\n */\nexport type NavigationTrigger = 'imperative' | 'popstate' | 'hashchange';\nexport const IMPERATIVE_NAVIGATION = 'imperative';\n\n/**\n * Identifies the type of a router event.\n *\n * @see [Router Lifecycle and Events](guide/routing/lifecycle-and-events)\n *\n * @publicApi\n */\nexport enum EventType {\n NavigationStart,\n NavigationEnd,\n NavigationCancel,\n NavigationError,\n RoutesRecognized,\n ResolveStart,\n ResolveEnd,\n GuardsCheckStart,\n GuardsCheckEnd,\n RouteConfigLoadStart,\n RouteConfigLoadEnd,\n ChildActivationStart,\n ChildActivationEnd,\n ActivationStart,\n ActivationEnd,\n Scroll,\n NavigationSkipped,\n}\n\n/**\n * Base for events the router goes through, as opposed to events tied to a specific\n * route. Fired one time for any given navigation.\n *\n * The following code shows how a class subscribes to router events.\n *\n * ```ts\n * import {Event, RouterEvent, Router} from '@angular/router';\n *\n * class MyService {\n * constructor(public router: Router) {\n * router.events.pipe(\n * filter((e: Event | RouterEvent): e is RouterEvent => e instanceof RouterEvent)\n * ).subscribe((e: RouterEvent) => {\n * // Do something\n * });\n * }\n * }\n * ```\n *\n * @see {@link Event}\n * @see [Router events summary](guide/routing/router-reference#router-events)\n * @publicApi\n */\nexport class RouterEvent {\n constructor(\n /** A unique ID that the router assigns to every router navigation. */\n public id: number,\n /** The URL that is the destination for this navigation. */\n public url: string,\n ) {}\n}\n\n/**\n * An event triggered when a navigation starts.\n *\n * @publicApi\n */\nexport class NavigationStart extends RouterEvent {\n readonly type = EventType.NavigationStart;\n\n /**\n * Identifies the call or event that triggered the navigation.\n * An `imperative` trigger is a call to `router.navigateByUrl()` or `router.navigate()`.\n *\n * @see {@link NavigationEnd}\n * @see {@link NavigationCancel}\n * @see {@link NavigationError}\n */\n navigationTrigger?: NavigationTrigger;\n\n /**\n * The navigation state that was previously supplied to the `pushState` call,\n * when the navigation is triggered by a `popstate` event. Otherwise null.\n *\n * The state object is defined by `NavigationExtras`, and contains any\n * developer-defined state value, as well as a unique ID that\n * the router assigns to every router transition/navigation.\n *\n * From the perspective of the router, the router never \"goes back\".\n * When the user clicks on the back button in the browser,\n * a new navigation ID is created.\n *\n * Use the ID in this previous-state object to differentiate between a newly created\n * state and one returned to by a `popstate` event, so that you can restore some\n * remembered state, such as scroll position.\n *\n */\n restoredState?: {[k: string]: any; navigationId: number} | null;\n\n constructor(\n /** @docsNotRequired */\n id: number,\n /** @docsNotRequired */\n url: string,\n /** @docsNotRequired */\n navigationTrigger: NavigationTrigger = 'imperative',\n /** @docsNotRequired */\n restoredState: {[k: string]: any; navigationId: number} | null = null,\n ) {\n super(id, url);\n this.navigationTrigger = navigationTrigger;\n this.restoredState = restoredState;\n }\n\n /** @docsNotRequired */\n override toString(): string {\n return `NavigationStart(id: ${this.id}, url: '${this.url}')`;\n }\n}\n\n/**\n * An event triggered when a navigation ends successfully.\n *\n * @see {@link NavigationStart}\n * @see {@link NavigationCancel}\n * @see {@link NavigationError}\n *\n * @publicApi\n */\nexport class NavigationEnd extends RouterEvent {\n readonly type = EventType.NavigationEnd;\n\n constructor(\n /** @docsNotRequired */\n id: number,\n /** @docsNotRequired */\n url: string,\n /** @docsNotRequired */\n public urlAfterRedirects: string,\n ) {\n super(id, url);\n }\n\n /** @docsNotRequired */\n override toString(): string {\n return `NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`;\n }\n}\n\n/**\n * A code for the `NavigationCancel` event of the `Router` to indicate the\n * reason a navigation failed.\n *\n * @publicApi\n */\nexport enum NavigationCancellationCode {\n /**\n * A navigation failed because a guard returned a `UrlTree` to redirect.\n */\n Redirect,\n /**\n * A navigation failed because a more recent navigation started.\n */\n SupersededByNewNavigation,\n /**\n * A navigation failed because one of the resolvers completed without emitting a value.\n */\n NoDataFromResolver,\n /**\n * A navigation failed because a guard returned `false`.\n */\n GuardRejected,\n /**\n * A navigation was aborted by the `Navigation.abort` function.\n *\n * @see {@link Navigation}\n */\n Aborted,\n}\n\n/**\n * A code for the `NavigationSkipped` event of the `Router` to indicate the\n * reason a navigation was skipped.\n *\n * @publicApi\n */\nexport enum NavigationSkippedCode {\n /**\n * A navigation was skipped because the navigation URL was the same as the current Router URL.\n */\n IgnoredSameUrlNavigation,\n /**\n * A navigation was skipped because the configured `UrlHandlingStrategy` return `false` for both\n * the current Router URL and the target of the navigation.\n *\n * @see {@link UrlHandlingStrategy}\n */\n IgnoredByUrlHandlingStrategy,\n}\n\n/**\n * An event triggered when a navigation is canceled, directly or indirectly.\n * This can happen for several reasons including when a route guard\n * returns `false` or initiates a redirect by returning a `UrlTree`.\n *\n * @see {@link NavigationStart}\n * @see {@link NavigationEnd}\n * @see {@link NavigationError}\n *\n * @publicApi\n */\nexport class NavigationCancel extends RouterEvent {\n readonly type = EventType.NavigationCancel;\n\n constructor(\n /** @docsNotRequired */\n id: number,\n /** @docsNotRequired */\n url: string,\n /**\n * A description of why the navigation was cancelled. For debug purposes only. Use `code`\n * instead for a stable cancellation reason that can be used in production.\n */\n public reason: string,\n /**\n * A code to indicate why the navigation was canceled. This cancellation code is stable for\n * the reason and can be relied on whereas the `reason` string could change and should not be\n * used in production.\n */\n readonly code?: NavigationCancellationCode,\n ) {\n super(id, url);\n }\n\n /** @docsNotRequired */\n override toString(): string {\n return `NavigationCancel(id: ${this.id}, url: '${this.url}')`;\n }\n}\n\nexport function isRedirectingEvent(event: Event): boolean {\n return (\n event instanceof NavigationCancel &&\n (event.code === NavigationCancellationCode.Redirect ||\n event.code === NavigationCancellationCode.SupersededByNewNavigation)\n );\n}\n\n/**\n * An event triggered when a navigation is skipped.\n * This can happen for a couple reasons including onSameUrlHandling\n * is set to `ignore` and the navigation URL is not different than the\n * current state.\n *\n * @publicApi\n */\nexport class NavigationSkipped extends RouterEvent {\n readonly type = EventType.NavigationSkipped;\n\n constructor(\n /** @docsNotRequired */\n id: number,\n /** @docsNotRequired */\n url: string,\n /**\n * A description of why the navigation was skipped. For debug purposes only. Use `code`\n * instead for a stable skipped reason that can be used in production.\n */\n public reason: string,\n /**\n * A code to indicate why the navigation was skipped. This code is stable for\n * the reason and can be relied on whereas the `reason` string could change and should not be\n * used in production.\n */\n readonly code?: NavigationSkippedCode,\n ) {\n super(id, url);\n }\n}\n\n/**\n * An event triggered when a navigation fails due to an unexpected error.\n *\n * @see {@link NavigationStart}\n * @see {@link NavigationEnd}\n * @see {@link NavigationCancel}\n *\n * @publicApi\n */\nexport class NavigationError extends RouterEvent {\n readonly type = EventType.NavigationError;\n\n constructor(\n /** @docsNotRequired */\n id: number,\n /** @docsNotRequired */\n url: string,\n /** @docsNotRequired */\n public error: any,\n /**\n * The target of the navigation when the error occurred.\n *\n * Note that this can be `undefined` because an error could have occurred before the\n * `RouterStateSnapshot` was created for the navigation.\n */\n readonly target?: RouterStateSnapshot,\n ) {\n super(id, url);\n }\n\n /** @docsNotRequired */\n override toString(): string {\n return `NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`;\n }\n}\n\n/**\n * An event triggered when routes are recognized.\n *\n * @publicApi\n */\nexport class RoutesRecognized extends RouterEvent {\n readonly type = EventType.RoutesRecognized;\n\n constructor(\n /** @docsNotRequired */\n id: number,\n /** @docsNotRequired */\n url: string,\n /** @docsNotRequired */\n public urlAfterRedirects: string,\n /** @docsNotRequired */\n public state: RouterStateSnapshot,\n ) {\n super(id, url);\n }\n\n /** @docsNotRequired */\n override toString(): string {\n return `RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`;\n }\n}\n\n/**\n * An event triggered at the start of the Guard phase of routing.\n *\n * @see {@link GuardsCheckEnd}\n *\n * @publicApi\n */\nexport class GuardsCheckStart extends RouterEvent {\n readonly type = EventType.GuardsCheckStart;\n\n constructor(\n /** @docsNotRequired */\n id: number,\n /** @docsNotRequired */\n url: string,\n /** @docsNotRequired */\n public urlAfterRedirects: string,\n /** @docsNotRequired */\n public state: RouterStateSnapshot,\n ) {\n super(id, url);\n }\n\n override toString(): string {\n return `GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`;\n }\n}\n\n/**\n * An event triggered at the end of the Guard phase of routing.\n *\n * @see {@link GuardsCheckStart}\n *\n * @publicApi\n */\nexport class GuardsCheckEnd extends RouterEvent {\n readonly type = EventType.GuardsCheckEnd;\n\n constructor(\n /** @docsNotRequired */\n id: number,\n /** @docsNotRequired */\n url: string,\n /** @docsNotRequired */\n public urlAfterRedirects: string,\n /** @docsNotRequired */\n public state: RouterStateSnapshot,\n /** @docsNotRequired */\n public shouldActivate: boolean,\n ) {\n super(id, url);\n }\n\n override toString(): string {\n return `GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`;\n }\n}\n\n/**\n * An event triggered at the start of the Resolve phase of routing.\n *\n * Runs in the \"resolve\" phase whether or not there is anything to resolve.\n * In future, may change to only run when there are things to be resolved.\n *\n * @see {@link ResolveEnd}\n *\n * @publicApi\n */\nexport class ResolveStart extends RouterEvent {\n readonly type = EventType.ResolveStart;\n\n constructor(\n /** @docsNotRequired */\n id: number,\n /** @docsNotRequired */\n url: string,\n /** @docsNotRequired */\n public urlAfterRedirects: string,\n /** @docsNotRequired */\n public state: RouterStateSnapshot,\n ) {\n super(id, url);\n }\n\n override toString(): string {\n return `ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`;\n }\n}\n\n/**\n * An event triggered at the end of the Resolve phase of routing.\n * @see {@link ResolveStart}\n *\n * @publicApi\n */\nexport class ResolveEnd extends RouterEvent {\n readonly type = EventType.ResolveEnd;\n\n constructor(\n /** @docsNotRequired */\n id: number,\n /** @docsNotRequired */\n url: string,\n /** @docsNotRequired */\n public urlAfterRedirects: string,\n /** @docsNotRequired */\n public state: RouterStateSnapshot,\n ) {\n super(id, url);\n }\n\n override toString(): string {\n return `ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`;\n }\n}\n\n/**\n * An event triggered before lazy loading a route configuration.\n *\n * @see {@link RouteConfigLoadEnd}\n *\n * @publicApi\n */\nexport class RouteConfigLoadStart {\n readonly type = EventType.RouteConfigLoadStart;\n\n constructor(\n /** @docsNotRequired */\n public route: Route,\n ) {}\n toString(): string {\n return `RouteConfigLoadStart(path: ${this.route.path})`;\n }\n}\n\n/**\n * An event triggered when a route has been lazy loaded.\n *\n * @see {@link RouteConfigLoadStart}\n *\n * @publicApi\n */\nexport class RouteConfigLoadEnd {\n readonly type = EventType.RouteConfigLoadEnd;\n\n constructor(\n /** @docsNotRequired */\n public route: Route,\n ) {}\n toString(): string {\n return `RouteConfigLoadEnd(path: ${this.route.path})`;\n }\n}\n\n/**\n * An event triggered at the start of the child-activation\n * part of the Resolve phase of routing.\n * @see {@link ChildActivationEnd}\n * @see {@link ResolveStart}\n *\n * @publicApi\n */\nexport class ChildActivationStart {\n readonly type = EventType.ChildActivationStart;\n\n constructor(\n /** @docsNotRequired */\n public snapshot: ActivatedRouteSnapshot,\n ) {}\n toString(): string {\n const path = (this.snapshot.routeConfig && this.snapshot.routeConfig.path) || '';\n return `ChildActivationStart(path: '${path}')`;\n }\n}\n\n/**\n * An event triggered at the end of the child-activation part\n * of the Resolve phase of routing.\n * @see {@link ChildActivationStart}\n * @see {@link ResolveStart}\n * @publicApi\n */\nexport class ChildActivationEnd {\n readonly type = EventType.ChildActivationEnd;\n\n constructor(\n /** @docsNotRequired */\n public snapshot: ActivatedRouteSnapshot,\n ) {}\n toString(): string {\n const path = (this.snapshot.routeConfig && this.snapshot.routeConfig.path) || '';\n return `ChildActivationEnd(path: '${path}')`;\n }\n}\n\n/**\n * An event triggered at the start of the activation part\n * of the Resolve phase of routing.\n * @see {@link ActivationEnd}\n * @see {@link ResolveStart}\n *\n * @publicApi\n */\nexport class ActivationStart {\n readonly type = EventType.ActivationStart;\n\n constructor(\n /** @docsNotRequired */\n public snapshot: ActivatedRouteSnapshot,\n ) {}\n toString(): string {\n const path = (this.snapshot.routeConfig && this.snapshot.routeConfig.path) || '';\n return `ActivationStart(path: '${path}')`;\n }\n}\n\n/**\n * An event triggered at the end of the activation part\n * of the Resolve phase of routing.\n * @see {@link ActivationStart}\n * @see {@link ResolveStart}\n *\n * @publicApi\n */\nexport class ActivationEnd {\n readonly type = EventType.ActivationEnd;\n\n constructor(\n /** @docsNotRequired */\n public snapshot: ActivatedRouteSnapshot,\n ) {}\n toString(): string {\n const path = (this.snapshot.routeConfig && this.snapshot.routeConfig.path) || '';\n return `ActivationEnd(path: '${path}')`;\n }\n}\n\n/**\n * An event triggered by scrolling.\n *\n * @publicApi\n */\nexport class Scroll {\n readonly type = EventType.Scroll;\n\n constructor(\n /** @docsNotRequired */\n readonly routerEvent: NavigationEnd | NavigationSkipped,\n\n /** @docsNotRequired */\n readonly position: [number, number] | null,\n\n /** @docsNotRequired */\n readonly anchor: string | null,\n\n /** @docsNotRequired */\n readonly scrollBehavior?: 'manual' | 'after-transition',\n ) {}\n\n toString(): string {\n const pos = this.position ? `${this.position[0]}, ${this.position[1]}` : null;\n return `Scroll(anchor: '${this.anchor}', position: '${pos}')`;\n }\n}\n\nexport class BeforeActivateRoutes {}\nexport class RedirectRequest {\n constructor(\n readonly url: UrlTree,\n readonly navigationBehaviorOptions: NavigationBehaviorOptions | undefined,\n ) {}\n}\nexport type PrivateRouterEvents = BeforeActivateRoutes | RedirectRequest;\nexport function isPublicRouterEvent(e: Event | PrivateRouterEvents): e is Event {\n return !(e instanceof BeforeActivateRoutes) && !(e instanceof RedirectRequest);\n}\n\n/**\n * Router events that allow you to track the lifecycle of the router.\n *\n * The events occur in the following sequence:\n *\n * * [NavigationStart](api/router/NavigationStart): Navigation starts.\n * * [RouteConfigLoadStart](api/router/RouteConfigLoadStart): Before\n * the router [lazy loads](guide/routing/common-router-tasks#lazy-loading) a route configuration.\n * * [RouteConfigLoadEnd](api/router/RouteConfigLoadEnd): After a route has been lazy loaded.\n * * [RoutesRecognized](api/router/RoutesRecognized): When the router parses the URL\n * and the routes are recognized.\n * * [GuardsCheckStart](api/router/GuardsCheckStart): When the router begins the *guards*\n * phase of routing.\n * * [ChildActivationStart](api/router/ChildActivationStart): When the router\n * begins activating a route's children.\n * * [ActivationStart](api/router/ActivationStart): When the router begins activating a route.\n * * [GuardsCheckEnd](api/router/GuardsCheckEnd): When the router finishes the *guards*\n * phase of routing successfully.\n * * [ResolveStart](api/router/ResolveStart): When the router begins the *resolve*\n * phase of routing.\n * * [ResolveEnd](api/router/ResolveEnd): When the router finishes the *resolve*\n * phase of routing successfully.\n * * [ChildActivationEnd](api/router/ChildActivationEnd): When the router finishes\n * activating a route's children.\n * * [ActivationEnd](api/router/ActivationEnd): When the router finishes activating a route.\n * * [NavigationEnd](api/router/NavigationEnd): When navigation ends successfully.\n * * [NavigationCancel](api/router/NavigationCancel): When navigation is canceled.\n * * [NavigationError](api/router/NavigationError): When navigation fails\n * due to an unexpected error.\n * * [Scroll](api/router/Scroll): When the user scrolls.\n *\n * @publicApi\n */\nexport type Event =\n | NavigationStart\n | NavigationEnd\n | NavigationCancel\n | NavigationError\n | RoutesRecognized\n | GuardsCheckStart\n | GuardsCheckEnd\n | RouteConfigLoadStart\n | RouteConfigLoadEnd\n | ChildActivationStart\n | ChildActivationEnd\n | ActivationStart\n | ActivationEnd\n | Scroll\n | ResolveStart\n | ResolveEnd\n | NavigationSkipped;\n\nexport function stringifyEvent(routerEvent: Event): string {\n switch (routerEvent.type) {\n case EventType.ActivationEnd:\n return `ActivationEnd(path: '${routerEvent.snapshot.routeConfig?.path || ''}')`;\n case EventType.ActivationStart:\n return `ActivationStart(path: '${routerEvent.snapshot.routeConfig?.path || ''}')`;\n case EventType.ChildActivationEnd:\n return `ChildActivationEnd(path: '${routerEvent.snapshot.routeConfig?.path || ''}')`;\n case EventType.ChildActivationStart:\n return `ChildActivationStart(path: '${routerEvent.snapshot.routeConfig?.path || ''}')`;\n case EventType.GuardsCheckEnd:\n return `GuardsCheckEnd(id: ${routerEvent.id}, url: '${routerEvent.url}', urlAfterRedirects: '${routerEvent.urlAfterRedirects}', state: ${routerEvent.state}, shouldActivate: ${routerEvent.shouldActivate})`;\n case EventType.GuardsCheckStart:\n return `GuardsCheckStart(id: ${routerEvent.id}, url: '${routerEvent.url}', urlAfterRedirects: '${routerEvent.urlAfterRedirects}', state: ${routerEvent.state})`;\n case EventType.NavigationCancel:\n return `NavigationCancel(id: ${routerEvent.id}, url: '${routerEvent.url}')`;\n case EventType.NavigationSkipped:\n return `NavigationSkipped(id: ${routerEvent.id}, url: '${routerEvent.url}')`;\n case EventType.NavigationEnd:\n return `NavigationEnd(id: ${routerEvent.id}, url: '${routerEvent.url}', urlAfterRedirects: '${routerEvent.urlAfterRedirects}')`;\n case EventType.NavigationError:\n return `NavigationError(id: ${routerEvent.id}, url: '${routerEvent.url}', error: ${routerEvent.error})`;\n case EventType.NavigationStart:\n return `NavigationStart(id: ${routerEvent.id}, url: '${routerEvent.url}')`;\n case EventType.ResolveEnd:\n return `ResolveEnd(id: ${routerEvent.id}, url: '${routerEvent.url}', urlAfterRedirects: '${routerEvent.urlAfterRedirects}', state: ${routerEvent.state})`;\n case EventType.ResolveStart:\n return `ResolveStart(id: ${routerEvent.id}, url: '${routerEvent.url}', urlAfterRedirects: '${routerEvent.urlAfterRedirects}', state: ${routerEvent.state})`;\n case EventType.RouteConfigLoadEnd:\n return `RouteConfigLoadEnd(path: ${routerEvent.route.path})`;\n case EventType.RouteConfigLoadStart:\n return `RouteConfigLoadStart(path: ${routerEvent.route.path})`;\n case EventType.RoutesRecognized:\n return `RoutesRecognized(id: ${routerEvent.id}, url: '${routerEvent.url}', urlAfterRedirects: '${routerEvent.urlAfterRedirects}', state: ${routerEvent.state})`;\n case EventType.Scroll:\n const pos = routerEvent.position\n ? `${routerEvent.position[0]}, ${routerEvent.position[1]}`\n : null;\n return `Scroll(anchor: '${routerEvent.anchor}', position: '${pos}')`;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ComponentRef, EnvironmentInjector, Injectable} from '@angular/core';\n\nimport type {RouterOutletContract} from './directives/router_outlet';\nimport {ActivatedRoute} from './router_state';\n\n/**\n * Store contextual information about a `RouterOutlet`\n *\n * @publicApi\n */\nexport class OutletContext {\n outlet: RouterOutletContract | null = null;\n route: ActivatedRoute | null = null;\n children: ChildrenOutletContexts;\n attachRef: ComponentRef<any> | null = null;\n get injector(): EnvironmentInjector {\n return this.route?.snapshot._environmentInjector ?? this.rootInjector;\n }\n\n constructor(private readonly rootInjector: EnvironmentInjector) {\n this.children = new ChildrenOutletContexts(this.rootInjector);\n }\n}\n\n/**\n * Store contextual information about the children (= nested) `RouterOutlet`\n *\n * @publicApi\n */\n@Injectable({providedIn: 'root'})\nexport class ChildrenOutletContexts {\n // contexts for child outlets, by name.\n private contexts = new Map<string, OutletContext>();\n\n /** @docs-private */\n constructor(private rootInjector: EnvironmentInjector) {}\n\n /** Called when a `RouterOutlet` directive is instantiated */\n onChildOutletCreated(childName: string, outlet: RouterOutletContract): void {\n const context = this.getOrCreateContext(childName);\n context.outlet = outlet;\n this.contexts.set(childName, context);\n }\n\n /**\n * Called when a `RouterOutlet` directive is destroyed.\n * We need to keep the context as the outlet could be destroyed inside a NgIf and might be\n * re-created later.\n */\n onChildOutletDestroyed(childName: string): void {\n const context = this.getContext(childName);\n if (context) {\n context.outlet = null;\n context.attachRef = null;\n }\n }\n\n /**\n * Called when the corresponding route is deactivated during navigation.\n * Because the component get destroyed, all children outlet are destroyed.\n */\n onOutletDeactivated(): Map<string, OutletContext> {\n const contexts = this.contexts;\n this.contexts = new Map();\n return contexts;\n }\n\n onOutletReAttached(contexts: Map<string, OutletContext>): void {\n this.contexts = contexts;\n }\n\n getOrCreateContext(childName: string): OutletContext {\n let context = this.getContext(childName);\n\n if (!context) {\n context = new OutletContext(this.rootInjector);\n this.contexts.set(childName, context);\n }\n\n return context;\n }\n\n getContext(childName: string): OutletContext | null {\n return this.contexts.get(childName) || null;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport class Tree<T> {\n /** @internal */\n _root: TreeNode<T>;\n\n constructor(root: TreeNode<T>) {\n this._root = root;\n }\n\n get root(): T {\n return this._root.value;\n }\n\n /**\n * @internal\n */\n parent(t: T): T | null {\n const p = this.pathFromRoot(t);\n return p.length > 1 ? p[p.length - 2] : null;\n }\n\n /**\n * @internal\n */\n children(t: T): T[] {\n const n = findNode(t, this._root);\n return n ? n.children.map((t) => t.value) : [];\n }\n\n /**\n * @internal\n */\n firstChild(t: T): T | null {\n const n = findNode(t, this._root);\n return n && n.children.length > 0 ? n.children[0].value : null;\n }\n\n /**\n * @internal\n */\n siblings(t: T): T[] {\n const p = findPath(t, this._root);\n if (p.length < 2) return [];\n\n const c = p[p.length - 2].children.map((c) => c.value);\n return c.filter((cc) => cc !== t);\n }\n\n /**\n * @internal\n */\n pathFromRoot(t: T): T[] {\n return findPath(t, this._root).map((s) => s.value);\n }\n}\n\n// DFS for the node matching the value\nfunction findNode<T>(value: T, node: TreeNode<T>): TreeNode<T> | null {\n if (value === node.value) return node;\n\n for (const child of node.children) {\n const node = findNode(value, child);\n if (node) return node;\n }\n\n return null;\n}\n\n// Return the path to the node with the given value using DFS\nfunction findPath<T>(value: T, node: TreeNode<T>): TreeNode<T>[] {\n if (value === node.value) return [node];\n\n for (const child of node.children) {\n const path = findPath(value, child);\n if (path.length) {\n path.unshift(node);\n return path;\n }\n }\n\n return [];\n}\n\nexport class TreeNode<T> {\n constructor(\n public value: T,\n public children: TreeNode<T>[],\n ) {}\n\n toString(): string {\n return `TreeNode(${this.value})`;\n }\n}\n\n// Return the list of T indexed by outlet name\nexport function nodeChildrenAsMap<T extends {outlet: string}>(\n node: TreeNode<T> | null,\n): {\n [outlet: string]: TreeNode<T>;\n} {\n const map: {[outlet: string]: TreeNode<T>} = {};\n\n if (node) {\n node.children.forEach((child) => (map[child.value.outlet] = child));\n }\n\n return map;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EnvironmentInjector, Type} from '@angular/core';\nimport {BehaviorSubject, Observable, of} from 'rxjs';\nimport {map} from 'rxjs/operators';\n\nimport {Data, ResolveData, Route} from './models';\nimport {convertToParamMap, ParamMap, Params, PRIMARY_OUTLET, RouteTitleKey} from './shared';\nimport {equalSegments, UrlSegment} from './url_tree';\nimport {shallowEqual, shallowEqualArrays} from './utils/collection';\nimport {Tree, TreeNode} from './utils/tree';\n\n/**\n * Represents the state of the router as a tree of activated routes.\n *\n * @usageNotes\n *\n * Every node in the route tree is an `ActivatedRoute` instance\n * that knows about the \"consumed\" URL segments, the extracted parameters,\n * and the resolved data.\n * Use the `ActivatedRoute` properties to traverse the tree from any node.\n *\n * The following fragment shows how a component gets the root node\n * of the current state to establish its own route tree:\n *\n * ```ts\n * @Component({templateUrl:'template.html'})\n * class MyComponent {\n * constructor(router: Router) {\n * const state: RouterState = router.routerState;\n * const root: ActivatedRoute = state.root;\n * const child = root.firstChild;\n * const id: Observable<string> = child.params.map(p => p.id);\n * //...\n * }\n * }\n * ```\n *\n * @see {@link ActivatedRoute}\n * @see [Getting route information](guide/routing/common-router-tasks#getting-route-information)\n *\n * @publicApi\n */\nexport class RouterState extends Tree<ActivatedRoute> {\n /** @internal */\n constructor(\n root: TreeNode<ActivatedRoute>,\n /** The current snapshot of the router state */\n public snapshot: RouterStateSnapshot,\n ) {\n super(root);\n setRouterState(<RouterState>this, root);\n }\n\n override toString(): string {\n return this.snapshot.toString();\n }\n}\n\nexport function createEmptyState(\n rootComponent: Type<any> | null,\n injector: EnvironmentInjector,\n): RouterState {\n const snapshot = createEmptyStateSnapshot(rootComponent, injector);\n const emptyUrl = new BehaviorSubject([new UrlSegment('', {})]);\n const emptyParams = new BehaviorSubject({});\n const emptyData = new BehaviorSubject({});\n const emptyQueryParams = new BehaviorSubject({});\n const fragment = new BehaviorSubject<string | null>('');\n const activated = new ActivatedRoute(\n emptyUrl,\n emptyParams,\n emptyQueryParams,\n fragment,\n emptyData,\n PRIMARY_OUTLET,\n rootComponent,\n snapshot.root,\n );\n activated.snapshot = snapshot.root;\n return new RouterState(new TreeNode<ActivatedRoute>(activated, []), snapshot);\n}\n\nexport function createEmptyStateSnapshot(\n rootComponent: Type<any> | null,\n injector: EnvironmentInjector,\n): RouterStateSnapshot {\n const emptyParams = {};\n const emptyData = {};\n const emptyQueryParams = {};\n const fragment = '';\n const activated = new ActivatedRouteSnapshot(\n [],\n emptyParams,\n emptyQueryParams,\n fragment,\n emptyData,\n PRIMARY_OUTLET,\n rootComponent,\n null,\n {},\n injector,\n );\n return new RouterStateSnapshot('', new TreeNode<ActivatedRouteSnapshot>(activated, []));\n}\n\n/**\n * Provides access to information about a route associated with a component\n * that is loaded in an outlet.\n * Use to traverse the `RouterState` tree and extract information from nodes.\n *\n * The following example shows how to construct a component using information from a\n * currently activated route.\n *\n * Note: the observables in this class only emit when the current and previous values differ based\n * on shallow equality. For example, changing deeply nested properties in resolved `data` will not\n * cause the `ActivatedRoute.data` `Observable` to emit a new value.\n *\n * {@example router/activated-route/activated_route_component.ts region=\"activated-route\"}\n *\n * @see [Getting route information](guide/routing/common-router-tasks#getting-route-information)\n *\n * @publicApi\n */\nexport class ActivatedRoute {\n /** The current snapshot of this route */\n snapshot!: ActivatedRouteSnapshot;\n /** @internal */\n _futureSnapshot: ActivatedRouteSnapshot;\n /** @internal */\n _routerState!: RouterState;\n /** @internal */\n _paramMap?: Observable<ParamMap>;\n /** @internal */\n _queryParamMap?: Observable<ParamMap>;\n\n /** An Observable of the resolved route title */\n readonly title: Observable<string | undefined>;\n\n /** An observable of the URL segments matched by this route. */\n public url: Observable<UrlSegment[]>;\n /** An observable of the matrix parameters scoped to this route. */\n public params: Observable<Params>;\n /** An observable of the query parameters shared by all the routes. */\n public queryParams: Observable<Params>;\n /** An observable of the URL fragment shared by all the routes. */\n public fragment: Observable<string | null>;\n /** An observable of the static and resolved data of this route. */\n public data: Observable<Data>;\n\n /** @internal */\n constructor(\n /** @internal */\n public urlSubject: BehaviorSubject<UrlSegment[]>,\n /** @internal */\n public paramsSubject: BehaviorSubject<Params>,\n /** @internal */\n public queryParamsSubject: BehaviorSubject<Params>,\n /** @internal */\n public fragmentSubject: BehaviorSubject<string | null>,\n /** @internal */\n public dataSubject: BehaviorSubject<Data>,\n /** The outlet name of the route, a constant. */\n public outlet: string,\n /** The component of the route, a constant. */\n public component: Type<any> | null,\n futureSnapshot: ActivatedRouteSnapshot,\n ) {\n this._futureSnapshot = futureSnapshot;\n this.title = this.dataSubject?.pipe(map((d: Data) => d[RouteTitleKey])) ?? of(undefined);\n // TODO(atscott): Verify that these can be changed to `.asObservable()` with TGP.\n this.url = urlSubject;\n this.params = paramsSubject;\n this.queryParams = queryParamsSubject;\n this.fragment = fragmentSubject;\n this.data = dataSubject;\n }\n\n /** The configuration used to match this route. */\n get routeConfig(): Route | null {\n return this._futureSnapshot.routeConfig;\n }\n\n /** The root of the router state. */\n get root(): ActivatedRoute {\n return this._routerState.root;\n }\n\n /** The parent of this route in the router state tree. */\n get parent(): ActivatedRoute | null {\n return this._routerState.parent(this);\n }\n\n /** The first child of this route in the router state tree. */\n get firstChild(): ActivatedRoute | null {\n return this._routerState.firstChild(this);\n }\n\n /** The children of this route in the router state tree. */\n get children(): ActivatedRoute[] {\n return this._routerState.children(this);\n }\n\n /** The path from the root of the router state tree to this route. */\n get pathFromRoot(): ActivatedRoute[] {\n return this._routerState.pathFromRoot(this);\n }\n\n /**\n * An Observable that contains a map of the required and optional parameters\n * specific to the route.\n * The map supports retrieving single and multiple values from the same parameter.\n */\n get paramMap(): Observable<ParamMap> {\n this._paramMap ??= this.params.pipe(map((p: Params): ParamMap => convertToParamMap(p)));\n return this._paramMap;\n }\n\n /**\n * An Observable that contains a map of the query parameters available to all routes.\n * The map supports retrieving single and multiple values from the query parameter.\n */\n get queryParamMap(): Observable<ParamMap> {\n this._queryParamMap ??= this.queryParams.pipe(\n map((p: Params): ParamMap => convertToParamMap(p)),\n );\n return this._queryParamMap;\n }\n\n toString(): string {\n return this.snapshot ? this.snapshot.toString() : `Future(${this._futureSnapshot})`;\n }\n}\n\nexport type ParamsInheritanceStrategy = 'emptyOnly' | 'always';\n\n/** @internal */\nexport type Inherited = {\n params: Params;\n data: Data;\n resolve: Data;\n};\n\n/**\n * Returns the inherited params, data, and resolve for a given route.\n *\n * By default, we do not inherit parent data unless the current route is path-less or the parent\n * route is component-less.\n */\nexport function getInherited(\n route: ActivatedRouteSnapshot,\n parent: ActivatedRouteSnapshot | null,\n paramsInheritanceStrategy: ParamsInheritanceStrategy = 'emptyOnly',\n): Inherited {\n let inherited: Inherited;\n const {routeConfig} = route;\n if (\n parent !== null &&\n (paramsInheritanceStrategy === 'always' ||\n // inherit parent data if route is empty path\n routeConfig?.path === '' ||\n // inherit parent data if parent was componentless\n (!parent.component && !parent.routeConfig?.loadComponent))\n ) {\n inherited = {\n params: {...parent.params, ...route.params},\n data: {...parent.data, ...route.data},\n resolve: {\n // Snapshots are created with data inherited from parent and guards (i.e. canActivate) can\n // change data because it's not frozen...\n // This first line could be deleted chose to break/disallow mutating the `data` object in\n // guards.\n // Note that data from parents still override this mutated data so anyone relying on this\n // might be surprised that it doesn't work if parent data is inherited but otherwise does.\n ...route.data,\n // Ensure inherited resolved data overrides inherited static data\n ...parent.data,\n // static data from the current route overrides any inherited data\n ...routeConfig?.data,\n // resolved data from current route overrides everything\n ...route._resolvedData,\n },\n };\n } else {\n inherited = {\n params: {...route.params},\n data: {...route.data},\n resolve: {...route.data, ...(route._resolvedData ?? {})},\n };\n }\n\n if (routeConfig && hasStaticTitle(routeConfig)) {\n inherited.resolve[RouteTitleKey] = routeConfig.title;\n }\n return inherited;\n}\n\n/**\n * @description\n *\n * Contains the information about a route associated with a component loaded in an\n * outlet at a particular moment in time. ActivatedRouteSnapshot can also be used to\n * traverse the router state tree.\n *\n * The following example initializes a component with route information extracted\n * from the snapshot of the root node at the time of creation.\n *\n * ```ts\n * @Component({templateUrl:'./my-component.html'})\n * class MyComponent {\n * constructor(route: ActivatedRoute) {\n * const id: string = route.snapshot.params.id;\n * const url: string = route.snapshot.url.join('');\n * const user = route.snapshot.data.user;\n * }\n * }\n * ```\n *\n * @see [Understanding route snapshots](guide/routing/read-route-state#understanding-route-snapshots)\n *\n * @publicApi\n */\nexport class ActivatedRouteSnapshot {\n /** The configuration used to match this route **/\n public readonly routeConfig: Route | null;\n /** @internal */\n _resolve: ResolveData;\n /** @internal */\n _resolvedData?: Data;\n /** @internal */\n _routerState!: RouterStateSnapshot;\n /** @internal */\n _paramMap?: ParamMap;\n /** @internal */\n _queryParamMap?: ParamMap;\n /** @internal */\n readonly _environmentInjector: EnvironmentInjector;\n\n /** The resolved route title */\n get title(): string | undefined {\n // Note: This _must_ be a getter because the data is mutated in the resolvers. Title will not be\n // available at the time of class instantiation.\n return this.data?.[RouteTitleKey];\n }\n\n /** @internal */\n constructor(\n /** The URL segments matched by this route */\n public url: UrlSegment[],\n /**\n * The matrix parameters scoped to this route.\n *\n * You can compute all params (or data) in the router state or to get params outside\n * of an activated component by traversing the `RouterState` tree as in the following\n * example:\n * ```ts\n * collectRouteParams(router: Router) {\n * let params = {};\n * let stack: ActivatedRouteSnapshot[] = [router.routerState.snapshot.root];\n * while (stack.length > 0) {\n * const route = stack.pop()!;\n * params = {...params, ...route.params};\n * stack.push(...route.children);\n * }\n * return params;\n * }\n * ```\n */\n public params: Params,\n /** The query parameters shared by all the routes */\n public queryParams: Params,\n /** The URL fragment shared by all the routes */\n public fragment: string | null,\n /** The static and resolved data of this route */\n public data: Data,\n /** The outlet name of the route */\n public outlet: string,\n /** The component of the route */\n public component: Type<any> | null,\n routeConfig: Route | null,\n resolve: ResolveData,\n environmentInjector: EnvironmentInjector,\n ) {\n this.routeConfig = routeConfig;\n this._resolve = resolve;\n this._environmentInjector = environmentInjector;\n }\n\n /** The root of the router state */\n get root(): ActivatedRouteSnapshot {\n return this._routerState.root;\n }\n\n /** The parent of this route in the router state tree */\n get parent(): ActivatedRouteSnapshot | null {\n return this._routerState.parent(this);\n }\n\n /** The first child of this route in the router state tree */\n get firstChild(): ActivatedRouteSnapshot | null {\n return this._routerState.firstChild(this);\n }\n\n /** The children of this route in the router state tree */\n get children(): ActivatedRouteSnapshot[] {\n return this._routerState.children(this);\n }\n\n /** The path from the root of the router state tree to this route */\n get pathFromRoot(): ActivatedRouteSnapshot[] {\n return this._routerState.pathFromRoot(this);\n }\n\n get paramMap(): ParamMap {\n this._paramMap ??= convertToParamMap(this.params);\n return this._paramMap;\n }\n\n get queryParamMap(): ParamMap {\n this._queryParamMap ??= convertToParamMap(this.queryParams);\n return this._queryParamMap;\n }\n\n toString(): string {\n const url = this.url.map((segment) => segment.toString()).join('/');\n const matched = this.routeConfig ? this.routeConfig.path : '';\n return `Route(url:'${url}', path:'${matched}')`;\n }\n}\n\n/**\n * @description\n *\n * Represents the state of the router at a moment in time.\n *\n * This is a tree of activated route snapshots. Every node in this tree knows about\n * the \"consumed\" URL segments, the extracted parameters, and the resolved data.\n *\n * The following example shows how a component is initialized with information\n * from the snapshot of the root node's state at the time of creation.\n *\n * ```ts\n * @Component({templateUrl:'template.html'})\n * class MyComponent {\n * constructor(router: Router) {\n * const state: RouterState = router.routerState;\n * const snapshot: RouterStateSnapshot = state.snapshot;\n * const root: ActivatedRouteSnapshot = snapshot.root;\n * const child = root.firstChild;\n * const id: Observable<string> = child.params.map(p => p.id);\n * //...\n * }\n * }\n * ```\n *\n * @publicApi\n */\nexport class RouterStateSnapshot extends Tree<ActivatedRouteSnapshot> {\n /** @internal */\n constructor(\n /** The url from which this snapshot was created */\n public url: string,\n root: TreeNode<ActivatedRouteSnapshot>,\n ) {\n super(root);\n setRouterState(<RouterStateSnapshot>this, root);\n }\n\n override toString(): string {\n return serializeNode(this._root);\n }\n}\n\nfunction setRouterState<U, T extends {_routerState: U}>(state: U, node: TreeNode<T>): void {\n node.value._routerState = state;\n node.children.forEach((c) => setRouterState(state, c));\n}\n\nfunction serializeNode(node: TreeNode<ActivatedRouteSnapshot>): string {\n const c = node.children.length > 0 ? ` { ${node.children.map(serializeNode).join(', ')} } ` : '';\n return `${node.value}${c}`;\n}\n\n/**\n * The expectation is that the activate route is created with the right set of parameters.\n * So we push new values into the observables only when they are not the initial values.\n * And we detect that by checking if the snapshot field is set.\n */\nexport function advanceActivatedRoute(route: ActivatedRoute): void {\n if (route.snapshot) {\n const currentSnapshot = route.snapshot;\n const nextSnapshot = route._futureSnapshot;\n route.snapshot = nextSnapshot;\n if (!shallowEqual(currentSnapshot.queryParams, nextSnapshot.queryParams)) {\n route.queryParamsSubject.next(nextSnapshot.queryParams);\n }\n if (currentSnapshot.fragment !== nextSnapshot.fragment) {\n route.fragmentSubject.next(nextSnapshot.fragment);\n }\n if (!shallowEqual(currentSnapshot.params, nextSnapshot.params)) {\n route.paramsSubject.next(nextSnapshot.params);\n }\n if (!shallowEqualArrays(currentSnapshot.url, nextSnapshot.url)) {\n route.urlSubject.next(nextSnapshot.url);\n }\n if (!shallowEqual(currentSnapshot.data, nextSnapshot.data)) {\n route.dataSubject.next(nextSnapshot.data);\n }\n } else {\n route.snapshot = route._futureSnapshot;\n\n // this is for resolved data\n route.dataSubject.next(route._futureSnapshot.data);\n }\n}\n\nexport function equalParamsAndUrlSegments(\n a: ActivatedRouteSnapshot,\n b: ActivatedRouteSnapshot,\n): boolean {\n const equalUrlParams = shallowEqual(a.params, b.params) && equalSegments(a.url, b.url);\n const parentsMismatch = !a.parent !== !b.parent;\n\n return (\n equalUrlParams &&\n !parentsMismatch &&\n (!a.parent || equalParamsAndUrlSegments(a.parent, b.parent!))\n );\n}\n\nexport function hasStaticTitle(config: Route) {\n return typeof config.title === 'string' || config.title === null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n ChangeDetectorRef,\n ComponentRef,\n Directive,\n EnvironmentInjector,\n EventEmitter,\n inject,\n Injectable,\n InjectionToken,\n Injector,\n Input,\n input,\n OnDestroy,\n OnInit,\n Output,\n reflectComponentType,\n ɵRuntimeError as RuntimeError,\n Signal,\n SimpleChanges,\n ViewContainerRef,\n} from '@angular/core';\nimport {combineLatest, of, Subscription} from 'rxjs';\nimport {switchMap} from 'rxjs/operators';\n\nimport {RuntimeErrorCode} from '../errors';\nimport {Data} from '../models';\nimport {ChildrenOutletContexts} from '../router_outlet_context';\nimport {ActivatedRoute} from '../router_state';\nimport {PRIMARY_OUTLET} from '../shared';\n\n/**\n * An `InjectionToken` provided by the `RouterOutlet` and can be set using the `routerOutletData`\n * input.\n *\n * When unset, this value is `null` by default.\n *\n * @usageNotes\n *\n * To set the data from the template of the component with `router-outlet`:\n * ```html\n * <router-outlet [routerOutletData]=\"{name: 'Angular'}\" />\n * ```\n *\n * To read the data in the routed component:\n * ```ts\n * data = inject(ROUTER_OUTLET_DATA) as Signal<{name: string}>;\n * ```\n *\n * @publicApi\n * @see [Page routerOutletData](guide/routing/show-routes-with-outlets#passing-contextual-data-to-routed-components)\n */\nexport const ROUTER_OUTLET_DATA = new InjectionToken<Signal<unknown | undefined>>(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'RouterOutlet data' : '',\n);\n\n/**\n * An interface that defines the contract for developing a component outlet for the `Router`.\n *\n * An outlet acts as a placeholder that Angular dynamically fills based on the current router state.\n *\n * A router outlet should register itself with the `Router` via\n * `ChildrenOutletContexts#onChildOutletCreated` and unregister with\n * `ChildrenOutletContexts#onChildOutletDestroyed`. When the `Router` identifies a matched `Route`,\n * it looks for a registered outlet in the `ChildrenOutletContexts` and activates it.\n *\n * @see {@link ChildrenOutletContexts}\n * @publicApi\n */\nexport interface RouterOutletContract {\n /**\n * Whether the given outlet is activated.\n *\n * An outlet is considered \"activated\" if it has an active component.\n */\n isActivated: boolean;\n\n /** The instance of the activated component or `null` if the outlet is not activated. */\n component: Object | null;\n\n /**\n * The `Data` of the `ActivatedRoute` snapshot.\n */\n activatedRouteData: Data;\n\n /**\n * The `ActivatedRoute` for the outlet or `null` if the outlet is not activated.\n */\n activatedRoute: ActivatedRoute | null;\n\n /**\n * Called by the `Router` when the outlet should activate (create a component).\n */\n activateWith(activatedRoute: ActivatedRoute, environmentInjector: EnvironmentInjector): void;\n\n /**\n * A request to destroy the currently activated component.\n *\n * When a `RouteReuseStrategy` indicates that an `ActivatedRoute` should be removed but stored for\n * later re-use rather than destroyed, the `Router` will call `detach` instead.\n */\n deactivate(): void;\n\n /**\n * Called when the `RouteReuseStrategy` instructs to detach the subtree.\n *\n * This is similar to `deactivate`, but the activated component should _not_ be destroyed.\n * Instead, it is returned so that it can be reattached later via the `attach` method.\n */\n detach(): ComponentRef<unknown>;\n\n /**\n * Called when the `RouteReuseStrategy` instructs to re-attach a previously detached subtree.\n */\n attach(ref: ComponentRef<unknown>, activatedRoute: ActivatedRoute): void;\n\n /**\n * Emits an activate event when a new component is instantiated\n **/\n activateEvents?: EventEmitter<unknown>;\n\n /**\n * Emits a deactivate event when a component is destroyed.\n */\n deactivateEvents?: EventEmitter<unknown>;\n\n /**\n * Emits an attached component instance when the `RouteReuseStrategy` instructs to re-attach a\n * previously detached subtree.\n **/\n attachEvents?: EventEmitter<unknown>;\n\n /**\n * Emits a detached component instance when the `RouteReuseStrategy` instructs to detach the\n * subtree.\n */\n detachEvents?: EventEmitter<unknown>;\n\n /**\n * Used to indicate that the outlet is able to bind data from the `Router` to the outlet\n * component's inputs.\n *\n * When this is `undefined` or `false` and the developer has opted in to the\n * feature using `withComponentInputBinding`, a warning will be logged in dev mode if this outlet\n * is used in the application.\n */\n readonly supportsBindingToComponentInputs?: true;\n}\n\n/**\n * @description\n *\n * Acts as a placeholder that Angular dynamically fills based on the current router state.\n *\n * Each outlet can have a unique name, determined by the optional `name` attribute.\n * The name cannot be set or changed dynamically. If not set, default value is \"primary\".\n *\n * ```html\n * <router-outlet></router-outlet>\n * <router-outlet name='left'></router-outlet>\n * <router-outlet name='right'></router-outlet>\n * ```\n *\n * Named outlets can be the targets of secondary routes.\n * The `Route` object for a secondary route has an `outlet` property to identify the target outlet:\n *\n * `{path: <base-path>, component: <component>, outlet: <target_outlet_name>}`\n *\n * Using named outlets and secondary routes, you can target multiple outlets in\n * the same `RouterLink` directive.\n *\n * The router keeps track of separate branches in a navigation tree for each named outlet and\n * generates a representation of that tree in the URL.\n * The URL for a secondary route uses the following syntax to specify both the primary and secondary\n * routes at the same time:\n *\n * `http://base-path/primary-route-path(outlet-name:route-path)`\n *\n * A router outlet emits an activate event when a new component is instantiated,\n * deactivate event when a component is destroyed.\n * An attached event emits when the `RouteReuseStrategy` instructs the outlet to reattach the\n * subtree, and the detached event emits when the `RouteReuseStrategy` instructs the outlet to\n * detach the subtree.\n *\n * ```html\n * <router-outlet\n * (activate)='onActivate($event)'\n * (deactivate)='onDeactivate($event)'\n * (attach)='onAttach($event)'\n * (detach)='onDetach($event)'></router-outlet>\n * ```\n *\n * @see {@link RouterLink}\n * @see {@link Route}\n * @see [Show routes with outlets](guide/routing/show-routes-with-outlets)\n * @ngModule RouterModule\n *\n * @publicApi\n */\n@Directive({\n selector: 'router-outlet',\n exportAs: 'outlet',\n})\nexport class RouterOutlet implements OnDestroy, OnInit, RouterOutletContract {\n private activated: ComponentRef<any> | null = null;\n /** @internal */\n get activatedComponentRef(): ComponentRef<any> | null {\n return this.activated;\n }\n private _activatedRoute: ActivatedRoute | null = null;\n /**\n * The name of the outlet\n *\n */\n @Input() name = PRIMARY_OUTLET;\n\n @Output('activate') activateEvents = new EventEmitter<any>();\n @Output('deactivate') deactivateEvents = new EventEmitter<any>();\n /**\n * Emits an attached component instance when the `RouteReuseStrategy` instructs to re-attach a\n * previously detached subtree.\n **/\n @Output('attach') attachEvents = new EventEmitter<unknown>();\n /**\n * Emits a detached component instance when the `RouteReuseStrategy` instructs to detach the\n * subtree.\n */\n @Output('detach') detachEvents = new EventEmitter<unknown>();\n\n /**\n * Data that will be provided to the child injector through the `ROUTER_OUTLET_DATA` token.\n *\n * When unset, the value of the token is `undefined` by default.\n */\n readonly routerOutletData = input<unknown>();\n\n private parentContexts = inject(ChildrenOutletContexts);\n private location = inject(ViewContainerRef);\n private changeDetector = inject(ChangeDetectorRef);\n private inputBinder = inject(INPUT_BINDER, {optional: true});\n /** @docs-private */\n readonly supportsBindingToComponentInputs = true;\n\n /** @docs-private */\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['name']) {\n const {firstChange, previousValue} = changes['name'];\n if (firstChange) {\n // The first change is handled by ngOnInit. Because ngOnChanges doesn't get called when no\n // input is set at all, we need to centrally handle the first change there.\n return;\n }\n\n // unregister with the old name\n if (this.isTrackedInParentContexts(previousValue)) {\n this.deactivate();\n this.parentContexts.onChildOutletDestroyed(previousValue);\n }\n // register the new name\n this.initializeOutletWithName();\n }\n }\n\n /** @docs-private */\n ngOnDestroy(): void {\n // Ensure that the registered outlet is this one before removing it on the context.\n if (this.isTrackedInParentContexts(this.name)) {\n this.parentContexts.onChildOutletDestroyed(this.name);\n }\n this.inputBinder?.unsubscribeFromRouteData(this);\n }\n\n private isTrackedInParentContexts(outletName: string) {\n return this.parentContexts.getContext(outletName)?.outlet === this;\n }\n\n /** @docs-private */\n ngOnInit(): void {\n this.initializeOutletWithName();\n }\n\n private initializeOutletWithName() {\n this.parentContexts.onChildOutletCreated(this.name, this);\n if (this.activated) {\n return;\n }\n\n // If the outlet was not instantiated at the time the route got activated we need to populate\n // the outlet when it is initialized (ie inside a NgIf)\n const context = this.parentContexts.getContext(this.name);\n if (context?.route) {\n if (context.attachRef) {\n // `attachRef` is populated when there is an existing component to mount\n this.attach(context.attachRef, context.route);\n } else {\n // otherwise the component defined in the configuration is created\n this.activateWith(context.route, context.injector);\n }\n }\n }\n\n get isActivated(): boolean {\n return !!this.activated;\n }\n\n /**\n * @returns The currently activated component instance.\n * @throws An error if the outlet is not activated.\n */\n get component(): Object {\n if (!this.activated)\n throw new RuntimeError(\n RuntimeErrorCode.OUTLET_NOT_ACTIVATED,\n (typeof ngDevMode === 'undefined' || ngDevMode) && 'Outlet is not activated',\n );\n return this.activated.instance;\n }\n\n get activatedRoute(): ActivatedRoute {\n if (!this.activated)\n throw new RuntimeError(\n RuntimeErrorCode.OUTLET_NOT_ACTIVATED,\n (typeof ngDevMode === 'undefined' || ngDevMode) && 'Outlet is not activated',\n );\n return this._activatedRoute as ActivatedRoute;\n }\n\n get activatedRouteData(): Data {\n if (this._activatedRoute) {\n return this._activatedRoute.snapshot.data;\n }\n return {};\n }\n\n /**\n * Called when the `RouteReuseStrategy` instructs to detach the subtree\n */\n detach(): ComponentRef<any> {\n if (!this.activated)\n throw new RuntimeError(\n RuntimeErrorCode.OUTLET_NOT_ACTIVATED,\n (typeof ngDevMode === 'undefined' || ngDevMode) && 'Outlet is not activated',\n );\n this.location.detach();\n const cmp = this.activated;\n this.activated = null;\n this._activatedRoute = null;\n this.detachEvents.emit(cmp.instance);\n return cmp;\n }\n\n /**\n * Called when the `RouteReuseStrategy` instructs to re-attach a previously detached subtree\n */\n attach(ref: ComponentRef<any>, activatedRoute: ActivatedRoute): void {\n this.activated = ref;\n this._activatedRoute = activatedRoute;\n this.location.insert(ref.hostView);\n this.inputBinder?.bindActivatedRouteToOutletComponent(this);\n this.attachEvents.emit(ref.instance);\n }\n\n deactivate(): void {\n if (this.activated) {\n const c = this.component;\n this.activated.destroy();\n this.activated = null;\n this._activatedRoute = null;\n this.deactivateEvents.emit(c);\n }\n }\n\n activateWith(activatedRoute: ActivatedRoute, environmentInjector: EnvironmentInjector): void {\n if (this.isActivated) {\n throw new RuntimeError(\n RuntimeErrorCode.OUTLET_ALREADY_ACTIVATED,\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n 'Cannot activate an already activated outlet',\n );\n }\n this._activatedRoute = activatedRoute;\n const location = this.location;\n const snapshot = activatedRoute.snapshot;\n const component = snapshot.component!;\n const childContexts = this.parentContexts.getOrCreateContext(this.name).children;\n const injector = new OutletInjector(\n activatedRoute,\n childContexts,\n location.injector,\n this.routerOutletData,\n );\n\n this.activated = location.createComponent(component, {\n index: location.length,\n injector,\n environmentInjector: environmentInjector,\n });\n // Calling `markForCheck` to make sure we will run the change detection when the\n // `RouterOutlet` is inside a `ChangeDetectionStrategy.OnPush` component.\n this.changeDetector.markForCheck();\n this.inputBinder?.bindActivatedRouteToOutletComponent(this);\n this.activateEvents.emit(this.activated.instance);\n }\n}\n\nclass OutletInjector implements Injector {\n constructor(\n private route: ActivatedRoute,\n private childContexts: ChildrenOutletContexts,\n private parent: Injector,\n private outletData: Signal<unknown>,\n ) {}\n\n get(token: any, notFoundValue?: any): any {\n if (token === ActivatedRoute) {\n return this.route;\n }\n\n if (token === ChildrenOutletContexts) {\n return this.childContexts;\n }\n\n if (token === ROUTER_OUTLET_DATA) {\n return this.outletData;\n }\n\n return this.parent.get(token, notFoundValue);\n }\n}\n\nexport const INPUT_BINDER = new InjectionToken<RoutedComponentInputBinder>(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'Router Input Binder' : '',\n);\n\n/**\n * Injectable used as a tree-shakable provider for opting in to binding router data to component\n * inputs.\n *\n * The RouterOutlet registers itself with this service when an `ActivatedRoute` is attached or\n * activated. When this happens, the service subscribes to the `ActivatedRoute` observables (params,\n * queryParams, data) and sets the inputs of the component using `ComponentRef.setInput`.\n * Importantly, when an input does not have an item in the route data with a matching key, this\n * input is set to `undefined`. If it were not done this way, the previous information would be\n * retained if the data got removed from the route (i.e. if a query parameter is removed).\n *\n * The `RouterOutlet` should unregister itself when destroyed via `unsubscribeFromRouteData` so that\n * the subscriptions are cleaned up.\n */\n@Injectable()\nexport class RoutedComponentInputBinder {\n private outletDataSubscriptions = new Map<RouterOutlet, Subscription>();\n\n bindActivatedRouteToOutletComponent(outlet: RouterOutlet): void {\n this.unsubscribeFromRouteData(outlet);\n this.subscribeToRouteData(outlet);\n }\n\n unsubscribeFromRouteData(outlet: RouterOutlet): void {\n this.outletDataSubscriptions.get(outlet)?.unsubscribe();\n this.outletDataSubscriptions.delete(outlet);\n }\n\n private subscribeToRouteData(outlet: RouterOutlet) {\n const {activatedRoute} = outlet;\n const dataSubscription = combineLatest([\n activatedRoute.queryParams,\n activatedRoute.params,\n activatedRoute.data,\n ])\n .pipe(\n switchMap(([queryParams, params, data], index) => {\n data = {...queryParams, ...params, ...data};\n // Get the first result from the data subscription synchronously so it's available to\n // the component as soon as possible (and doesn't require a second change detection).\n if (index === 0) {\n return of(data);\n }\n // Promise.resolve is used to avoid synchronously writing the wrong data when\n // two of the Observables in the `combineLatest` stream emit one after\n // another.\n return Promise.resolve(data);\n }),\n )\n .subscribe((data) => {\n // Outlet may have been deactivated or changed names to be associated with a different\n // route\n if (\n !outlet.isActivated ||\n !outlet.activatedComponentRef ||\n outlet.activatedRoute !== activatedRoute ||\n activatedRoute.component === null\n ) {\n this.unsubscribeFromRouteData(outlet);\n return;\n }\n\n const mirror = reflectComponentType(activatedRoute.component);\n if (!mirror) {\n this.unsubscribeFromRouteData(outlet);\n return;\n }\n\n for (const {templateName} of mirror.inputs) {\n outlet.activatedComponentRef.setInput(templateName, data[templateName]);\n }\n });\n\n this.outletDataSubscriptions.set(outlet, dataSubscription);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Component} from '@angular/core';\n\nimport {RouterOutlet} from '../directives/router_outlet';\nimport {PRIMARY_OUTLET} from '../shared';\nimport {Route} from '../models';\nexport {ɵEmptyOutletComponent as EmptyOutletComponent};\n\n/**\n * This component is used internally within the router to be a placeholder when an empty\n * router-outlet is needed. For example, with a config such as:\n *\n * `{path: 'parent', outlet: 'nav', children: [...]}`\n *\n * In order to render, there needs to be a component on this config, which will default\n * to this `EmptyOutletComponent`.\n */\n@Component({\n template: `<router-outlet />`,\n imports: [RouterOutlet],\n // Used to avoid component ID collisions with user code.\n exportAs: 'emptyRouterOutlet',\n})\nexport class ɵEmptyOutletComponent {}\n\n/**\n * Makes a copy of the config and adds any default required properties.\n */\nexport function standardizeConfig(r: Route): Route {\n const children = r.children && r.children.map(standardizeConfig);\n const c = children ? {...r, children} : {...r};\n if (\n !c.component &&\n !c.loadComponent &&\n (children || c.loadChildren) &&\n c.outlet &&\n c.outlet !== PRIMARY_OUTLET\n ) {\n c.component = ɵEmptyOutletComponent;\n }\n return c;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {BehaviorSubject} from 'rxjs';\n\nimport {DetachedRouteHandleInternal, RouteReuseStrategy} from './route_reuse_strategy';\nimport {\n ActivatedRoute,\n ActivatedRouteSnapshot,\n RouterState,\n RouterStateSnapshot,\n} from './router_state';\nimport {TreeNode} from './utils/tree';\n\nexport function createRouterState(\n routeReuseStrategy: RouteReuseStrategy,\n curr: RouterStateSnapshot,\n prevState: RouterState,\n): RouterState {\n const root = createNode(routeReuseStrategy, curr._root, prevState ? prevState._root : undefined);\n return new RouterState(root, curr);\n}\n\nfunction createNode(\n routeReuseStrategy: RouteReuseStrategy,\n curr: TreeNode<ActivatedRouteSnapshot>,\n prevState?: TreeNode<ActivatedRoute>,\n): TreeNode<ActivatedRoute> {\n // reuse an activated route that is currently displayed on the screen\n if (prevState && routeReuseStrategy.shouldReuseRoute(curr.value, prevState.value.snapshot)) {\n const value = prevState.value;\n value._futureSnapshot = curr.value;\n const children = createOrReuseChildren(routeReuseStrategy, curr, prevState);\n return new TreeNode<ActivatedRoute>(value, children);\n } else {\n if (routeReuseStrategy.shouldAttach(curr.value)) {\n // retrieve an activated route that is used to be displayed, but is not currently displayed\n const detachedRouteHandle = routeReuseStrategy.retrieve(curr.value);\n if (detachedRouteHandle !== null) {\n const tree = (detachedRouteHandle as DetachedRouteHandleInternal).route;\n tree.value._futureSnapshot = curr.value;\n tree.children = curr.children.map((c) => createNode(routeReuseStrategy, c));\n return tree;\n }\n }\n\n const value = createActivatedRoute(curr.value);\n const children = curr.children.map((c) => createNode(routeReuseStrategy, c));\n return new TreeNode<ActivatedRoute>(value, children);\n }\n}\n\nfunction createOrReuseChildren(\n routeReuseStrategy: RouteReuseStrategy,\n curr: TreeNode<ActivatedRouteSnapshot>,\n prevState: TreeNode<ActivatedRoute>,\n) {\n return curr.children.map((child) => {\n for (const p of prevState.children) {\n if (routeReuseStrategy.shouldReuseRoute(child.value, p.value.snapshot)) {\n return createNode(routeReuseStrategy, child, p);\n }\n }\n return createNode(routeReuseStrategy, child);\n });\n}\n\nfunction createActivatedRoute(c: ActivatedRouteSnapshot) {\n return new ActivatedRoute(\n new BehaviorSubject(c.url),\n new BehaviorSubject(c.params),\n new BehaviorSubject(c.queryParams),\n new BehaviorSubject(c.fragment),\n new BehaviorSubject(c.data),\n c.outlet,\n c.component,\n c,\n );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n EnvironmentInjector,\n EnvironmentProviders,\n NgModuleFactory,\n Provider,\n ProviderToken,\n Type,\n} from '@angular/core';\nimport {Observable} from 'rxjs';\n\nimport type {ActivatedRouteSnapshot, RouterStateSnapshot} from './router_state';\nimport type {UrlSegment, UrlSegmentGroup, UrlTree} from './url_tree';\n\n/**\n * How to handle a navigation request to the current URL. One of:\n *\n * - `'ignore'` : The router ignores the request if it is the same as the current state.\n * - `'reload'` : The router processes the URL even if it is not different from the current state.\n * One example of when you might want to use this option is if a `canMatch` guard depends on the\n * application state and initially rejects navigation to a route. After fixing the state, you want\n * to re-navigate to the same URL so that the route with the `canMatch` guard can activate.\n *\n * Note that this only configures whether or not the Route reprocesses the URL and triggers related\n * actions and events like redirects, guards, and resolvers. By default, the router re-uses a\n * component instance when it re-navigates to the same component type without visiting a different\n * component first. This behavior is configured by the `RouteReuseStrategy`. In order to reload\n * routed components on same url navigation, you need to set `onSameUrlNavigation` to `'reload'`\n * _and_ provide a `RouteReuseStrategy` which returns `false` for `shouldReuseRoute`. Additionally,\n * resolvers and most guards for routes do not run unless the path or path params have changed\n * (configured by `runGuardsAndResolvers`).\n *\n * @publicApi\n * @see {@link RouteReuseStrategy}\n * @see {@link RunGuardsAndResolvers}\n * @see {@link NavigationBehaviorOptions}\n * @see {@link RouterConfigOptions}\n */\nexport type OnSameUrlNavigation = 'reload' | 'ignore';\n\n/**\n * The `InjectionToken` and `@Injectable` classes for guards are deprecated in favor\n * of plain JavaScript functions instead. Dependency injection can still be achieved using the\n * [`inject`](api/core/inject) function from `@angular/core` and an injectable class can be used as\n * a functional guard using [`inject`](api/core/inject): `canActivate: [() =>\n * inject(myGuard).canActivate()]`.\n *\n * @deprecated\n * @see {@link CanMatchFn}\n * @see {@link CanLoadFn}\n * @see {@link CanActivateFn}\n * @see {@link CanActivateChildFn}\n * @see {@link CanDeactivateFn}\n * @see {@link /api/core/inject inject}\n * @publicApi\n */\nexport type DeprecatedGuard = ProviderToken<any> | string;\n\n/**\n * The `InjectionToken` and `@Injectable` classes for resolvers are deprecated in favor\n * of plain JavaScript functions instead. Dependency injection can still be achieved using the\n * [`inject`](api/core/inject) function from `@angular/core` and an injectable class can be used as\n * a functional guard using [`inject`](api/core/inject): `myResolvedData: () => inject(MyResolver).resolve()`.\n *\n * @deprecated\n * @see {@link ResolveFn}\n * @see {@link /api/core/inject inject}\n * @publicApi\n */\nexport type DeprecatedResolve = DeprecatedGuard | any;\n\n/**\n * The supported types that can be returned from a `Router` guard.\n *\n * @see [Routing guide](guide/routing/common-router-tasks#preventing-unauthorized-access)\n * @publicApi\n */\nexport type GuardResult = boolean | UrlTree | RedirectCommand;\n\n/**\n * Can be returned by a `Router` guard to instruct the `Router` to redirect rather than continue\n * processing the path of the in-flight navigation. The `redirectTo` indicates _where_ the new\n * navigation should go to and the optional `navigationBehaviorOptions` can provide more information\n * about _how_ to perform the navigation.\n *\n * ```ts\n * const route: Route = {\n * path: \"user/:userId\",\n * component: User,\n * canActivate: [\n * () => {\n * const router = inject(Router);\n * const authService = inject(AuthenticationService);\n *\n * if (!authService.isLoggedIn()) {\n * const loginPath = router.parseUrl(\"/login\");\n * return new RedirectCommand(loginPath, {\n * skipLocationChange: true,\n * });\n * }\n *\n * return true;\n * },\n * ],\n * };\n * ```\n * @see [Routing guide](guide/routing/common-router-tasks#preventing-unauthorized-access)\n *\n * @publicApi\n */\nexport class RedirectCommand {\n constructor(\n readonly redirectTo: UrlTree,\n readonly navigationBehaviorOptions?: NavigationBehaviorOptions,\n ) {}\n}\n\n/**\n * Type used to represent a value which may be synchronous or async.\n *\n * @publicApi\n */\nexport type MaybeAsync<T> = T | Observable<T> | Promise<T>;\n\n/**\n * Represents a route configuration for the Router service.\n * An array of `Route` objects, used in `Router.config` and for nested route configurations\n * in `Route.children`.\n *\n * @see {@link Route}\n * @see {@link Router}\n * @see [Router configuration guide](guide/routing/router-reference#configuration)\n * @publicApi\n */\nexport type Routes = Route[];\n\n/**\n * Represents the result of matching URLs with a custom matching function.\n *\n * * `consumed` is an array of the consumed URL segments.\n * * `posParams` is a map of positional parameters.\n *\n * @see {@link UrlMatcher}\n * @publicApi\n */\nexport type UrlMatchResult = {\n consumed: UrlSegment[];\n posParams?: {[name: string]: UrlSegment};\n};\n\n/**\n * A function for matching a route against URLs. Implement a custom URL matcher\n * for `Route.matcher` when a combination of `path` and `pathMatch`\n * is not expressive enough. Cannot be used together with `path` and `pathMatch`.\n *\n * The function takes the following arguments and returns a `UrlMatchResult` object.\n * * *segments* : An array of URL segments.\n * * *group* : A segment group.\n * * *route* : The route to match against.\n *\n * The following example implementation matches HTML files.\n *\n * ```ts\n * export function htmlFiles(url: UrlSegment[]) {\n * return url.length === 1 && url[0].path.endsWith('.html') ? ({consumed: url}) : null;\n * }\n *\n * export const routes = [{ matcher: htmlFiles, component: AnyComponent }];\n * ```\n *\n * @see [Creating custom route matches](guide/routing/routing-with-urlmatcher)\n * @publicApi\n */\nexport type UrlMatcher = (\n segments: UrlSegment[],\n group: UrlSegmentGroup,\n route: Route,\n) => UrlMatchResult | null;\n\n/**\n *\n * Represents static data associated with a particular route.\n *\n * @see {@link Route#data}\n *\n * @publicApi\n */\nexport type Data = {\n [key: string | symbol]: any;\n};\n\n/**\n *\n * Represents the resolved data associated with a particular route.\n *\n * Returning a `RedirectCommand` directs the router to cancel the current navigation and redirect to\n * the location provided in the `RedirectCommand`. Note that there are no ordering guarantees when\n * resolvers execute. If multiple resolvers would return a `RedirectCommand`, only the first one\n * returned will be used.\n *\n * @see {@link Route#resolve}\n *\n * @publicApi\n */\nexport type ResolveData = {\n [key: string | symbol]: ResolveFn<unknown> | DeprecatedResolve;\n};\n\n/**\n * An ES Module object with a default export of the given type.\n *\n * @see {@link Route#loadComponent}\n * @see {@link LoadChildrenCallback}\n *\n * @publicApi\n */\nexport interface DefaultExport<T> {\n /**\n * Default exports are bound under the name `\"default\"`, per the ES Module spec:\n * https://tc39.es/ecma262/#table-export-forms-mapping-to-exportentry-records\n */\n default: T;\n}\n\n/**\n *\n * A function that is called to resolve a collection of lazy-loaded routes.\n * Must be an arrow function of the following form:\n * `() => import('...').then(mod => mod.MODULE)`\n * or\n * `() => import('...').then(mod => mod.ROUTES)`\n *\n * For example:\n *\n * ```ts\n * [{\n * path: 'lazy',\n * loadChildren: () => import('./lazy-route/lazy.module').then(mod => mod.LazyModule),\n * }];\n * ```\n * or\n * ```ts\n * [{\n * path: 'lazy',\n * loadChildren: () => import('./lazy-route/lazy.routes').then(mod => mod.ROUTES),\n * }];\n * ```\n *\n * If the lazy-loaded routes are exported via a `default` export, the `.then` can be omitted:\n * ```ts\n * [{\n * path: 'lazy',\n * loadChildren: () => import('./lazy-route/lazy.routes'),\n * }];\n * ```\n *\n * @see {@link Route#loadChildren}\n * @publicApi\n */\nexport type LoadChildrenCallback = () =>\n | Type<any>\n | NgModuleFactory<any>\n | Routes\n | Observable<Type<any> | Routes | DefaultExport<Type<any>> | DefaultExport<Routes>>\n | Promise<\n NgModuleFactory<any> | Type<any> | Routes | DefaultExport<Type<any>> | DefaultExport<Routes>\n >;\n\n/**\n *\n * A function that returns a set of routes to load.\n *\n * @see {@link LoadChildrenCallback}\n * @publicApi\n */\nexport type LoadChildren = LoadChildrenCallback;\n\n/**\n *\n * How to handle query parameters in a router link.\n * One of:\n * - `\"merge\"` : Merge new parameters with current parameters.\n * - `\"preserve\"` : Preserve current parameters.\n * - `\"replace\"` : Replace current parameters with new parameters. This is the default behavior.\n * - `\"\"` : For legacy reasons, the same as `'replace'`.\n *\n * @see {@link UrlCreationOptions#queryParamsHandling}\n * @see {@link RouterLink}\n * @publicApi\n */\nexport type QueryParamsHandling = 'merge' | 'preserve' | 'replace' | '';\n\n/**\n * The type for the function that can be used to handle redirects when the path matches a `Route` config.\n *\n * The `RedirectFunction` does _not_ have access to the full\n * `ActivatedRouteSnapshot` interface. Some data are not accurately known\n * at the route matching phase. For example, resolvers are not run until\n * later, so any resolved title would not be populated. The same goes for lazy\n * loaded components. This is also true for all the snapshots up to the\n * root, so properties that include parents (root, parent, pathFromRoot)\n * are also excluded. And naturally, the full route matching hasn't yet\n * happened so firstChild and children are not available either.\n *\n * @see {@link Route#redirectTo}\n * @publicApi\n */\nexport type RedirectFunction = (\n redirectData: Pick<\n ActivatedRouteSnapshot,\n | 'routeConfig'\n | 'url'\n | 'params'\n | 'queryParams'\n | 'fragment'\n | 'data'\n | 'outlet'\n | 'title'\n | 'paramMap'\n | 'queryParamMap'\n >,\n) => MaybeAsync<string | UrlTree>;\n\n/**\n * A policy for when to run guards and resolvers on a route.\n *\n * Guards and/or resolvers will always run when a route is activated or deactivated. When a route is\n * unchanged, the default behavior is the same as `paramsChange`.\n *\n * `paramsChange` : Rerun the guards and resolvers when path or\n * path param changes. This does not include query parameters. This option is the default.\n * - `always` : Run on every execution.\n * - `pathParamsChange` : Rerun guards and resolvers when the path params\n * change. This does not compare matrix or query parameters.\n * - `paramsOrQueryParamsChange` : Run when path, matrix, or query parameters change.\n * - `pathParamsOrQueryParamsChange` : Rerun guards and resolvers when the path params\n * change or query params have changed. This does not include matrix parameters.\n *\n * @see {@link Route#runGuardsAndResolvers}\n * @see [Control when guards and resolvers execute](guide/routing/customizing-route-behavior#control-when-guards-and-resolvers-execute)\n * @publicApi\n */\nexport type RunGuardsAndResolvers =\n | 'pathParamsChange'\n | 'pathParamsOrQueryParamsChange'\n | 'paramsChange'\n | 'paramsOrQueryParamsChange'\n | 'always'\n | ((from: ActivatedRouteSnapshot, to: ActivatedRouteSnapshot) => boolean);\n\n/**\n * A configuration object that defines a single route.\n * A set of routes are collected in a `Routes` array to define a `Router` configuration.\n * The router attempts to match segments of a given URL against each route,\n * using the configuration options defined in this object.\n *\n * Supports static, parameterized, redirect, and wildcard routes, as well as\n * custom route data and resolve methods.\n *\n * For detailed usage information, see the [Routing Guide](guide/routing/common-router-tasks).\n *\n * @usageNotes\n *\n * ### Simple Configuration\n *\n * The following route specifies that when navigating to, for example,\n * `/team/11/user/bob`, the router creates the 'Team' component\n * with the 'User' child component in it.\n *\n * ```ts\n * [{\n * path: 'team/:id',\n * component: Team,\n * children: [{\n * path: 'user/:name',\n * component: User\n * }]\n * }]\n * ```\n *\n * ### Multiple Outlets\n *\n * The following route creates sibling components with multiple outlets.\n * When navigating to `/team/11(aux:chat/jim)`, the router creates the 'Team' component next to\n * the 'Chat' component. The 'Chat' component is placed into the 'aux' outlet.\n *\n * ```ts\n * [{\n * path: 'team/:id',\n * component: Team\n * }, {\n * path: 'chat/:user',\n * component: Chat\n * outlet: 'aux'\n * }]\n * ```\n *\n * ### Wild Cards\n *\n * The following route uses wild-card notation to specify a component\n * that is always instantiated regardless of where you navigate to.\n *\n * ```ts\n * [{\n * path: '**',\n * component: WildcardComponent\n * }]\n * ```\n *\n * ### Redirects\n *\n * The following route uses the `redirectTo` property to ignore a segment of\n * a given URL when looking for a child path.\n *\n * When navigating to '/team/11/legacy/user/jim', the router changes the URL segment\n * '/team/11/legacy/user/jim' to '/team/11/user/jim', and then instantiates\n * the Team component with the User child component in it.\n *\n * ```ts\n * [{\n * path: 'team/:id',\n * component: Team,\n * children: [{\n * path: 'legacy/user/:name',\n * redirectTo: 'user/:name'\n * }, {\n * path: 'user/:name',\n * component: User\n * }]\n * }]\n * ```\n *\n * The redirect path can be relative, as shown in this example, or absolute.\n * If we change the `redirectTo` value in the example to the absolute URL segment '/user/:name',\n * the result URL is also absolute, '/user/jim'.\n\n * ### Empty Path\n *\n * Empty-path route configurations can be used to instantiate components that do not 'consume'\n * any URL segments.\n *\n * In the following configuration, when navigating to\n * `/team/11`, the router instantiates the 'AllUsers' component.\n *\n * ```ts\n * [{\n * path: 'team/:id',\n * component: Team,\n * children: [{\n * path: '',\n * component: AllUsers\n * }, {\n * path: 'user/:name',\n * component: User\n * }]\n * }]\n * ```\n *\n * Empty-path routes can have children. In the following example, when navigating\n * to `/team/11/user/jim`, the router instantiates the wrapper component with\n * the user component in it.\n *\n * Note that an empty path route inherits its parent's parameters and data.\n *\n * ```ts\n * [{\n * path: 'team/:id',\n * component: Team,\n * children: [{\n * path: '',\n * component: WrapperCmp,\n * children: [{\n * path: 'user/:name',\n * component: User\n * }]\n * }]\n * }]\n * ```\n *\n * ### Matching Strategy\n *\n * The default path-match strategy is 'prefix', which means that the router\n * checks URL elements from the left to see if the URL matches a specified path.\n * For example, '/team/11/user' matches 'team/:id'.\n *\n * ```ts\n * [{\n * path: '',\n * pathMatch: 'prefix', //default\n * redirectTo: 'main'\n * }, {\n * path: 'main',\n * component: Main\n * }]\n * ```\n *\n * You can specify the path-match strategy 'full' to make sure that the path\n * covers the whole unconsumed URL. It is important to do this when redirecting\n * empty-path routes. Otherwise, because an empty path is a prefix of any URL,\n * the router would apply the redirect even when navigating to the redirect destination,\n * creating an endless loop.\n *\n * In the following example, supplying the 'full' `pathMatch` strategy ensures\n * that the router applies the redirect if and only if navigating to '/'.\n *\n * ```ts\n * [{\n * path: '',\n * pathMatch: 'full',\n * redirectTo: 'main'\n * }, {\n * path: 'main',\n * component: Main\n * }]\n * ```\n *\n * ### Componentless Routes\n *\n * You can share parameters between sibling components.\n * For example, suppose that two sibling components should go next to each other,\n * and both of them require an ID parameter. You can accomplish this using a route\n * that does not specify a component at the top level.\n *\n * In the following example, 'MainChild' and 'AuxChild' are siblings.\n * When navigating to 'parent/10/(a//aux:b)', the route instantiates\n * the main child and aux child components next to each other.\n * For this to work, the application component must have the primary and aux outlets defined.\n *\n * ```ts\n * [{\n * path: 'parent/:id',\n * children: [\n * { path: 'a', component: MainChild },\n * { path: 'b', component: AuxChild, outlet: 'aux' }\n * ]\n * }]\n * ```\n *\n * The router merges the parameters, data, and resolve of the componentless\n * parent into the parameters, data, and resolve of the children.\n *\n * This is especially useful when child components are defined\n * with an empty path string, as in the following example.\n * With this configuration, navigating to '/parent/10' creates\n * the main child and aux components.\n *\n * ```ts\n * [{\n * path: 'parent/:id',\n * children: [\n * { path: '', component: MainChild },\n * { path: '', component: AuxChild, outlet: 'aux' }\n * ]\n * }]\n * ```\n *\n * ### Lazy Loading\n *\n * Lazy loading speeds up application load time by splitting the application\n * into multiple bundles and loading them on demand.\n * To use lazy loading, provide the `loadChildren` property in the `Route` object,\n * instead of the `children` property.\n *\n * Given the following example route, the router will lazy load\n * the associated module on demand using the browser native import system.\n *\n * ```ts\n * [{\n * path: 'lazy',\n * loadChildren: () => import('./lazy-route/lazy.module').then(mod => mod.LazyModule),\n * }];\n * ```\n *\n * @publicApi\n */\nexport interface Route {\n /**\n * Used to define a page title for the route. This can be a static string or an `Injectable` that\n * implements `Resolve`.\n *\n * @see {@link TitleStrategy}\n * @see [Page titles](guide/routing/define-routes#page-titles)\n */\n title?: string | Type<Resolve<string>> | ResolveFn<string>;\n\n /**\n * The path to match against. Cannot be used together with a custom `matcher` function.\n * A URL string that uses router matching notation.\n * Can be a wild card (`**`) that matches any URL (see Usage Notes below).\n * Default is \"/\" (the root path).\n *\n */\n path?: string;\n /**\n * The path-matching strategy, one of 'prefix' or 'full'.\n * Default is 'prefix'.\n *\n * By default, the router checks URL elements from the left to see if the URL\n * matches a given path and stops when there is a config match. Importantly there must still be a\n * config match for each segment of the URL. For example, '/team/11/user' matches the prefix\n * 'team/:id' if one of the route's children matches the segment 'user'. That is, the URL\n * '/team/11/user' matches the config\n * `{path: 'team/:id', children: [{path: ':user', component: User}]}`\n * but does not match when there are no children as in `{path: 'team/:id', component: Team}`.\n *\n * The path-match strategy 'full' matches against the entire URL.\n * It is important to do this when redirecting empty-path routes.\n * Otherwise, because an empty path is a prefix of any URL,\n * the router would apply the redirect even when navigating\n * to the redirect destination, creating an endless loop.\n *\n * @see [Redirecting Routes](guide/routing/redirecting-routes)\n *\n */\n pathMatch?: 'prefix' | 'full';\n /**\n * A custom URL-matching function. Cannot be used together with `path`.\n *\n * @see [Creating custom route matches](guide/routing/routing-with-urlmatcher)\n *\n */\n matcher?: UrlMatcher;\n /**\n * The component to instantiate when the path matches.\n * Can be empty if child routes specify components.\n */\n component?: Type<any>;\n\n /**\n * An object specifying a lazy-loaded component.\n *\n * @see [Injection context lazy loading](guide/routing/define-routes#injection-context-lazy-loading)\n *\n */\n loadComponent?: () =>\n | Type<unknown>\n | Observable<Type<unknown> | DefaultExport<Type<unknown>>>\n | Promise<Type<unknown> | DefaultExport<Type<unknown>>>;\n /**\n * Filled for routes `loadComponent` once the component is loaded.\n * @internal\n */\n _loadedComponent?: Type<unknown>;\n\n /**\n * A URL or function that returns a URL to redirect to when the path matches.\n *\n * Absolute if the URL begins with a slash (/) or the function returns a `UrlTree`, otherwise\n * relative to the path URL.\n *\n * The `RedirectFunction` is run in an injection context so it can call `inject` to get any\n * required dependencies.\n *\n * When not present, router does not redirect.\n *\n * @see [Conditional redirects](guide/routing/redirecting-routes#conditional-redirects)\n */\n redirectTo?: string | RedirectFunction;\n /**\n * Name of a `RouterOutlet` object where the component can be placed\n * when the path matches.\n *\n * @see [Show routes with outlets](guide/routing/show-routes-with-outlets)\n *\n */\n outlet?: string;\n /**\n * An array of `CanActivateFn` or DI tokens used to look up `CanActivate()`\n * handlers, in order to determine if the current user is allowed to\n * activate the component. By default, any user can activate.\n *\n * When using a function rather than DI tokens, the function can call `inject` to get any required\n * dependencies. This `inject` call must be done in a synchronous context.\n *\n * @see [CanActivate](guide/routing/route-guards#canactivate)\n *\n */\n canActivate?: Array<CanActivateFn | DeprecatedGuard>;\n /**\n * An array of `CanMatchFn` or DI tokens used to look up `CanMatch()`\n * handlers, in order to determine if the current user is allowed to\n * match the `Route`. By default, any route can match.\n *\n * When using a function rather than DI tokens, the function can call `inject` to get any required\n * dependencies. This `inject` call must be done in a synchronous context.\n *\n * @see [CanMatch](guide/routing/route-guards#canmatch)\n *\n */\n canMatch?: Array<CanMatchFn | DeprecatedGuard>;\n /**\n * An array of `CanActivateChildFn` or DI tokens used to look up `CanActivateChild()` handlers,\n * in order to determine if the current user is allowed to activate\n * a child of the component. By default, any user can activate a child.\n *\n * When using a function rather than DI tokens, the function can call `inject` to get any required\n * dependencies. This `inject` call must be done in a synchronous context.\n *\n * @see [CanActivateChild](guide/routing/route-guards#canactivatechild)\n *\n */\n canActivateChild?: Array<CanActivateChildFn | DeprecatedGuard>;\n /**\n * An array of `CanDeactivateFn` or DI tokens used to look up `CanDeactivate()`\n * handlers, in order to determine if the current user is allowed to\n * deactivate the component. By default, any user can deactivate.\n *\n * When using a function rather than DI tokens, the function can call `inject` to get any required\n * dependencies. This `inject` call must be done in a synchronous context.\n *\n * @see [CanDeactivate](guide/routing/route-guards#candeactivate)\n *\n */\n canDeactivate?: Array<CanDeactivateFn<any> | DeprecatedGuard>;\n /**\n * An array of `CanLoadFn` or DI tokens used to look up `CanLoad()`\n * handlers, in order to determine if the current user is allowed to\n * load the component. By default, any user can load.\n *\n * When using a function rather than DI tokens, the function can call `inject` to get any required\n * dependencies. This `inject` call must be done in a synchronous context.\n * @deprecated Use `canMatch` instead\n */\n canLoad?: Array<CanLoadFn | DeprecatedGuard>;\n /**\n * Additional developer-defined data provided to the component via\n * `ActivatedRoute`. By default, no additional data is passed.\n */\n data?: Data;\n /**\n * A map of DI tokens used to look up data resolvers. See `Resolve`.\n *\n * @see [Resolve](guide/routing/data-resolvers#what-are-data-resolvers)\n */\n resolve?: ResolveData;\n /**\n * An array of child `Route` objects that specifies a nested route\n * configuration.\n */\n children?: Routes;\n /**\n * An object specifying lazy-loaded child routes.\n *\n * @see [Injection context lazy loading](guide/routing/define-routes#injection-context-lazy-loading)\n *\n */\n loadChildren?: LoadChildren;\n\n /**\n * A policy for when to run guards and resolvers on a route.\n *\n * Guards and/or resolvers will always run when a route is activated or deactivated. When a route\n * is unchanged, the default behavior is the same as `paramsChange`.\n *\n * `paramsChange` : Rerun the guards and resolvers when path or\n * path param changes. This does not include query parameters. This option is the default.\n * - `always` : Run on every execution.\n * - `pathParamsChange` : Rerun guards and resolvers when the path params\n * change. This does not compare matrix or query parameters.\n * - `paramsOrQueryParamsChange` : Run when path, matrix, or query parameters change.\n * - `pathParamsOrQueryParamsChange` : Rerun guards and resolvers when the path params\n * change or query params have changed. This does not include matrix parameters.\n *\n * @see {@link RunGuardsAndResolvers}\n * @see [Control when guards and resolvers execute](guide/routing/customizing-route-behavior#control-when-guards-and-resolvers-execute)\n */\n runGuardsAndResolvers?: RunGuardsAndResolvers;\n\n /**\n * A `Provider` array to use for this `Route` and its `children`.\n *\n * The `Router` will create a new `EnvironmentInjector` for this\n * `Route` and use it for this `Route` and its `children`. If this\n * route also has a `loadChildren` function which returns an `NgModuleRef`, this injector will be\n * used as the parent of the lazy loaded module.\n * @see [Route providers](guide/di/defining-dependency-providers#route-providers)\n */\n providers?: Array<Provider | EnvironmentProviders>;\n\n /**\n * Injector created from the static route providers\n * @internal\n */\n _injector?: EnvironmentInjector;\n\n /**\n * Filled for routes with `loadChildren` once the routes are loaded.\n * @internal\n */\n _loadedRoutes?: Route[];\n\n /**\n * Filled for routes with `loadChildren` once the routes are loaded\n * @internal\n */\n _loadedInjector?: EnvironmentInjector;\n /**\n * Filled if loadChildren retruns a module factory\n * @internal\n */\n _loadedNgModuleFactory?: NgModuleFactory<any>;\n}\n\nexport interface LoadedRouterConfig {\n routes: Route[];\n injector: EnvironmentInjector | undefined;\n factory?: NgModuleFactory<unknown>;\n}\n\n/**\n * @description\n *\n * Interface that a class can implement to be a guard deciding if a route can be activated.\n * If all guards return `true`, navigation continues. If any guard returns `false`,\n * navigation is cancelled. If any guard returns a `UrlTree`, the current navigation\n * is cancelled and a new navigation begins to the `UrlTree` returned from the guard.\n *\n * The following example implements a `CanActivate` function that checks whether the\n * current user has permission to activate the requested route.\n *\n * ```ts\n * class UserToken {}\n * class Permissions {\n * canActivate(): boolean {\n * return true;\n * }\n * }\n *\n * @Injectable()\n * class CanActivateTeam implements CanActivate {\n * constructor(private permissions: Permissions, private currentUser: UserToken) {}\n *\n * canActivate(\n * route: ActivatedRouteSnapshot,\n * state: RouterStateSnapshot\n * ): MaybeAsync<GuardResult> {\n * return this.permissions.canActivate(this.currentUser, route.params.id);\n * }\n * }\n * ```\n *\n * Here, the defined guard function is provided as part of the `Route` object\n * in the router configuration:\n *\n * ```ts\n * @NgModule({\n * imports: [\n * RouterModule.forRoot([\n * {\n * path: 'team/:id',\n * component: TeamComponent,\n * canActivate: [CanActivateTeam]\n * }\n * ])\n * ],\n * providers: [CanActivateTeam, UserToken, Permissions]\n * })\n * class AppModule {}\n * ```\n *\n * @see [CanActivate](guide/routing/route-guards#canactivate)\n *\n *\n * @publicApi\n */\nexport interface CanActivate {\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): MaybeAsync<GuardResult>;\n}\n\n/**\n * The signature of a function used as a `canActivate` guard on a `Route`.\n *\n * If all guards return `true`, navigation continues. If any guard returns `false`,\n * navigation is cancelled. If any guard returns a `UrlTree`, the current navigation\n * is cancelled and a new navigation begins to the `UrlTree` returned from the guard.\n *\n * The following example implements and uses a `CanActivateFn` that checks whether the\n * current user has permission to activate the requested route.\n *\n * ```ts\n * @Injectable()\n * class UserToken {}\n *\n * @Injectable()\n * class PermissionsService {\n * canActivate(currentUser: UserToken, userId: string): boolean {\n * return true;\n * }\n * canMatch(currentUser: UserToken): boolean {\n * return true;\n * }\n * }\n *\n * const canActivateTeam: CanActivateFn = (\n * route: ActivatedRouteSnapshot,\n * state: RouterStateSnapshot,\n * ) => {\n * return inject(PermissionsService).canActivate(inject(UserToken), route.params['id']);\n * };\n * ```\n *\n * Here, the defined guard function is provided as part of the `Route` object\n * in the router configuration:\n *\n * ```ts\n * bootstrapApplication(App, {\n * providers: [\n * provideRouter([\n * {\n * path: 'team/:id',\n * component: TeamComponent,\n * canActivate: [canActivateTeam],\n * },\n * ]),\n * ],\n * });\n * ```\n *\n * @publicApi\n * @see {@link Route}\n * @see [CanActivate](guide/routing/route-guards#canactivate)\n */\nexport type CanActivateFn = (\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot,\n) => MaybeAsync<GuardResult>;\n\n/**\n * @description\n *\n * Interface that a class can implement to be a guard deciding if a child route can be activated.\n * If all guards return `true`, navigation continues. If any guard returns `false`,\n * navigation is cancelled. If any guard returns a `UrlTree`, current navigation\n * is cancelled and a new navigation begins to the `UrlTree` returned from the guard.\n *\n * The following example implements a `CanActivateChild` function that checks whether the\n * current user has permission to activate the requested child route.\n *\n * ```ts\n * class UserToken {}\n * class Permissions {\n * canActivate(user: UserToken, id: string): boolean {\n * return true;\n * }\n * }\n *\n * @Injectable()\n * class CanActivateTeam implements CanActivateChild {\n * constructor(private permissions: Permissions, private currentUser: UserToken) {}\n *\n * canActivateChild(\n * route: ActivatedRouteSnapshot,\n * state: RouterStateSnapshot\n * ): MaybeAsync<GuardResult> {\n * return this.permissions.canActivate(this.currentUser, route.params.id);\n * }\n * }\n * ```\n *\n * Here, the defined guard function is provided as part of the `Route` object\n * in the router configuration:\n *\n * ```ts\n * @NgModule({\n * imports: [\n * RouterModule.forRoot([\n * {\n * path: 'root',\n * canActivateChild: [CanActivateTeam],\n * children: [\n * {\n * path: 'team/:id',\n * component: TeamComponent\n * }\n * ]\n * }\n * ])\n * ],\n * providers: [CanActivateTeam, UserToken, Permissions]\n * })\n * class AppModule {}\n * ```\n * @see [CanActivateChild](guide/routing/route-guards#canactivatechild)\n * @publicApi\n */\nexport interface CanActivateChild {\n canActivateChild(\n childRoute: ActivatedRouteSnapshot,\n state: RouterStateSnapshot,\n ): MaybeAsync<GuardResult>;\n}\n\n/**\n * The signature of a function used as a `canActivateChild` guard on a `Route`.\n *\n * If all guards return `true`, navigation continues. If any guard returns `false`,\n * navigation is cancelled. If any guard returns a `UrlTree`, the current navigation\n * is cancelled and a new navigation begins to the `UrlTree` returned from the guard.\n *\n * The following example implements a `canActivate` function that checks whether the\n * current user has permission to activate the requested route.\n *\n * {@example router/route_functional_guards.ts region=\"CanActivateChildFn\"}\n *\n * @publicApi\n * @see {@link Route}\n * @see [CanActivateChild](guide/routing/route-guards#canactivatechild)\n */\nexport type CanActivateChildFn = (\n childRoute: ActivatedRouteSnapshot,\n state: RouterStateSnapshot,\n) => MaybeAsync<GuardResult>;\n\n/**\n * @description\n *\n * Interface that a class can implement to be a guard deciding if a route can be deactivated.\n * If all guards return `true`, navigation continues. If any guard returns `false`,\n * navigation is cancelled. If any guard returns a `UrlTree`, current navigation\n * is cancelled and a new navigation begins to the `UrlTree` returned from the guard.\n *\n * The following example implements a `CanDeactivate` function that checks whether the\n * current user has permission to deactivate the requested route.\n *\n * ```ts\n * class UserToken {}\n * class Permissions {\n * canDeactivate(user: UserToken, id: string): boolean {\n * return true;\n * }\n * }\n * ```\n *\n * Here, the defined guard function is provided as part of the `Route` object\n * in the router configuration:\n *\n * ```ts\n * @Injectable()\n * class CanDeactivateTeam implements CanDeactivate<TeamComponent> {\n * constructor(private permissions: Permissions, private currentUser: UserToken) {}\n *\n * canDeactivate(\n * component: TeamComponent,\n * currentRoute: ActivatedRouteSnapshot,\n * currentState: RouterStateSnapshot,\n * nextState: RouterStateSnapshot\n * ): MaybeAsync<GuardResult> {\n * return this.permissions.canDeactivate(this.currentUser, route.params.id);\n * }\n * }\n *\n * @NgModule({\n * imports: [\n * RouterModule.forRoot([\n * {\n * path: 'team/:id',\n * component: TeamComponent,\n * canDeactivate: [CanDeactivateTeam]\n * }\n * ])\n * ],\n * providers: [CanDeactivateTeam, UserToken, Permissions]\n * })\n * class AppModule {}\n * ```\n * @see [CanDeactivate](guide/routing/route-guards#candeactivate)\n * @publicApi\n */\nexport interface CanDeactivate<T> {\n canDeactivate(\n component: T,\n currentRoute: ActivatedRouteSnapshot,\n currentState: RouterStateSnapshot,\n nextState: RouterStateSnapshot,\n ): MaybeAsync<GuardResult>;\n}\n\n/**\n * The signature of a function used as a `canDeactivate` guard on a `Route`.\n *\n * If all guards return `true`, navigation continues. If any guard returns `false`,\n * navigation is cancelled. If any guard returns a `UrlTree`, the current navigation\n * is cancelled and a new navigation begins to the `UrlTree` returned from the guard.\n *\n * The following example implements and uses a `CanDeactivateFn` that checks whether the\n * user component has unsaved changes before navigating away from the route.\n *\n * {@example router/route_functional_guards.ts region=\"CanDeactivateFn\"}\n *\n * @publicApi\n * @see {@link Route}\n * @see [CanDeactivate](guide/routing/route-guards#candeactivate)\n */\nexport type CanDeactivateFn<T> = (\n component: T,\n currentRoute: ActivatedRouteSnapshot,\n currentState: RouterStateSnapshot,\n nextState: RouterStateSnapshot,\n) => MaybeAsync<GuardResult>;\n\n/**\n * @description\n *\n * Interface that a class can implement to be a guard deciding if a `Route` can be matched.\n * If all guards return `true`, navigation continues and the `Router` will use the `Route` during\n * activation. If any guard returns `false`, the `Route` is skipped for matching and other `Route`\n * configurations are processed instead.\n *\n * The following example implements a `CanMatch` function that decides whether the\n * current user has permission to access the users page.\n *\n *\n * ```ts\n * class UserToken {}\n * class Permissions {\n * canAccess(user: UserToken, route: Route, segments: UrlSegment[]): boolean {\n * return true;\n * }\n * }\n *\n * @Injectable()\n * class CanMatchTeamSection implements CanMatch {\n * constructor(private permissions: Permissions, private currentUser: UserToken) {}\n *\n * canMatch(route: Route, segments: UrlSegment[]): Observable<boolean>|Promise<boolean>|boolean {\n * return this.permissions.canAccess(this.currentUser, route, segments);\n * }\n * }\n * ```\n *\n * Here, the defined guard function is provided as part of the `Route` object\n * in the router configuration:\n *\n * ```ts\n * @NgModule({\n * imports: [\n * RouterModule.forRoot([\n * {\n * path: 'team/:id',\n * component: TeamComponent,\n * loadChildren: () => import('./team').then(mod => mod.TeamModule),\n * canMatch: [CanMatchTeamSection]\n * },\n * {\n * path: '**',\n * component: NotFoundComponent\n * }\n * ])\n * ],\n * providers: [CanMatchTeamSection, UserToken, Permissions]\n * })\n * class AppModule {}\n * ```\n *\n * If the `CanMatchTeamSection` were to return `false`, the router would continue navigating to the\n * `team/:id` URL, but would load the `NotFoundComponent` because the `Route` for `'team/:id'`\n * could not be used for a URL match but the catch-all `**` `Route` did instead.\n *\n * @publicApi\n * @see [CanMatch](guide/routing/route-guards#canmatch)\n */\nexport interface CanMatch {\n canMatch(route: Route, segments: UrlSegment[]): MaybeAsync<GuardResult>;\n}\n\n/**\n * The signature of a function used as a `canMatch` guard on a `Route`.\n *\n * If all guards return `true`, navigation continues and the `Router` will use the `Route` during\n * activation. If any guard returns `false`, the `Route` is skipped for matching and other `Route`\n * configurations are processed instead.\n *\n * The following example implements and uses a `CanMatchFn` that checks whether the\n * current user has permission to access the team page.\n *\n * {@example router/route_functional_guards.ts region=\"CanMatchFn\"}\n *\n * @param route The route configuration.\n * @param segments The URL segments that have not been consumed by previous parent route evaluations.\n *\n * @publicApi\n * @see {@link Route}\n * @see [CanMatch](guide/routing/route-guards#canmatch)\n */\nexport type CanMatchFn = (route: Route, segments: UrlSegment[]) => MaybeAsync<GuardResult>;\n\n/**\n * @description\n *\n * Interface that classes can implement to be a data provider.\n * A data provider class can be used with the router to resolve data during navigation.\n * The interface defines a `resolve()` method that is invoked right after the `ResolveStart`\n * router event. The router waits for the data to be resolved before the route is finally activated.\n *\n * The following example implements a `resolve()` method that retrieves the data\n * needed to activate the requested route.\n *\n * ```ts\n * @Injectable({ providedIn: 'root' })\n * export class HeroResolver implements Resolve<Hero> {\n * constructor(private service: HeroService) {}\n *\n * resolve(\n * route: ActivatedRouteSnapshot,\n * state: RouterStateSnapshot\n * ): Observable<Hero>|Promise<Hero>|Hero {\n * return this.service.getHero(route.paramMap.get('id'));\n * }\n * }\n * ```\n *\n * Here, the defined `resolve()` function is provided as part of the `Route` object\n * in the router configuration:\n *\n * ```ts\n * @NgModule({\n * imports: [\n * RouterModule.forRoot([\n * {\n * path: 'detail/:id',\n * component: HeroDetailComponent,\n * resolve: {\n * hero: HeroResolver\n * }\n * }\n * ])\n * ],\n * exports: [RouterModule]\n * })\n * export class AppRoutingModule {}\n * ```\n *\n * And you can access to your resolved data from `HeroComponent`:\n *\n * ```ts\n * @Component({\n * selector: \"app-hero\",\n * templateUrl: \"hero.component.html\",\n * })\n * export class HeroComponent {\n *\n * constructor(private activatedRoute: ActivatedRoute) {}\n *\n * ngOnInit() {\n * this.activatedRoute.data.subscribe(({ hero }) => {\n * // do something with your resolved data ...\n * })\n * }\n *\n * }\n * ```\n *\n * @usageNotes\n *\n * When both guard and resolvers are specified, the resolvers are not executed until\n * all guards have run and succeeded.\n * For example, consider the following route configuration:\n *\n * ```ts\n * {\n * path: 'base'\n * canActivate: [BaseGuard],\n * resolve: {data: BaseDataResolver}\n * children: [\n * {\n * path: 'child',\n * guards: [ChildGuard],\n * component: ChildComponent,\n * resolve: {childData: ChildDataResolver}\n * }\n * ]\n * }\n * ```\n * The order of execution is: BaseGuard, ChildGuard, BaseDataResolver, ChildDataResolver.\n *\n * @publicApi\n * @see {@link ResolveFn}\n * @see [Data resolvers](guide/routing/data-resolvers)\n */\nexport interface Resolve<T> {\n resolve(\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot,\n ): MaybeAsync<T | RedirectCommand>;\n}\n\n/**\n * Function type definition for a data provider.\n *\n * A data provider can be used with the router to resolve data during navigation.\n * The router waits for the data to be resolved before the route is finally activated.\n *\n * A resolver can also redirect a `RedirectCommand` and the Angular router will use\n * it to redirect the current navigation to the new destination.\n *\n * @usageNotes\n *\n * The following example implements a function that retrieves the data\n * needed to activate the requested route.\n *\n * ```ts\n * interface Hero {\n * name: string;\n * }\n * @Injectable()\n * export class HeroService {\n * getHero(id: string) {\n * return {name: `Superman-${id}`};\n * }\n * }\n *\n * export const heroResolver: ResolveFn<Hero> = (\n * route: ActivatedRouteSnapshot,\n * state: RouterStateSnapshot,\n * ) => {\n * return inject(HeroService).getHero(route.paramMap.get('id')!);\n * };\n *\n * bootstrapApplication(App, {\n * providers: [\n * provideRouter([\n * {\n * path: 'detail/:id',\n * component: HeroDetailComponent,\n * resolve: {hero: heroResolver},\n * },\n * ]),\n * ],\n * });\n * ```\n *\n * And you can access to your resolved data from `HeroComponent`:\n *\n * ```ts\n * @Component({template: ''})\n * export class HeroDetailComponent {\n * private activatedRoute = inject(ActivatedRoute);\n *\n * ngOnInit() {\n * this.activatedRoute.data.subscribe(({hero}) => {\n * // do something with your resolved data ...\n * });\n * }\n * }\n * ```\n *\n * If resolved data cannot be retrieved, you may want to redirect the user\n * to a new page instead:\n *\n * ```ts\n * export const heroResolver: ResolveFn<Hero> = async (\n * route: ActivatedRouteSnapshot,\n * state: RouterStateSnapshot,\n * ) => {\n * const router = inject(Router);\n * const heroService = inject(HeroService);\n * try {\n * return await heroService.getHero(route.paramMap.get('id')!);\n * } catch {\n * return new RedirectCommand(router.parseUrl('/404'));\n * }\n * };\n * ```\n *\n * When both guard and resolvers are specified, the resolvers are not executed until\n * all guards have run and succeeded.\n * For example, consider the following route configuration:\n *\n * ```ts\n * {\n * path: 'base'\n * canActivate: [baseGuard],\n * resolve: {data: baseDataResolver}\n * children: [\n * {\n * path: 'child',\n * canActivate: [childGuard],\n * component: ChildComponent,\n * resolve: {childData: childDataResolver}\n * }\n * ]\n * }\n * ```\n * The order of execution is: baseGuard, childGuard, baseDataResolver, childDataResolver.\n *\n * @publicApi\n * @see {@link Route}\n * @see [Data resolvers](guide/routing/data-resolvers)\n */\nexport type ResolveFn<T> = (\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot,\n) => MaybeAsync<T | RedirectCommand>;\n\n/**\n * @description\n *\n * Interface that a class can implement to be a guard deciding if children can be loaded.\n * If all guards return `true`, navigation continues. If any guard returns `false`,\n * navigation is cancelled. If any guard returns a `UrlTree`, current navigation\n * is cancelled and a new navigation starts to the `UrlTree` returned from the guard.\n *\n * The following example implements a `CanLoad` function that decides whether the\n * current user has permission to load requested child routes.\n *\n *\n * ```ts\n * class UserToken {}\n * class Permissions {\n * canLoadChildren(user: UserToken, id: string, segments: UrlSegment[]): boolean {\n * return true;\n * }\n * }\n *\n * @Injectable()\n * class CanLoadTeamSection implements CanLoad {\n * constructor(private permissions: Permissions, private currentUser: UserToken) {}\n *\n * canLoad(route: Route, segments: UrlSegment[]): Observable<boolean>|Promise<boolean>|boolean {\n * return this.permissions.canLoadChildren(this.currentUser, route, segments);\n * }\n * }\n * ```\n *\n * Here, the defined guard function is provided as part of the `Route` object\n * in the router configuration:\n *\n * ```ts\n * @NgModule({\n * imports: [\n * RouterModule.forRoot([\n * {\n * path: 'team/:id',\n * component: TeamComponent,\n * loadChildren: () => import('./team').then(mod => mod.TeamModule),\n * canLoad: [CanLoadTeamSection]\n * }\n * ])\n * ],\n * providers: [CanLoadTeamSection, UserToken, Permissions]\n * })\n * class AppModule {}\n * ```\n *\n * @publicApi\n * @deprecated Use {@link CanMatch} instead\n */\nexport interface CanLoad {\n canLoad(route: Route, segments: UrlSegment[]): MaybeAsync<GuardResult>;\n}\n\n/**\n * The signature of a function used as a `canLoad` guard on a `Route`.\n *\n * @publicApi\n * @see {@link CanLoad}\n * @see {@link Route}\n * @see {@link CanMatch}\n * @deprecated Use `Route.canMatch` and `CanMatchFn` instead\n */\nexport type CanLoadFn = (route: Route, segments: UrlSegment[]) => MaybeAsync<GuardResult>;\n\n/**\n * @description\n *\n * Options that modify the `Router` navigation strategy.\n * Supply an object containing any of these properties to a `Router` navigation function to\n * control how the navigation should be handled.\n *\n * @see {@link Router#navigate}\n * @see {@link Router#navigateByUrl}\n * @see [Routing and Navigation guide](guide/routing/common-router-tasks)\n *\n * @publicApi\n */\nexport interface NavigationBehaviorOptions {\n /**\n * How to handle a navigation request to the current URL.\n *\n * This value is a subset of the options available in `OnSameUrlNavigation` and\n * will take precedence over the default value set for the `Router`.\n *\n * @see {@link OnSameUrlNavigation}\n * @see {@link RouterConfigOptions}\n */\n onSameUrlNavigation?: OnSameUrlNavigation;\n\n /**\n * When true, navigates without pushing a new state into history.\n *\n * ```ts\n * // Navigate silently to /view\n * this.router.navigate(['/view'], { skipLocationChange: true });\n * ```\n */\n skipLocationChange?: boolean;\n\n /**\n * When true, navigates while replacing the current state in history.\n *\n * ```ts\n * // Navigate to /view\n * this.router.navigate(['/view'], { replaceUrl: true });\n * ```\n */\n replaceUrl?: boolean;\n\n /**\n * Developer-defined state that can be passed to any navigation.\n * Access this value through the `Navigation.extras` object\n * returned from the [Router.currentNavigation()\n * method](api/router/Router#currentNavigation) while a navigation is executing.\n *\n * After a navigation completes, the router writes an object containing this\n * value together with a `navigationId` to `history.state`.\n * The value is written when `location.go()` or `location.replaceState()`\n * is called before activating this route.\n *\n * Note that `history.state` does not pass an object equality test because\n * the router adds the `navigationId` on each navigation.\n *\n */\n state?: {[k: string]: any};\n\n /**\n * Use this to convey transient information about this particular navigation, such as how it\n * happened. In this way, it's different from the persisted value `state` that will be set to\n * `history.state`. This object is assigned directly to the Router's current `Navigation`\n * (it is not copied or cloned), so it should be mutated with caution.\n *\n * One example of how this might be used is to trigger different single-page navigation animations\n * depending on how a certain route was reached. For example, consider a photo gallery app, where\n * you can reach the same photo URL and state via various routes:\n *\n * - Clicking on it in a gallery view\n * - Clicking\n * - \"next\" or \"previous\" when viewing another photo in the album\n * - Etc.\n *\n * Each of these wants a different animation at navigate time. This information doesn't make sense\n * to store in the persistent URL or history entry state, but it's still important to communicate\n * from the rest of the application, into the router.\n *\n * This information could be used in coordination with the View Transitions feature and the\n * `onViewTransitionCreated` callback. The information might be used in the callback to set\n * classes on the document in order to control the transition animations and remove the classes\n * when the transition has finished animating.\n */\n readonly info?: unknown;\n\n /**\n * When set, the Router will update the browser's address bar to match the given `UrlTree` instead\n * of the one used for route matching.\n *\n *\n * @usageNotes\n *\n * This feature is useful for redirects, such as redirecting to an error page, without changing\n * the value that will be displayed in the browser's address bar.\n *\n * ```ts\n * const canActivate: CanActivateFn = (route: ActivatedRouteSnapshot) => {\n * const userService = inject(UserService);\n * const router = inject(Router);\n * if (!userService.isLoggedIn()) {\n * const targetOfCurrentNavigation = router.currentNavigation()?.finalUrl;\n * const redirect = router.parseUrl('/404');\n * return new RedirectCommand(redirect, {browserUrl: targetOfCurrentNavigation});\n * }\n * return true;\n * };\n * ```\n *\n * This value is used directly, without considering any `UrlHandingStrategy`. In this way,\n * `browserUrl` can also be used to use a different value for the browser URL than what would have\n * been produced by from the navigation due to `UrlHandlingStrategy.merge`.\n *\n * This value only affects the path presented in the browser's address bar. It does not apply to\n * the internal `Router` state. Information such as `params` and `data` will match the internal\n * state used to match routes which will be different from the browser URL when using this feature\n * The same is true when using other APIs that cause the browser URL the differ from the Router\n * state, such as `skipLocationChange`.\n */\n readonly browserUrl?: UrlTree | string;\n\n /**\n * Configures how scrolling is handled for an individual navigation when scroll restoration\n * is enabled in the router.\n *\n * - When 'manual', the router will not perform scrolling when the navigation is complete,\n * even if scroll restoration is enabled.\n * - When 'after-transition', scrolling will be performed after the `NavigationEnd` event,\n * according to the behavior configured in the router scrolling feature.\n *\n * @see withInMemoryRouterScroller\n * @see InMemoryScrollingOptions\n */\n readonly scroll?: 'manual' | 'after-transition';\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NavigationCancellationCode} from './events';\nimport {NavigationBehaviorOptions, RedirectCommand} from './models';\nimport {isUrlTree, UrlSerializer, UrlTree} from './url_tree';\n\nexport const NAVIGATION_CANCELING_ERROR = 'ngNavigationCancelingError';\n\nexport type NavigationCancelingError = Error & {\n [NAVIGATION_CANCELING_ERROR]: true;\n cancellationCode: NavigationCancellationCode;\n};\nexport type RedirectingNavigationCancelingError = NavigationCancelingError & {\n url: UrlTree;\n navigationBehaviorOptions?: NavigationBehaviorOptions;\n cancellationCode: NavigationCancellationCode.Redirect;\n};\n\nexport function redirectingNavigationError(\n urlSerializer: UrlSerializer,\n redirect: UrlTree | RedirectCommand,\n): RedirectingNavigationCancelingError {\n const {redirectTo, navigationBehaviorOptions} = isUrlTree(redirect)\n ? {redirectTo: redirect, navigationBehaviorOptions: undefined}\n : redirect;\n const error = navigationCancelingError(\n ngDevMode && `Redirecting to \"${urlSerializer.serialize(redirectTo)}\"`,\n NavigationCancellationCode.Redirect,\n ) as RedirectingNavigationCancelingError;\n error.url = redirectTo;\n error.navigationBehaviorOptions = navigationBehaviorOptions;\n return error;\n}\n\nexport function navigationCancelingError(\n message: string | null | false,\n code: NavigationCancellationCode,\n) {\n const error = new Error(`NavigationCancelingError: ${message || ''}`) as NavigationCancelingError;\n error[NAVIGATION_CANCELING_ERROR] = true;\n error.cancellationCode = code;\n return error;\n}\n\nexport function isRedirectingNavigationCancelingError(\n error: unknown | RedirectingNavigationCancelingError,\n): error is RedirectingNavigationCancelingError {\n return (\n isNavigationCancelingError(error) &&\n isUrlTree((error as RedirectingNavigationCancelingError).url)\n );\n}\n\nexport function isNavigationCancelingError(error: unknown): error is NavigationCancelingError {\n return !!error && (error as NavigationCancelingError)[NAVIGATION_CANCELING_ERROR];\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ActivationEnd, ChildActivationEnd, Event} from '../events';\nimport type {DetachedRouteHandleInternal, RouteReuseStrategy} from '../route_reuse_strategy';\nimport type {ChildrenOutletContexts} from '../router_outlet_context';\nimport {ActivatedRoute, advanceActivatedRoute, RouterState} from '../router_state';\nimport {nodeChildrenAsMap, TreeNode} from '../utils/tree';\n\nlet warnedAboutUnsupportedInputBinding = false;\nexport class ActivateRoutes {\n constructor(\n private routeReuseStrategy: RouteReuseStrategy,\n private futureState: RouterState,\n private currState: RouterState,\n private forwardEvent: (evt: Event) => void,\n private inputBindingEnabled: boolean,\n ) {}\n\n activate(parentContexts: ChildrenOutletContexts): void {\n const futureRoot = this.futureState._root;\n const currRoot = this.currState ? this.currState._root : null;\n\n this.deactivateChildRoutes(futureRoot, currRoot, parentContexts);\n advanceActivatedRoute(this.futureState.root);\n this.activateChildRoutes(futureRoot, currRoot, parentContexts);\n }\n\n // De-activate the child route that are not re-used for the future state\n private deactivateChildRoutes(\n futureNode: TreeNode<ActivatedRoute>,\n currNode: TreeNode<ActivatedRoute> | null,\n contexts: ChildrenOutletContexts,\n ): void {\n const children: {[outletName: string]: TreeNode<ActivatedRoute>} = nodeChildrenAsMap(currNode);\n\n // Recurse on the routes active in the future state to de-activate deeper children\n futureNode.children.forEach((futureChild) => {\n const childOutletName = futureChild.value.outlet;\n this.deactivateRoutes(futureChild, children[childOutletName], contexts);\n delete children[childOutletName];\n });\n\n // De-activate the routes that will not be re-used\n Object.values(children).forEach((v: TreeNode<ActivatedRoute>) => {\n this.deactivateRouteAndItsChildren(v, contexts);\n });\n }\n\n private deactivateRoutes(\n futureNode: TreeNode<ActivatedRoute>,\n currNode: TreeNode<ActivatedRoute>,\n parentContext: ChildrenOutletContexts,\n ): void {\n const future = futureNode.value;\n const curr = currNode ? currNode.value : null;\n\n if (future === curr) {\n // Reusing the node, check to see if the children need to be de-activated\n if (future.component) {\n // If we have a normal route, we need to go through an outlet.\n const context = parentContext.getContext(future.outlet);\n if (context) {\n this.deactivateChildRoutes(futureNode, currNode, context.children);\n }\n } else {\n // if we have a componentless route, we recurse but keep the same outlet map.\n this.deactivateChildRoutes(futureNode, currNode, parentContext);\n }\n } else {\n if (curr) {\n // Deactivate the current route which will not be re-used\n this.deactivateRouteAndItsChildren(currNode, parentContext);\n }\n }\n }\n\n private deactivateRouteAndItsChildren(\n route: TreeNode<ActivatedRoute>,\n parentContexts: ChildrenOutletContexts,\n ): void {\n // If there is no component, the Route is never attached to an outlet (because there is no\n // component to attach).\n if (route.value.component && this.routeReuseStrategy.shouldDetach(route.value.snapshot)) {\n this.detachAndStoreRouteSubtree(route, parentContexts);\n } else {\n this.deactivateRouteAndOutlet(route, parentContexts);\n }\n }\n\n private detachAndStoreRouteSubtree(\n route: TreeNode<ActivatedRoute>,\n parentContexts: ChildrenOutletContexts,\n ): void {\n const context = parentContexts.getContext(route.value.outlet);\n const contexts = context && route.value.component ? context.children : parentContexts;\n const children: {[outletName: string]: TreeNode<ActivatedRoute>} = nodeChildrenAsMap(route);\n\n for (const treeNode of Object.values(children)) {\n this.deactivateRouteAndItsChildren(treeNode, contexts);\n }\n\n if (context && context.outlet) {\n const componentRef = context.outlet.detach();\n const contexts = context.children.onOutletDeactivated();\n this.routeReuseStrategy.store(route.value.snapshot, {componentRef, route, contexts});\n }\n }\n\n private deactivateRouteAndOutlet(\n route: TreeNode<ActivatedRoute>,\n parentContexts: ChildrenOutletContexts,\n ): void {\n const context = parentContexts.getContext(route.value.outlet);\n // The context could be `null` if we are on a componentless route but there may still be\n // children that need deactivating.\n const contexts = context && route.value.component ? context.children : parentContexts;\n const children: {[outletName: string]: TreeNode<ActivatedRoute>} = nodeChildrenAsMap(route);\n\n for (const treeNode of Object.values(children)) {\n this.deactivateRouteAndItsChildren(treeNode, contexts);\n }\n\n if (context) {\n if (context.outlet) {\n // Destroy the component\n context.outlet.deactivate();\n // Destroy the contexts for all the outlets that were in the component\n context.children.onOutletDeactivated();\n }\n // Clear the information about the attached component on the context but keep the reference to\n // the outlet. Clear even if outlet was not yet activated to avoid activating later with old\n // info\n context.attachRef = null;\n context.route = null;\n }\n }\n\n private activateChildRoutes(\n futureNode: TreeNode<ActivatedRoute>,\n currNode: TreeNode<ActivatedRoute> | null,\n contexts: ChildrenOutletContexts,\n ): void {\n const children: {[outlet: string]: TreeNode<ActivatedRoute>} = nodeChildrenAsMap(currNode);\n futureNode.children.forEach((c) => {\n this.activateRoutes(c, children[c.value.outlet], contexts);\n this.forwardEvent(new ActivationEnd(c.value.snapshot));\n });\n if (futureNode.children.length) {\n this.forwardEvent(new ChildActivationEnd(futureNode.value.snapshot));\n }\n }\n\n private activateRoutes(\n futureNode: TreeNode<ActivatedRoute>,\n currNode: TreeNode<ActivatedRoute>,\n parentContexts: ChildrenOutletContexts,\n ): void {\n const future = futureNode.value;\n const curr = currNode ? currNode.value : null;\n\n advanceActivatedRoute(future);\n\n // reusing the node\n if (future === curr) {\n if (future.component) {\n // If we have a normal route, we need to go through an outlet.\n const context = parentContexts.getOrCreateContext(future.outlet);\n this.activateChildRoutes(futureNode, currNode, context.children);\n } else {\n // if we have a componentless route, we recurse but keep the same outlet map.\n this.activateChildRoutes(futureNode, currNode, parentContexts);\n }\n } else {\n if (future.component) {\n // if we have a normal route, we need to place the component into the outlet and recurse.\n const context = parentContexts.getOrCreateContext(future.outlet);\n\n if (this.routeReuseStrategy.shouldAttach(future.snapshot)) {\n const stored = <DetachedRouteHandleInternal>(\n this.routeReuseStrategy.retrieve(future.snapshot)\n );\n this.routeReuseStrategy.store(future.snapshot, null);\n context.children.onOutletReAttached(stored.contexts);\n context.attachRef = stored.componentRef;\n context.route = stored.route.value;\n if (context.outlet) {\n // Attach right away when the outlet has already been instantiated\n // Otherwise attach from `RouterOutlet.ngOnInit` when it is instantiated\n context.outlet.attach(stored.componentRef, stored.route.value);\n }\n\n advanceActivatedRoute(stored.route.value);\n this.activateChildRoutes(futureNode, null, context.children);\n } else {\n context.attachRef = null;\n context.route = future;\n if (context.outlet) {\n // Activate the outlet when it has already been instantiated\n // Otherwise it will get activated from its `ngOnInit` when instantiated\n context.outlet.activateWith(future, context.injector);\n }\n\n this.activateChildRoutes(futureNode, null, context.children);\n }\n } else {\n // if we have a componentless route, we recurse but keep the same outlet map.\n this.activateChildRoutes(futureNode, null, parentContexts);\n }\n }\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n const context = parentContexts.getOrCreateContext(future.outlet);\n const outlet = context.outlet;\n if (\n outlet &&\n this.inputBindingEnabled &&\n !outlet.supportsBindingToComponentInputs &&\n !warnedAboutUnsupportedInputBinding\n ) {\n console.warn(\n `'withComponentInputBinding' feature is enabled but ` +\n `this application is using an outlet that may not support binding to component inputs.`,\n );\n warnedAboutUnsupportedInputBinding = true;\n }\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n Injector,\n ProviderToken,\n ɵisInjectable as isInjectable,\n EnvironmentInjector,\n runInInjectionContext,\n} from '@angular/core';\nimport {RunGuardsAndResolvers} from '../models';\n\nimport {ChildrenOutletContexts, OutletContext} from '../router_outlet_context';\nimport {\n ActivatedRouteSnapshot,\n equalParamsAndUrlSegments,\n RouterStateSnapshot,\n} from '../router_state';\nimport {equalPath} from '../url_tree';\nimport {shallowEqual} from '../utils/collection';\nimport {nodeChildrenAsMap, TreeNode} from '../utils/tree';\n\nexport class CanActivate {\n readonly route: ActivatedRouteSnapshot;\n constructor(public path: ActivatedRouteSnapshot[]) {\n this.route = this.path[this.path.length - 1];\n }\n}\n\nexport class CanDeactivate {\n constructor(\n public component: Object | null,\n public route: ActivatedRouteSnapshot,\n ) {}\n}\n\nexport declare type Checks = {\n canDeactivateChecks: CanDeactivate[];\n canActivateChecks: CanActivate[];\n};\n\nexport function getAllRouteGuards(\n future: RouterStateSnapshot,\n curr: RouterStateSnapshot,\n parentContexts: ChildrenOutletContexts,\n): Checks {\n const futureRoot = future._root;\n const currRoot = curr ? curr._root : null;\n\n return getChildRouteGuards(futureRoot, currRoot, parentContexts, [futureRoot.value]);\n}\n\nexport function getCanActivateChild(\n p: ActivatedRouteSnapshot,\n): {node: ActivatedRouteSnapshot; guards: any[]} | null {\n const canActivateChild = p.routeConfig ? p.routeConfig.canActivateChild : null;\n if (!canActivateChild || canActivateChild.length === 0) return null;\n return {node: p, guards: canActivateChild};\n}\n\nexport function getTokenOrFunctionIdentity<T>(\n tokenOrFunction: Function | ProviderToken<T>,\n injector: Injector,\n): Function | T {\n const NOT_FOUND = Symbol();\n const result = injector.get<T | Symbol>(tokenOrFunction, NOT_FOUND);\n if (result === NOT_FOUND) {\n if (typeof tokenOrFunction === 'function' && !isInjectable(tokenOrFunction)) {\n // We think the token is just a function so return it as-is\n return tokenOrFunction;\n } else {\n // This will throw the not found error\n return injector.get<T>(tokenOrFunction);\n }\n }\n return result as T;\n}\n\nfunction getChildRouteGuards(\n futureNode: TreeNode<ActivatedRouteSnapshot>,\n currNode: TreeNode<ActivatedRouteSnapshot> | null,\n contexts: ChildrenOutletContexts | null,\n futurePath: ActivatedRouteSnapshot[],\n checks: Checks = {\n canDeactivateChecks: [],\n canActivateChecks: [],\n },\n): Checks {\n const prevChildren = nodeChildrenAsMap(currNode);\n\n // Process the children of the future route\n futureNode.children.forEach((c) => {\n getRouteGuards(c, prevChildren[c.value.outlet], contexts, futurePath.concat([c.value]), checks);\n delete prevChildren[c.value.outlet];\n });\n\n // Process any children left from the current route (not active for the future route)\n Object.entries(prevChildren).forEach(([k, v]: [string, TreeNode<ActivatedRouteSnapshot>]) =>\n deactivateRouteAndItsChildren(v, contexts!.getContext(k), checks),\n );\n\n return checks;\n}\n\nfunction getRouteGuards(\n futureNode: TreeNode<ActivatedRouteSnapshot>,\n currNode: TreeNode<ActivatedRouteSnapshot>,\n parentContexts: ChildrenOutletContexts | null,\n futurePath: ActivatedRouteSnapshot[],\n checks: Checks = {\n canDeactivateChecks: [],\n canActivateChecks: [],\n },\n): Checks {\n const future = futureNode.value;\n const curr = currNode ? currNode.value : null;\n const context = parentContexts ? parentContexts.getContext(futureNode.value.outlet) : null;\n\n // reusing the node\n if (curr && future.routeConfig === curr.routeConfig) {\n const shouldRun = shouldRunGuardsAndResolvers(\n curr,\n future,\n future.routeConfig!.runGuardsAndResolvers,\n );\n if (shouldRun) {\n checks.canActivateChecks.push(new CanActivate(futurePath));\n } else {\n // we need to set the data\n future.data = curr.data;\n future._resolvedData = curr._resolvedData;\n }\n\n // If we have a component, we need to go through an outlet.\n if (future.component) {\n getChildRouteGuards(\n futureNode,\n currNode,\n context ? context.children : null,\n futurePath,\n checks,\n );\n\n // if we have a componentless route, we recurse but keep the same outlet map.\n } else {\n getChildRouteGuards(futureNode, currNode, parentContexts, futurePath, checks);\n }\n\n if (shouldRun && context && context.outlet && context.outlet.isActivated) {\n checks.canDeactivateChecks.push(new CanDeactivate(context.outlet.component, curr));\n }\n } else {\n if (curr) {\n deactivateRouteAndItsChildren(currNode, context, checks);\n }\n\n checks.canActivateChecks.push(new CanActivate(futurePath));\n // If we have a component, we need to go through an outlet.\n if (future.component) {\n getChildRouteGuards(futureNode, null, context ? context.children : null, futurePath, checks);\n\n // if we have a componentless route, we recurse but keep the same outlet map.\n } else {\n getChildRouteGuards(futureNode, null, parentContexts, futurePath, checks);\n }\n }\n\n return checks;\n}\n\nfunction shouldRunGuardsAndResolvers(\n curr: ActivatedRouteSnapshot,\n future: ActivatedRouteSnapshot,\n mode: RunGuardsAndResolvers | undefined,\n): boolean {\n if (typeof mode === 'function') {\n return runInInjectionContext(future._environmentInjector, () => mode(curr, future));\n }\n switch (mode) {\n case 'pathParamsChange':\n return !equalPath(curr.url, future.url);\n\n case 'pathParamsOrQueryParamsChange':\n return (\n !equalPath(curr.url, future.url) || !shallowEqual(curr.queryParams, future.queryParams)\n );\n\n case 'always':\n return true;\n\n case 'paramsOrQueryParamsChange':\n return (\n !equalParamsAndUrlSegments(curr, future) ||\n !shallowEqual(curr.queryParams, future.queryParams)\n );\n\n case 'paramsChange':\n default:\n return !equalParamsAndUrlSegments(curr, future);\n }\n}\n\nfunction deactivateRouteAndItsChildren(\n route: TreeNode<ActivatedRouteSnapshot>,\n context: OutletContext | null,\n checks: Checks,\n): void {\n const children = nodeChildrenAsMap(route);\n const r = route.value;\n\n Object.entries(children).forEach(([childName, node]) => {\n if (!r.component) {\n deactivateRouteAndItsChildren(node, context, checks);\n } else if (context) {\n deactivateRouteAndItsChildren(node, context.children.getContext(childName), checks);\n } else {\n deactivateRouteAndItsChildren(node, null, checks);\n }\n });\n\n if (!r.component) {\n checks.canDeactivateChecks.push(new CanDeactivate(null, r));\n } else if (context && context.outlet && context.outlet.isActivated) {\n checks.canDeactivateChecks.push(new CanDeactivate(context.outlet.component, r));\n } else {\n checks.canDeactivateChecks.push(new CanDeactivate(null, r));\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EmptyError} from 'rxjs';\n\nimport {CanActivateChildFn, CanActivateFn, CanDeactivateFn, CanLoadFn, CanMatchFn} from '../models';\n\n/**\n * Simple function check, but generic so type inference will flow. Example:\n *\n * function product(a: number, b: number) {\n * return a * b;\n * }\n *\n * if (isFunction<product>(fn)) {\n * return fn(1, 2);\n * } else {\n * throw \"Must provide the `product` function\";\n * }\n */\nexport function isFunction<T>(v: any): v is T {\n return typeof v === 'function';\n}\n\nexport function isBoolean(v: any): v is boolean {\n return typeof v === 'boolean';\n}\n\nexport function isCanLoad(guard: any): guard is {canLoad: CanLoadFn} {\n return guard && isFunction<CanLoadFn>(guard.canLoad);\n}\n\nexport function isCanActivate(guard: any): guard is {canActivate: CanActivateFn} {\n return guard && isFunction<CanActivateFn>(guard.canActivate);\n}\n\nexport function isCanActivateChild(guard: any): guard is {canActivateChild: CanActivateChildFn} {\n return guard && isFunction<CanActivateChildFn>(guard.canActivateChild);\n}\n\nexport function isCanDeactivate<T>(guard: any): guard is {canDeactivate: CanDeactivateFn<T>} {\n return guard && isFunction<CanDeactivateFn<T>>(guard.canDeactivate);\n}\nexport function isCanMatch(guard: any): guard is {canMatch: CanMatchFn} {\n return guard && isFunction<CanMatchFn>(guard.canMatch);\n}\n\nexport function isEmptyError(e: Error): e is EmptyError {\n return e instanceof EmptyError || e?.name === 'EmptyError';\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {combineLatest, Observable, OperatorFunction} from 'rxjs';\nimport {filter, map, startWith, switchMap, take} from 'rxjs/operators';\n\nimport {GuardResult, RedirectCommand} from '../models';\nimport {isUrlTree, UrlTree} from '../url_tree';\n\nconst INITIAL_VALUE = /* @__PURE__ */ Symbol('INITIAL_VALUE');\ndeclare type INTERIM_VALUES = typeof INITIAL_VALUE | GuardResult;\n\nexport function prioritizedGuardValue(): OperatorFunction<Observable<GuardResult>[], GuardResult> {\n return switchMap((obs) => {\n return combineLatest(\n obs.map((o) => o.pipe(take(1), startWith(INITIAL_VALUE as INTERIM_VALUES))),\n ).pipe(\n map((results: INTERIM_VALUES[]) => {\n for (const result of results) {\n if (result === true) {\n // If result is true, check the next one\n continue;\n } else if (result === INITIAL_VALUE) {\n // If guard has not finished, we need to stop processing.\n return INITIAL_VALUE;\n } else if (result === false || isRedirect(result)) {\n // Result finished and was not true. Return the result.\n // Note that we only allow false/UrlTree/RedirectCommand. Other values are considered invalid and\n // ignored.\n return result;\n }\n }\n // Everything resolved to true. Return true.\n return true;\n }),\n filter((item): item is GuardResult => item !== INITIAL_VALUE),\n take(1),\n );\n });\n}\n\nfunction isRedirect(val: INTERIM_VALUES): val is UrlTree | RedirectCommand {\n return isUrlTree(val) || val instanceof RedirectCommand;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Observable, of} from 'rxjs';\nimport {take, takeUntil} from 'rxjs/operators';\n\n/**\n * Converts an AbortSignal to an Observable<void>.\n * Emits and completes when the signal is aborted.\n * If the signal is already aborted, it emits and completes immediately.\n */\nexport function abortSignalToObservable(signal: AbortSignal): Observable<void> {\n if (signal.aborted) {\n return of(undefined).pipe(take(1)); // Emit and complete immediately\n }\n return new Observable<void>((subscriber) => {\n const handler = () => {\n subscriber.next();\n subscriber.complete();\n };\n signal.addEventListener('abort', handler);\n return () => signal.removeEventListener('abort', handler);\n });\n}\n\nexport function takeUntilAbort<T>(signal: AbortSignal) {\n return takeUntil<T>(abortSignalToObservable(signal));\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EnvironmentInjector, ProviderToken, runInInjectionContext} from '@angular/core';\nimport {\n concat,\n defer,\n from,\n MonoTypeOperatorFunction,\n Observable,\n of,\n OperatorFunction,\n pipe,\n} from 'rxjs';\nimport {concatMap, first, map, mergeMap, tap} from 'rxjs/operators';\n\nimport {ActivationStart, ChildActivationStart, Event} from '../events';\nimport {\n CanActivateChildFn,\n CanActivateFn,\n CanDeactivateFn,\n GuardResult,\n CanLoadFn,\n CanMatchFn,\n Route,\n} from '../models';\nimport {redirectingNavigationError} from '../navigation_canceling_error';\nimport type {NavigationTransition} from '../navigation_transition';\nimport type {ActivatedRouteSnapshot, RouterStateSnapshot} from '../router_state';\nimport {UrlSegment, UrlSerializer} from '../url_tree';\nimport {wrapIntoObservable} from '../utils/collection';\nimport {\n CanActivate,\n CanDeactivate,\n getCanActivateChild,\n getTokenOrFunctionIdentity,\n} from '../utils/preactivation';\nimport {\n isBoolean,\n isCanActivate,\n isCanActivateChild,\n isCanDeactivate,\n isCanLoad,\n isCanMatch,\n} from '../utils/type_guards';\n\nimport {prioritizedGuardValue} from './prioritized_guard_value';\nimport {takeUntilAbort} from '../utils/abort_signal_to_observable';\n\nexport function checkGuards(\n forwardEvent?: (evt: Event) => void,\n): MonoTypeOperatorFunction<NavigationTransition> {\n return mergeMap((t) => {\n const {\n targetSnapshot,\n currentSnapshot,\n guards: {canActivateChecks, canDeactivateChecks},\n } = t;\n if (canDeactivateChecks.length === 0 && canActivateChecks.length === 0) {\n return of({...t, guardsResult: true});\n }\n\n return runCanDeactivateChecks(canDeactivateChecks, targetSnapshot!, currentSnapshot).pipe(\n mergeMap((canDeactivate) => {\n return canDeactivate && isBoolean(canDeactivate)\n ? runCanActivateChecks(targetSnapshot!, canActivateChecks, forwardEvent)\n : of(canDeactivate);\n }),\n map((guardsResult) => ({...t, guardsResult})),\n );\n });\n}\n\nfunction runCanDeactivateChecks(\n checks: CanDeactivate[],\n futureRSS: RouterStateSnapshot,\n currRSS: RouterStateSnapshot,\n) {\n return from(checks).pipe(\n mergeMap((check) => runCanDeactivate(check.component, check.route, currRSS, futureRSS)),\n first((result) => {\n return result !== true;\n }, true),\n );\n}\n\nfunction runCanActivateChecks(\n futureSnapshot: RouterStateSnapshot,\n checks: CanActivate[],\n forwardEvent?: (evt: Event) => void,\n) {\n return from(checks).pipe(\n concatMap((check: CanActivate) => {\n return concat(\n fireChildActivationStart(check.route.parent, forwardEvent),\n fireActivationStart(check.route, forwardEvent),\n runCanActivateChild(futureSnapshot, check.path),\n runCanActivate(futureSnapshot, check.route),\n );\n }),\n first((result) => {\n return result !== true;\n }, true),\n );\n}\n\n/**\n * This should fire off `ActivationStart` events for each route being activated at this\n * level.\n * In other words, if you're activating `a` and `b` below, `path` will contain the\n * `ActivatedRouteSnapshot`s for both and we will fire `ActivationStart` for both. Always\n * return\n * `true` so checks continue to run.\n */\nfunction fireActivationStart(\n snapshot: ActivatedRouteSnapshot | null,\n forwardEvent?: (evt: Event) => void,\n): Observable<boolean> {\n if (snapshot !== null && forwardEvent) {\n forwardEvent(new ActivationStart(snapshot));\n }\n return of(true);\n}\n\n/**\n * This should fire off `ChildActivationStart` events for each route being activated at this\n * level.\n * In other words, if you're activating `a` and `b` below, `path` will contain the\n * `ActivatedRouteSnapshot`s for both and we will fire `ChildActivationStart` for both. Always\n * return\n * `true` so checks continue to run.\n */\nfunction fireChildActivationStart(\n snapshot: ActivatedRouteSnapshot | null,\n forwardEvent?: (evt: Event) => void,\n): Observable<boolean> {\n if (snapshot !== null && forwardEvent) {\n forwardEvent(new ChildActivationStart(snapshot));\n }\n return of(true);\n}\n\nfunction runCanActivate(\n futureRSS: RouterStateSnapshot,\n futureARS: ActivatedRouteSnapshot,\n): Observable<GuardResult> {\n const canActivate = futureARS.routeConfig ? futureARS.routeConfig.canActivate : null;\n if (!canActivate || canActivate.length === 0) return of(true);\n\n const canActivateObservables = canActivate.map((canActivate) => {\n return defer(() => {\n const closestInjector = futureARS._environmentInjector;\n const guard = getTokenOrFunctionIdentity<CanActivate>(\n canActivate as ProviderToken<CanActivate>,\n closestInjector,\n );\n const guardVal = isCanActivate(guard)\n ? guard.canActivate(futureARS, futureRSS)\n : runInInjectionContext(closestInjector, () =>\n (guard as CanActivateFn)(futureARS, futureRSS),\n );\n return wrapIntoObservable(guardVal).pipe(first());\n });\n });\n return of(canActivateObservables).pipe(prioritizedGuardValue());\n}\n\nfunction runCanActivateChild(\n futureRSS: RouterStateSnapshot,\n path: ActivatedRouteSnapshot[],\n): Observable<GuardResult> {\n const futureARS = path[path.length - 1];\n\n const canActivateChildGuards = path\n .slice(0, path.length - 1)\n .reverse()\n .map((p) => getCanActivateChild(p))\n .filter((_) => _ !== null);\n\n const canActivateChildGuardsMapped = canActivateChildGuards.map((d: any) => {\n return defer(() => {\n const guardsMapped = d.guards.map(\n (canActivateChild: CanActivateChildFn | ProviderToken<unknown>) => {\n const closestInjector = d.node._environmentInjector;\n const guard = getTokenOrFunctionIdentity<{canActivateChild: CanActivateChildFn}>(\n canActivateChild,\n closestInjector,\n );\n const guardVal = isCanActivateChild(guard)\n ? guard.canActivateChild(futureARS, futureRSS)\n : runInInjectionContext(closestInjector, () =>\n (guard as CanActivateChildFn)(futureARS, futureRSS),\n );\n return wrapIntoObservable(guardVal).pipe(first());\n },\n );\n return of(guardsMapped).pipe(prioritizedGuardValue());\n });\n });\n return of(canActivateChildGuardsMapped).pipe(prioritizedGuardValue());\n}\n\nfunction runCanDeactivate(\n component: Object | null,\n currARS: ActivatedRouteSnapshot,\n currRSS: RouterStateSnapshot,\n futureRSS: RouterStateSnapshot,\n): Observable<GuardResult> {\n const canDeactivate = currARS && currARS.routeConfig ? currARS.routeConfig.canDeactivate : null;\n if (!canDeactivate || canDeactivate.length === 0) return of(true);\n const canDeactivateObservables = canDeactivate.map((c: any) => {\n const closestInjector = currARS._environmentInjector;\n const guard = getTokenOrFunctionIdentity<any>(c, closestInjector);\n const guardVal = isCanDeactivate(guard)\n ? guard.canDeactivate(component, currARS, currRSS, futureRSS)\n : runInInjectionContext(closestInjector, () =>\n (guard as CanDeactivateFn<any>)(component, currARS, currRSS, futureRSS),\n );\n return wrapIntoObservable(guardVal).pipe(first());\n });\n return of(canDeactivateObservables).pipe(prioritizedGuardValue());\n}\n\nexport function runCanLoadGuards(\n injector: EnvironmentInjector,\n route: Route,\n segments: UrlSegment[],\n urlSerializer: UrlSerializer,\n abortSignal?: AbortSignal,\n): Observable<boolean> {\n const canLoad = route.canLoad;\n if (canLoad === undefined || canLoad.length === 0) {\n return of(true);\n }\n\n const canLoadObservables = canLoad.map((injectionToken: any) => {\n const guard = getTokenOrFunctionIdentity<any>(injectionToken, injector);\n const guardVal = isCanLoad(guard)\n ? guard.canLoad(route, segments)\n : runInInjectionContext(injector, () => (guard as CanLoadFn)(route, segments));\n const obs$ = wrapIntoObservable(guardVal);\n return abortSignal ? obs$.pipe(takeUntilAbort(abortSignal)) : obs$;\n });\n\n return of(canLoadObservables).pipe(prioritizedGuardValue(), redirectIfUrlTree(urlSerializer));\n}\n\nfunction redirectIfUrlTree(urlSerializer: UrlSerializer): OperatorFunction<GuardResult, boolean> {\n return pipe(\n tap((result: GuardResult) => {\n if (typeof result === 'boolean') return;\n\n throw redirectingNavigationError(urlSerializer, result);\n }),\n map((result) => result === true),\n );\n}\n\nexport function runCanMatchGuards(\n injector: EnvironmentInjector,\n route: Route,\n segments: UrlSegment[],\n urlSerializer: UrlSerializer,\n abortSignal: AbortSignal,\n): Observable<GuardResult> {\n const canMatch = route.canMatch;\n if (!canMatch || canMatch.length === 0) return of(true);\n\n const canMatchObservables = canMatch.map((injectionToken) => {\n const guard = getTokenOrFunctionIdentity(injectionToken as ProviderToken<any>, injector);\n const guardVal = isCanMatch(guard)\n ? guard.canMatch(route, segments)\n : runInInjectionContext(injector, () => (guard as CanMatchFn)(route, segments));\n return wrapIntoObservable(guardVal).pipe(takeUntilAbort(abortSignal));\n });\n\n return of(canMatchObservables).pipe(prioritizedGuardValue(), redirectIfUrlTree(urlSerializer));\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector, runInInjectionContext, ɵRuntimeError as RuntimeError} from '@angular/core';\n\nimport {RuntimeErrorCode} from './errors';\nimport {NavigationCancellationCode} from './events';\nimport {RedirectFunction, Route} from './models';\nimport {navigationCancelingError} from './navigation_canceling_error';\nimport {ActivatedRouteSnapshot} from './router_state';\nimport {Params, PRIMARY_OUTLET} from './shared';\nimport {UrlSegment, UrlSegmentGroup, UrlSerializer, UrlTree} from './url_tree';\nimport {wrapIntoObservable} from './utils/collection';\nimport {firstValueFrom} from './utils/first_value_from';\n\nexport class NoMatch extends Error {\n public segmentGroup: UrlSegmentGroup | null;\n\n constructor(segmentGroup?: UrlSegmentGroup) {\n super();\n this.segmentGroup = segmentGroup || null;\n\n // Extending `Error` ends up breaking some internal tests. This appears to be a known issue\n // when extending errors in TS and the workaround is to explicitly set the prototype.\n // https://stackoverflow.com/questions/41102060/typescript-extending-error-class\n Object.setPrototypeOf(this, NoMatch.prototype);\n }\n}\n\nexport class AbsoluteRedirect extends Error {\n constructor(public urlTree: UrlTree) {\n super();\n\n // Extending `Error` ends up breaking some internal tests. This appears to be a known issue\n // when extending errors in TS and the workaround is to explicitly set the prototype.\n // https://stackoverflow.com/questions/41102060/typescript-extending-error-class\n Object.setPrototypeOf(this, AbsoluteRedirect.prototype);\n }\n}\n\nexport function namedOutletsRedirect(redirectTo: string): never {\n throw new RuntimeError(\n RuntimeErrorCode.NAMED_OUTLET_REDIRECT,\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n `Only absolute redirects can have named outlets. redirectTo: '${redirectTo}'`,\n );\n}\n\nexport function canLoadFails(route: Route): never {\n throw navigationCancelingError(\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n `Cannot load children because the guard of the route \"path: '${route.path}'\" returned false`,\n NavigationCancellationCode.GuardRejected,\n );\n}\n\nexport class ApplyRedirects {\n constructor(\n private urlSerializer: UrlSerializer,\n private urlTree: UrlTree,\n ) {}\n\n async lineralizeSegments(route: Route, urlTree: UrlTree): Promise<UrlSegment[]> {\n let res: UrlSegment[] = [];\n let c = urlTree.root;\n while (true) {\n res = res.concat(c.segments);\n if (c.numberOfChildren === 0) {\n return res;\n }\n\n if (c.numberOfChildren > 1 || !c.children[PRIMARY_OUTLET]) {\n throw namedOutletsRedirect(`${route.redirectTo!}`);\n }\n\n c = c.children[PRIMARY_OUTLET];\n }\n }\n\n async applyRedirectCommands(\n segments: UrlSegment[],\n redirectTo: string | RedirectFunction,\n posParams: {[k: string]: UrlSegment},\n currentSnapshot: ActivatedRouteSnapshot,\n injector: Injector,\n ): Promise<UrlTree> {\n const redirect = await getRedirectResult(redirectTo, currentSnapshot, injector);\n if (redirect instanceof UrlTree) {\n throw new AbsoluteRedirect(redirect);\n }\n\n const newTree = this.applyRedirectCreateUrlTree(\n redirect,\n this.urlSerializer.parse(redirect),\n segments,\n posParams,\n );\n\n if (redirect[0] === '/') {\n throw new AbsoluteRedirect(newTree);\n }\n return newTree;\n }\n\n applyRedirectCreateUrlTree(\n redirectTo: string,\n urlTree: UrlTree,\n segments: UrlSegment[],\n posParams: {[k: string]: UrlSegment},\n ): UrlTree {\n const newRoot = this.createSegmentGroup(redirectTo, urlTree.root, segments, posParams);\n return new UrlTree(\n newRoot,\n this.createQueryParams(urlTree.queryParams, this.urlTree.queryParams),\n urlTree.fragment,\n );\n }\n\n createQueryParams(redirectToParams: Params, actualParams: Params): Params {\n const res: Params = {};\n Object.entries(redirectToParams).forEach(([k, v]) => {\n const copySourceValue = typeof v === 'string' && v[0] === ':';\n if (copySourceValue) {\n const sourceName = v.substring(1);\n res[k] = actualParams[sourceName];\n } else {\n res[k] = v;\n }\n });\n return res;\n }\n\n createSegmentGroup(\n redirectTo: string,\n group: UrlSegmentGroup,\n segments: UrlSegment[],\n posParams: {[k: string]: UrlSegment},\n ): UrlSegmentGroup {\n const updatedSegments = this.createSegments(redirectTo, group.segments, segments, posParams);\n\n let children: {[n: string]: UrlSegmentGroup} = {};\n Object.entries(group.children).forEach(([name, child]) => {\n children[name] = this.createSegmentGroup(redirectTo, child, segments, posParams);\n });\n\n return new UrlSegmentGroup(updatedSegments, children);\n }\n\n createSegments(\n redirectTo: string,\n redirectToSegments: UrlSegment[],\n actualSegments: UrlSegment[],\n posParams: {[k: string]: UrlSegment},\n ): UrlSegment[] {\n return redirectToSegments.map((s) =>\n s.path[0] === ':'\n ? this.findPosParam(redirectTo, s, posParams)\n : this.findOrReturn(s, actualSegments),\n );\n }\n\n findPosParam(\n redirectTo: string,\n redirectToUrlSegment: UrlSegment,\n posParams: {[k: string]: UrlSegment},\n ): UrlSegment {\n const pos = posParams[redirectToUrlSegment.path.substring(1)];\n if (!pos)\n throw new RuntimeError(\n RuntimeErrorCode.MISSING_REDIRECT,\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n `Cannot redirect to '${redirectTo}'. Cannot find '${redirectToUrlSegment.path}'.`,\n );\n return pos;\n }\n\n findOrReturn(redirectToUrlSegment: UrlSegment, actualSegments: UrlSegment[]): UrlSegment {\n let idx = 0;\n for (const s of actualSegments) {\n if (s.path === redirectToUrlSegment.path) {\n actualSegments.splice(idx);\n return s;\n }\n idx++;\n }\n return redirectToUrlSegment;\n }\n}\n\nfunction getRedirectResult(\n redirectTo: string | RedirectFunction,\n currentSnapshot: ActivatedRouteSnapshot,\n injector: Injector,\n): Promise<string | UrlTree> {\n if (typeof redirectTo === 'string') {\n return Promise.resolve(redirectTo);\n }\n const redirectToFn = redirectTo;\n const {\n queryParams,\n fragment,\n routeConfig,\n url,\n outlet,\n params,\n data,\n title,\n paramMap,\n queryParamMap,\n } = currentSnapshot;\n return firstValueFrom(\n wrapIntoObservable(\n runInInjectionContext(injector, () =>\n redirectToFn({\n params,\n data,\n queryParams,\n fragment,\n routeConfig,\n url,\n outlet,\n title,\n paramMap,\n queryParamMap,\n }),\n ),\n ),\n );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n createEnvironmentInjector,\n EnvironmentInjector,\n isStandalone,\n Type,\n ɵisNgModule as isNgModule,\n ɵRuntimeError as RuntimeError,\n} from '@angular/core';\n\nimport {RuntimeErrorCode} from '../errors';\nimport {Route, Routes} from '../models';\nimport {ActivatedRouteSnapshot} from '../router_state';\nimport {PRIMARY_OUTLET} from '../shared';\n\n/**\n * Creates an `EnvironmentInjector` if the `Route` has providers and one does not already exist\n * and returns the injector. Otherwise, if the `Route` does not have `providers`, returns the\n * `currentInjector`.\n *\n * @param route The route that might have providers\n * @param currentInjector The parent injector of the `Route`\n */\nexport function getOrCreateRouteInjectorIfNeeded(\n route: Route,\n currentInjector: EnvironmentInjector,\n): EnvironmentInjector {\n if (route.providers && !route._injector) {\n route._injector = createEnvironmentInjector(\n route.providers,\n currentInjector,\n `Route: ${route.path}`,\n );\n }\n return route._injector ?? currentInjector;\n}\n\nexport function getLoadedRoutes(route: Route): Route[] | undefined {\n return route._loadedRoutes;\n}\n\nexport function getLoadedInjector(route: Route): EnvironmentInjector | undefined {\n return route._loadedInjector;\n}\nexport function getLoadedComponent(route: Route): Type<unknown> | undefined {\n return route._loadedComponent;\n}\n\nexport function getProvidersInjector(route: Route): EnvironmentInjector | undefined {\n return route._injector;\n}\n\nexport function validateConfig(\n config: Routes,\n parentPath: string = '',\n requireStandaloneComponents = false,\n): void {\n // forEach doesn't iterate undefined values\n for (let i = 0; i < config.length; i++) {\n const route: Route = config[i];\n const fullPath: string = getFullPath(parentPath, route);\n validateNode(route, fullPath, requireStandaloneComponents);\n }\n}\n\nexport function assertStandalone(fullPath: string, component: Type<unknown> | undefined): void {\n if (component && isNgModule(component)) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}'. You are using 'loadComponent' with a module, ` +\n `but it must be used with standalone components. Use 'loadChildren' instead.`,\n );\n } else if (component && !isStandalone(component)) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}'. The component must be standalone.`,\n );\n }\n}\n\nfunction validateNode(route: Route, fullPath: string, requireStandaloneComponents: boolean): void {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!route) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `\n Invalid configuration of route '${fullPath}': Encountered undefined route.\n The reason might be an extra comma.\n\n Example:\n const routes: Routes = [\n { path: '', redirectTo: '/dashboard', pathMatch: 'full' },\n { path: 'dashboard', component: DashboardComponent },, << two commas\n { path: 'detail/:id', component: HeroDetailComponent }\n ];\n `,\n );\n }\n if (Array.isArray(route)) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}': Array cannot be specified`,\n );\n }\n if (\n !route.redirectTo &&\n !route.component &&\n !route.loadComponent &&\n !route.children &&\n !route.loadChildren &&\n route.outlet &&\n route.outlet !== PRIMARY_OUTLET\n ) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}': a componentless route without children or loadChildren cannot have a named outlet set`,\n );\n }\n if (route.redirectTo && route.children) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}': redirectTo and children cannot be used together`,\n );\n }\n if (route.redirectTo && route.loadChildren) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}': redirectTo and loadChildren cannot be used together`,\n );\n }\n if (route.children && route.loadChildren) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}': children and loadChildren cannot be used together`,\n );\n }\n if (route.component && route.loadComponent) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}': component and loadComponent cannot be used together`,\n );\n }\n\n if (route.redirectTo) {\n if (route.component || route.loadComponent) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}': redirectTo and component/loadComponent cannot be used together`,\n );\n }\n if (route.canMatch || route.canActivate) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}': redirectTo and ${route.canMatch ? 'canMatch' : 'canActivate'} cannot be used together.` +\n `Redirects happen before guards are executed.`,\n );\n }\n }\n\n if (route.path && route.matcher) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}': path and matcher cannot be used together`,\n );\n }\n if (\n route.redirectTo === void 0 &&\n !route.component &&\n !route.loadComponent &&\n !route.children &&\n !route.loadChildren\n ) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}'. One of the following must be provided: component, loadComponent, redirectTo, children or loadChildren`,\n );\n }\n if (route.path === void 0 && route.matcher === void 0) {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}': routes must have either a path or a matcher specified`,\n );\n }\n if (typeof route.path === 'string' && route.path.charAt(0) === '/') {\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '${fullPath}': path cannot start with a slash`,\n );\n }\n if (route.path === '' && route.redirectTo !== void 0 && route.pathMatch === void 0) {\n const exp = `The default value of 'pathMatch' is 'prefix', but often the intent is to use 'full'.`;\n throw new RuntimeError(\n RuntimeErrorCode.INVALID_ROUTE_CONFIG,\n `Invalid configuration of route '{path: \"${fullPath}\", redirectTo: \"${route.redirectTo}\"}': please provide 'pathMatch'. ${exp}`,\n );\n }\n if (requireStandaloneComponents) {\n assertStandalone(fullPath, route.component);\n }\n }\n if (route.children) {\n validateConfig(route.children, fullPath, requireStandaloneComponents);\n }\n}\n\nfunction getFullPath(parentPath: string, currentRoute: Route): string {\n if (!currentRoute) {\n return parentPath;\n }\n if (!parentPath && !currentRoute.path) {\n return '';\n } else if (parentPath && !currentRoute.path) {\n return `${parentPath}/`;\n } else if (!parentPath && currentRoute.path) {\n return currentRoute.path;\n } else {\n return `${parentPath}/${currentRoute.path}`;\n }\n}\n\n/** Returns the `route.outlet` or PRIMARY_OUTLET if none exists. */\nexport function getOutlet(route: Route): string {\n return route.outlet || PRIMARY_OUTLET;\n}\n\n/**\n * Sorts the `routes` such that the ones with an outlet matching `outletName` come first.\n * The order of the configs is otherwise preserved.\n */\nexport function sortByMatchingOutlets(routes: Routes, outletName: string): Routes {\n const sortedConfig = routes.filter((r) => getOutlet(r) === outletName);\n sortedConfig.push(...routes.filter((r) => getOutlet(r) !== outletName));\n return sortedConfig;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EnvironmentInjector} from '@angular/core';\nimport {Observable, of} from 'rxjs';\nimport {map} from 'rxjs/operators';\n\nimport {Route} from '../models';\nimport {runCanMatchGuards} from '../operators/check_guards';\nimport {defaultUrlMatcher, PRIMARY_OUTLET} from '../shared';\nimport {UrlSegment, UrlSegmentGroup, UrlSerializer} from '../url_tree';\n\nimport {getOrCreateRouteInjectorIfNeeded, getOutlet} from './config';\n\nexport interface MatchResult {\n matched: boolean;\n consumedSegments: UrlSegment[];\n remainingSegments: UrlSegment[];\n parameters: {[k: string]: string};\n positionalParamSegments: {[k: string]: UrlSegment};\n}\n\nconst noMatch: MatchResult = {\n matched: false,\n consumedSegments: [],\n remainingSegments: [],\n parameters: {},\n positionalParamSegments: {},\n};\n\nexport function matchWithChecks(\n segmentGroup: UrlSegmentGroup,\n route: Route,\n segments: UrlSegment[],\n injector: EnvironmentInjector,\n urlSerializer: UrlSerializer,\n abortSignal: AbortSignal,\n): Observable<MatchResult> {\n const result = match(segmentGroup, route, segments);\n if (!result.matched) {\n return of(result);\n }\n\n // Only create the Route's `EnvironmentInjector` if it matches the attempted\n // navigation\n injector = getOrCreateRouteInjectorIfNeeded(route, injector);\n return runCanMatchGuards(injector, route, segments, urlSerializer, abortSignal).pipe(\n map((v) => (v === true ? result : {...noMatch})),\n );\n}\n\nexport function match(\n segmentGroup: UrlSegmentGroup,\n route: Route,\n segments: UrlSegment[],\n): MatchResult {\n if (route.path === '') {\n if (route.pathMatch === 'full' && (segmentGroup.hasChildren() || segments.length > 0)) {\n return {...noMatch};\n }\n\n return {\n matched: true,\n consumedSegments: [],\n remainingSegments: segments,\n parameters: {},\n positionalParamSegments: {},\n };\n }\n\n const matcher = route.matcher || defaultUrlMatcher;\n const res = matcher(segments, segmentGroup, route);\n if (!res) return {...noMatch};\n\n const posParams: {[n: string]: string} = {};\n Object.entries(res.posParams ?? {}).forEach(([k, v]) => {\n posParams[k] = v.path;\n });\n const parameters =\n res.consumed.length > 0\n ? {...posParams, ...res.consumed[res.consumed.length - 1].parameters}\n : posParams;\n\n return {\n matched: true,\n consumedSegments: res.consumed,\n remainingSegments: segments.slice(res.consumed.length),\n // TODO(atscott): investigate combining parameters and positionalParamSegments\n parameters,\n positionalParamSegments: res.posParams ?? {},\n };\n}\n\nexport function split(\n segmentGroup: UrlSegmentGroup,\n consumedSegments: UrlSegment[],\n slicedSegments: UrlSegment[],\n config: Route[],\n): {\n segmentGroup: UrlSegmentGroup;\n slicedSegments: UrlSegment[];\n} {\n if (\n slicedSegments.length > 0 &&\n containsEmptyPathMatchesWithNamedOutlets(segmentGroup, slicedSegments, config)\n ) {\n const s = new UrlSegmentGroup(\n consumedSegments,\n createChildrenForEmptyPaths(\n config,\n new UrlSegmentGroup(slicedSegments, segmentGroup.children),\n ),\n );\n return {segmentGroup: s, slicedSegments: []};\n }\n\n if (\n slicedSegments.length === 0 &&\n containsEmptyPathMatches(segmentGroup, slicedSegments, config)\n ) {\n const s = new UrlSegmentGroup(\n segmentGroup.segments,\n addEmptyPathsToChildrenIfNeeded(segmentGroup, slicedSegments, config, segmentGroup.children),\n );\n return {segmentGroup: s, slicedSegments};\n }\n\n const s = new UrlSegmentGroup(segmentGroup.segments, segmentGroup.children);\n return {segmentGroup: s, slicedSegments};\n}\n\nfunction addEmptyPathsToChildrenIfNeeded(\n segmentGroup: UrlSegmentGroup,\n slicedSegments: UrlSegment[],\n routes: Route[],\n children: {[name: string]: UrlSegmentGroup},\n): {[name: string]: UrlSegmentGroup} {\n const res: {[name: string]: UrlSegmentGroup} = {};\n for (const r of routes) {\n if (emptyPathMatch(segmentGroup, slicedSegments, r) && !children[getOutlet(r)]) {\n const s = new UrlSegmentGroup([], {});\n res[getOutlet(r)] = s;\n }\n }\n return {...children, ...res};\n}\n\nfunction createChildrenForEmptyPaths(\n routes: Route[],\n primarySegment: UrlSegmentGroup,\n): {[name: string]: UrlSegmentGroup} {\n const res: {[name: string]: UrlSegmentGroup} = {};\n res[PRIMARY_OUTLET] = primarySegment;\n\n for (const r of routes) {\n if (r.path === '' && getOutlet(r) !== PRIMARY_OUTLET) {\n const s = new UrlSegmentGroup([], {});\n res[getOutlet(r)] = s;\n }\n }\n return res;\n}\n\nfunction containsEmptyPathMatchesWithNamedOutlets(\n segmentGroup: UrlSegmentGroup,\n slicedSegments: UrlSegment[],\n routes: Route[],\n): boolean {\n return routes.some(\n (r) => emptyPathMatch(segmentGroup, slicedSegments, r) && getOutlet(r) !== PRIMARY_OUTLET,\n );\n}\n\nfunction containsEmptyPathMatches(\n segmentGroup: UrlSegmentGroup,\n slicedSegments: UrlSegment[],\n routes: Route[],\n): boolean {\n return routes.some((r) => emptyPathMatch(segmentGroup, slicedSegments, r));\n}\n\nexport function emptyPathMatch(\n segmentGroup: UrlSegmentGroup,\n slicedSegments: UrlSegment[],\n r: Route,\n): boolean {\n if ((segmentGroup.hasChildren() || slicedSegments.length > 0) && r.pathMatch === 'full') {\n return false;\n }\n\n return r.path === '';\n}\n\nexport function noLeftoversInUrl(\n segmentGroup: UrlSegmentGroup,\n segments: UrlSegment[],\n outlet: string,\n): boolean {\n return segments.length === 0 && !segmentGroup.children[outlet];\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EnvironmentInjector, Type, ɵRuntimeError as RuntimeError} from '@angular/core';\n\nimport {AbsoluteRedirect, ApplyRedirects, canLoadFails, NoMatch} from './apply_redirects';\nimport {createUrlTreeFromSnapshot} from './create_url_tree';\nimport {RuntimeErrorCode} from './errors';\nimport {Data, LoadedRouterConfig, ResolveData, Route, Routes} from './models';\nimport {runCanLoadGuards} from './operators/check_guards';\nimport {RouterConfigLoader} from './router_config_loader';\nimport {\n ActivatedRouteSnapshot,\n getInherited,\n ParamsInheritanceStrategy,\n RouterStateSnapshot,\n} from './router_state';\nimport {PRIMARY_OUTLET} from './shared';\nimport {UrlSegment, UrlSegmentGroup, UrlSerializer, UrlTree} from './url_tree';\nimport {getOutlet, sortByMatchingOutlets} from './utils/config';\nimport {\n emptyPathMatch,\n match,\n matchWithChecks,\n noLeftoversInUrl,\n split,\n} from './utils/config_matching';\nimport {TreeNode} from './utils/tree';\nimport {firstValueFrom} from './utils/first_value_from';\nimport {isEmptyError} from './utils/type_guards';\n\n/**\n * Class used to indicate there were no additional route config matches but that all segments of\n * the URL were consumed during matching so the route was URL matched. When this happens, we still\n * try to match child configs in case there are empty path children.\n */\nclass NoLeftoversInUrl {}\n\nexport async function recognize(\n injector: EnvironmentInjector,\n configLoader: RouterConfigLoader,\n rootComponentType: Type<any> | null,\n config: Routes,\n urlTree: UrlTree,\n urlSerializer: UrlSerializer,\n paramsInheritanceStrategy: ParamsInheritanceStrategy = 'emptyOnly',\n abortSignal: AbortSignal,\n): Promise<{state: RouterStateSnapshot; tree: UrlTree}> {\n return new Recognizer(\n injector,\n configLoader,\n rootComponentType,\n config,\n urlTree,\n paramsInheritanceStrategy,\n urlSerializer,\n abortSignal,\n ).recognize();\n}\n\nconst MAX_ALLOWED_REDIRECTS = 31;\n\nexport class Recognizer {\n private applyRedirects: ApplyRedirects;\n private absoluteRedirectCount = 0;\n allowRedirects = true;\n\n constructor(\n private injector: EnvironmentInjector,\n private configLoader: RouterConfigLoader,\n private rootComponentType: Type<any> | null,\n private config: Routes,\n private urlTree: UrlTree,\n private paramsInheritanceStrategy: ParamsInheritanceStrategy,\n private readonly urlSerializer: UrlSerializer,\n private readonly abortSignal: AbortSignal,\n ) {\n this.applyRedirects = new ApplyRedirects(this.urlSerializer, this.urlTree);\n }\n\n private noMatchError(e: NoMatch): RuntimeError<RuntimeErrorCode.NO_MATCH> {\n return new RuntimeError(\n RuntimeErrorCode.NO_MATCH,\n typeof ngDevMode === 'undefined' || ngDevMode\n ? `Cannot match any routes. URL Segment: '${e.segmentGroup}'`\n : `'${e.segmentGroup}'`,\n );\n }\n\n async recognize(): Promise<{state: RouterStateSnapshot; tree: UrlTree}> {\n const rootSegmentGroup = split(this.urlTree.root, [], [], this.config).segmentGroup;\n\n const {children, rootSnapshot} = await this.match(rootSegmentGroup);\n const rootNode = new TreeNode(rootSnapshot, children);\n const routeState = new RouterStateSnapshot('', rootNode);\n const tree = createUrlTreeFromSnapshot(\n rootSnapshot,\n [],\n this.urlTree.queryParams,\n this.urlTree.fragment,\n );\n // Creating the tree stringifies the query params\n // We don't want to do this here to preserve pre-existing behavior\n // so reassign them to the original.\n tree.queryParams = this.urlTree.queryParams;\n routeState.url = this.urlSerializer.serialize(tree);\n return {state: routeState, tree};\n }\n\n private async match(rootSegmentGroup: UrlSegmentGroup): Promise<{\n children: TreeNode<ActivatedRouteSnapshot>[];\n rootSnapshot: ActivatedRouteSnapshot;\n }> {\n // Use Object.freeze to prevent readers of the Router state from modifying it outside\n // of a navigation, resulting in the router being out of sync with the browser.\n const rootSnapshot = new ActivatedRouteSnapshot(\n [],\n Object.freeze({}),\n Object.freeze({...this.urlTree.queryParams}),\n this.urlTree.fragment,\n Object.freeze({}),\n PRIMARY_OUTLET,\n this.rootComponentType,\n null,\n {},\n this.injector,\n );\n try {\n const children = await this.processSegmentGroup(\n this.injector,\n this.config,\n rootSegmentGroup,\n PRIMARY_OUTLET,\n rootSnapshot,\n );\n return {children, rootSnapshot};\n } catch (e: any) {\n if (e instanceof AbsoluteRedirect) {\n this.urlTree = e.urlTree;\n return this.match(e.urlTree.root);\n }\n if (e instanceof NoMatch) {\n throw this.noMatchError(e);\n }\n\n throw e;\n }\n }\n\n async processSegmentGroup(\n injector: EnvironmentInjector,\n config: Route[],\n segmentGroup: UrlSegmentGroup,\n outlet: string,\n parentRoute: ActivatedRouteSnapshot,\n ): Promise<TreeNode<ActivatedRouteSnapshot>[]> {\n if (segmentGroup.segments.length === 0 && segmentGroup.hasChildren()) {\n return this.processChildren(injector, config, segmentGroup, parentRoute);\n }\n\n const child = await this.processSegment(\n injector,\n config,\n segmentGroup,\n segmentGroup.segments,\n outlet,\n true,\n parentRoute,\n );\n return child instanceof TreeNode ? [child] : [];\n }\n\n /**\n * Matches every child outlet in the `segmentGroup` to a `Route` in the config. Returns `null` if\n * we cannot find a match for _any_ of the children.\n *\n * @param config - The `Routes` to match against\n * @param segmentGroup - The `UrlSegmentGroup` whose children need to be matched against the\n * config.\n */\n async processChildren(\n injector: EnvironmentInjector,\n config: Route[],\n segmentGroup: UrlSegmentGroup,\n parentRoute: ActivatedRouteSnapshot,\n ): Promise<TreeNode<ActivatedRouteSnapshot>[]> {\n // Expand outlets one at a time, starting with the primary outlet. We need to do it this way\n // because an absolute redirect from the primary outlet takes precedence.\n const childOutlets: string[] = [];\n for (const child of Object.keys(segmentGroup.children)) {\n if (child === 'primary') {\n childOutlets.unshift(child);\n } else {\n childOutlets.push(child);\n }\n }\n\n let children: TreeNode<ActivatedRouteSnapshot>[] = [];\n for (const childOutlet of childOutlets) {\n const child = segmentGroup.children[childOutlet];\n // Sort the config so that routes with outlets that match the one being activated\n // appear first, followed by routes for other outlets, which might match if they have\n // an empty path.\n const sortedConfig = sortByMatchingOutlets(config, childOutlet);\n const outletChildren = await this.processSegmentGroup(\n injector,\n sortedConfig,\n child,\n childOutlet,\n parentRoute,\n );\n children.push(...outletChildren);\n }\n\n // Because we may have matched two outlets to the same empty path segment, we can have\n // multiple activated results for the same outlet. We should merge the children of\n // these results so the final return value is only one `TreeNode` per outlet.\n const mergedChildren = mergeEmptyPathMatches(children);\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n // This should really never happen - we are only taking the first match for each\n // outlet and merge the empty path matches.\n checkOutletNameUniqueness(mergedChildren);\n }\n sortActivatedRouteSnapshots(mergedChildren);\n return mergedChildren;\n }\n\n async processSegment(\n injector: EnvironmentInjector,\n routes: Route[],\n segmentGroup: UrlSegmentGroup,\n segments: UrlSegment[],\n outlet: string,\n allowRedirects: boolean,\n parentRoute: ActivatedRouteSnapshot,\n ): Promise<TreeNode<ActivatedRouteSnapshot> | NoLeftoversInUrl> {\n for (const r of routes) {\n try {\n return await this.processSegmentAgainstRoute(\n r._injector ?? injector,\n routes,\n r,\n segmentGroup,\n segments,\n outlet,\n allowRedirects,\n parentRoute,\n );\n } catch (e: any) {\n if (e instanceof NoMatch || isEmptyError(e)) {\n continue;\n }\n throw e;\n }\n }\n\n if (noLeftoversInUrl(segmentGroup, segments, outlet)) {\n return new NoLeftoversInUrl();\n }\n throw new NoMatch(segmentGroup);\n }\n\n async processSegmentAgainstRoute(\n injector: EnvironmentInjector,\n routes: Route[],\n route: Route,\n rawSegment: UrlSegmentGroup,\n segments: UrlSegment[],\n outlet: string,\n allowRedirects: boolean,\n parentRoute: ActivatedRouteSnapshot,\n ): Promise<TreeNode<ActivatedRouteSnapshot> | NoLeftoversInUrl> {\n // We allow matches to empty paths when the outlets differ so we can match a url like `/(b:b)` to\n // a config like\n // * `{path: '', children: [{path: 'b', outlet: 'b'}]}`\n // or even\n // * `{path: '', outlet: 'a', children: [{path: 'b', outlet: 'b'}]`\n //\n // The exception here is when the segment outlet is for the primary outlet. This would\n // result in a match inside the named outlet because all children there are written as primary\n // outlets. So we need to prevent child named outlet matches in a url like `/b` in a config like\n // * `{path: '', outlet: 'x' children: [{path: 'b'}]}`\n // This should only match if the url is `/(x:b)`.\n if (\n getOutlet(route) !== outlet &&\n (outlet === PRIMARY_OUTLET || !emptyPathMatch(rawSegment, segments, route))\n ) {\n throw new NoMatch(rawSegment);\n }\n\n if (route.redirectTo === undefined) {\n return this.matchSegmentAgainstRoute(\n injector,\n rawSegment,\n route,\n segments,\n outlet,\n parentRoute,\n );\n }\n\n if (this.allowRedirects && allowRedirects) {\n return this.expandSegmentAgainstRouteUsingRedirect(\n injector,\n rawSegment,\n routes,\n route,\n segments,\n outlet,\n parentRoute,\n );\n }\n\n throw new NoMatch(rawSegment);\n }\n\n private async expandSegmentAgainstRouteUsingRedirect(\n injector: EnvironmentInjector,\n segmentGroup: UrlSegmentGroup,\n routes: Route[],\n route: Route,\n segments: UrlSegment[],\n outlet: string,\n parentRoute: ActivatedRouteSnapshot,\n ): Promise<TreeNode<ActivatedRouteSnapshot> | NoLeftoversInUrl> {\n const {matched, parameters, consumedSegments, positionalParamSegments, remainingSegments} =\n match(segmentGroup, route, segments);\n if (!matched) throw new NoMatch(segmentGroup);\n\n // TODO(atscott): Move all of this under an if(ngDevMode) as a breaking change and allow stack\n // size exceeded in production\n if (typeof route.redirectTo === 'string' && route.redirectTo[0] === '/') {\n this.absoluteRedirectCount++;\n if (this.absoluteRedirectCount > MAX_ALLOWED_REDIRECTS) {\n if (ngDevMode) {\n throw new RuntimeError(\n RuntimeErrorCode.INFINITE_REDIRECT,\n `Detected possible infinite redirect when redirecting from '${this.urlTree}' to '${route.redirectTo}'.\\n` +\n `This is currently a dev mode only error but will become a` +\n ` call stack size exceeded error in production in a future major version.`,\n );\n }\n this.allowRedirects = false;\n }\n }\n const currentSnapshot = new ActivatedRouteSnapshot(\n segments,\n parameters,\n Object.freeze({...this.urlTree.queryParams}),\n this.urlTree.fragment,\n getData(route),\n getOutlet(route),\n route.component ?? route._loadedComponent ?? null,\n route,\n getResolve(route),\n injector,\n );\n const inherited = getInherited(currentSnapshot, parentRoute, this.paramsInheritanceStrategy);\n currentSnapshot.params = Object.freeze(inherited.params);\n currentSnapshot.data = Object.freeze(inherited.data);\n if (this.abortSignal.aborted) {\n throw new Error(this.abortSignal.reason);\n }\n const newTree = await this.applyRedirects.applyRedirectCommands(\n consumedSegments,\n route.redirectTo!,\n positionalParamSegments,\n currentSnapshot,\n injector,\n );\n\n const newSegments = await this.applyRedirects.lineralizeSegments(route, newTree);\n return this.processSegment(\n injector,\n routes,\n segmentGroup,\n newSegments.concat(remainingSegments),\n outlet,\n false,\n parentRoute,\n );\n }\n\n async matchSegmentAgainstRoute(\n injector: EnvironmentInjector,\n rawSegment: UrlSegmentGroup,\n route: Route,\n segments: UrlSegment[],\n outlet: string,\n parentRoute: ActivatedRouteSnapshot,\n ): Promise<TreeNode<ActivatedRouteSnapshot>> {\n if (this.abortSignal.aborted) {\n throw new Error(this.abortSignal.reason);\n }\n const result = await firstValueFrom(\n matchWithChecks(rawSegment, route, segments, injector, this.urlSerializer, this.abortSignal),\n );\n if (route.path === '**') {\n // Prior versions of the route matching algorithm would stop matching at the wildcard route.\n // We should investigate a better strategy for any existing children. Otherwise, these\n // child segments are silently dropped from the navigation.\n // https://github.com/angular/angular/issues/40089\n rawSegment.children = {};\n }\n\n if (!result?.matched) {\n throw new NoMatch(rawSegment);\n }\n // If the route has an injector created from providers, we should start using that.\n injector = route._injector ?? injector;\n const {routes: childConfig} = await this.getChildConfig(injector, route, segments);\n const childInjector = route._loadedInjector ?? injector;\n\n const {parameters, consumedSegments, remainingSegments} = result;\n const snapshot = new ActivatedRouteSnapshot(\n consumedSegments,\n parameters,\n Object.freeze({...this.urlTree.queryParams}),\n this.urlTree.fragment,\n getData(route),\n getOutlet(route),\n route.component ?? route._loadedComponent ?? null,\n route,\n getResolve(route),\n injector,\n );\n const inherited = getInherited(snapshot, parentRoute, this.paramsInheritanceStrategy);\n snapshot.params = Object.freeze(inherited.params);\n snapshot.data = Object.freeze(inherited.data);\n\n const {segmentGroup, slicedSegments} = split(\n rawSegment,\n consumedSegments,\n remainingSegments,\n childConfig,\n );\n\n if (slicedSegments.length === 0 && segmentGroup.hasChildren()) {\n const children = await this.processChildren(\n childInjector,\n childConfig,\n segmentGroup,\n snapshot,\n );\n return new TreeNode(snapshot, children);\n }\n\n if (childConfig.length === 0 && slicedSegments.length === 0) {\n return new TreeNode(snapshot, []);\n }\n\n const matchedOnOutlet = getOutlet(route) === outlet;\n // If we matched a config due to empty path match on a different outlet, we need to\n // continue passing the current outlet for the segment rather than switch to PRIMARY.\n // Note that we switch to primary when we have a match because outlet configs look like\n // this: {path: 'a', outlet: 'a', children: [\n // {path: 'b', component: B},\n // {path: 'c', component: C},\n // ]}\n // Notice that the children of the named outlet are configured with the primary outlet\n const child = await this.processSegment(\n childInjector,\n childConfig,\n segmentGroup,\n slicedSegments,\n matchedOnOutlet ? PRIMARY_OUTLET : outlet,\n true,\n snapshot,\n );\n return new TreeNode(snapshot, child instanceof TreeNode ? [child] : []);\n }\n private async getChildConfig(\n injector: EnvironmentInjector,\n route: Route,\n segments: UrlSegment[],\n ): Promise<LoadedRouterConfig> {\n if (route.children) {\n // The children belong to the same module\n return {routes: route.children, injector};\n }\n\n if (route.loadChildren) {\n // lazy children belong to the loaded module\n if (route._loadedRoutes !== undefined) {\n const ngModuleFactory = route._loadedNgModuleFactory;\n if (ngModuleFactory && !route._loadedInjector) {\n route._loadedInjector = ngModuleFactory.create(injector).injector;\n }\n return {routes: route._loadedRoutes, injector: route._loadedInjector};\n }\n\n if (this.abortSignal.aborted) {\n throw new Error(this.abortSignal.reason);\n }\n const shouldLoadResult = await firstValueFrom(\n runCanLoadGuards(injector, route, segments, this.urlSerializer, this.abortSignal),\n );\n if (shouldLoadResult) {\n const cfg = await this.configLoader.loadChildren(injector, route);\n route._loadedRoutes = cfg.routes;\n route._loadedInjector = cfg.injector;\n route._loadedNgModuleFactory = cfg.factory;\n return cfg;\n }\n throw canLoadFails(route);\n }\n\n return {routes: [], injector};\n }\n}\n\nfunction sortActivatedRouteSnapshots(nodes: TreeNode<ActivatedRouteSnapshot>[]): void {\n nodes.sort((a, b) => {\n if (a.value.outlet === PRIMARY_OUTLET) return -1;\n if (b.value.outlet === PRIMARY_OUTLET) return 1;\n return a.value.outlet.localeCompare(b.value.outlet);\n });\n}\n\nfunction hasEmptyPathConfig(node: TreeNode<ActivatedRouteSnapshot>) {\n const config = node.value.routeConfig;\n return config && config.path === '';\n}\n\n/**\n * Finds `TreeNode`s with matching empty path route configs and merges them into `TreeNode` with\n * the children from each duplicate. This is necessary because different outlets can match a\n * single empty path route config and the results need to then be merged.\n */\nfunction mergeEmptyPathMatches(\n nodes: Array<TreeNode<ActivatedRouteSnapshot>>,\n): Array<TreeNode<ActivatedRouteSnapshot>> {\n const result: Array<TreeNode<ActivatedRouteSnapshot>> = [];\n // The set of nodes which contain children that were merged from two duplicate empty path nodes.\n const mergedNodes: Set<TreeNode<ActivatedRouteSnapshot>> = new Set();\n\n for (const node of nodes) {\n if (!hasEmptyPathConfig(node)) {\n result.push(node);\n continue;\n }\n\n const duplicateEmptyPathNode = result.find(\n (resultNode) => node.value.routeConfig === resultNode.value.routeConfig,\n );\n if (duplicateEmptyPathNode !== undefined) {\n duplicateEmptyPathNode.children.push(...node.children);\n mergedNodes.add(duplicateEmptyPathNode);\n } else {\n result.push(node);\n }\n }\n // For each node which has children from multiple sources, we need to recompute a new `TreeNode`\n // by also merging those children. This is necessary when there are multiple empty path configs\n // in a row. Put another way: whenever we combine children of two nodes, we need to also check\n // if any of those children can be combined into a single node as well.\n for (const mergedNode of mergedNodes) {\n const mergedChildren = mergeEmptyPathMatches(mergedNode.children);\n result.push(new TreeNode(mergedNode.value, mergedChildren));\n }\n return result.filter((n) => !mergedNodes.has(n));\n}\n\nfunction checkOutletNameUniqueness(nodes: TreeNode<ActivatedRouteSnapshot>[]): void {\n const names: {[k: string]: ActivatedRouteSnapshot} = {};\n nodes.forEach((n) => {\n const routeWithSameOutletName = names[n.value.outlet];\n if (routeWithSameOutletName) {\n const p = routeWithSameOutletName.url.map((s) => s.toString()).join('/');\n const c = n.value.url.map((s) => s.toString()).join('/');\n throw new RuntimeError(\n RuntimeErrorCode.TWO_SEGMENTS_WITH_SAME_OUTLET,\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n `Two segments cannot have the same outlet name: '${p}' and '${c}'.`,\n );\n }\n names[n.value.outlet] = n.value;\n });\n}\n\nfunction getData(route: Route): Data {\n return route.data || {};\n}\n\nfunction getResolve(route: Route): ResolveData {\n return route.resolve || {};\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EnvironmentInjector, Type} from '@angular/core';\nimport {MonoTypeOperatorFunction} from 'rxjs';\nimport {mergeMap} from 'rxjs/operators';\n\nimport type {Route} from '../models';\nimport type {NavigationTransition} from '../navigation_transition';\nimport {recognize as recognizeFn} from '../recognize';\nimport type {RouterConfigLoader} from '../router_config_loader';\nimport type {UrlSerializer} from '../url_tree';\n\nexport function recognize(\n injector: EnvironmentInjector,\n configLoader: RouterConfigLoader,\n rootComponentType: Type<any> | null,\n config: Route[],\n serializer: UrlSerializer,\n paramsInheritanceStrategy: 'emptyOnly' | 'always',\n abortSignal: AbortSignal,\n): MonoTypeOperatorFunction<NavigationTransition> {\n return mergeMap(async (t) => {\n const {state: targetSnapshot, tree: urlAfterRedirects} = await recognizeFn(\n injector,\n configLoader,\n rootComponentType,\n config,\n t.extractedUrl,\n serializer,\n paramsInheritanceStrategy,\n abortSignal,\n );\n return {...t, targetSnapshot, urlAfterRedirects};\n });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EnvironmentInjector, ProviderToken, runInInjectionContext} from '@angular/core';\nimport {defer, EMPTY, from, MonoTypeOperatorFunction, Observable, of, throwError} from 'rxjs';\nimport {catchError, concatMap, first, map, mergeMap, takeLast, tap} from 'rxjs/operators';\n\nimport {RedirectCommand, ResolveData} from '../models';\nimport type {NavigationTransition} from '../navigation_transition';\nimport {\n ActivatedRouteSnapshot,\n getInherited,\n hasStaticTitle,\n RouterStateSnapshot,\n} from '../router_state';\nimport {RouteTitleKey} from '../shared';\nimport {getDataKeys, wrapIntoObservable} from '../utils/collection';\nimport {getTokenOrFunctionIdentity} from '../utils/preactivation';\nimport {isEmptyError} from '../utils/type_guards';\nimport {redirectingNavigationError} from '../navigation_canceling_error';\nimport {DefaultUrlSerializer} from '../url_tree';\n\nexport function resolveData(\n paramsInheritanceStrategy: 'emptyOnly' | 'always',\n): MonoTypeOperatorFunction<NavigationTransition> {\n return mergeMap((t) => {\n const {\n targetSnapshot,\n guards: {canActivateChecks},\n } = t;\n\n if (!canActivateChecks.length) {\n return of(t);\n }\n // Iterating a Set in javascript happens in insertion order so it is safe to use a `Set` to\n // preserve the correct order that the resolvers should run in.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set#description\n const routesWithResolversToRun = new Set(canActivateChecks.map((check) => check.route));\n const routesNeedingDataUpdates = new Set<ActivatedRouteSnapshot>();\n for (const route of routesWithResolversToRun) {\n if (routesNeedingDataUpdates.has(route)) {\n continue;\n }\n // All children under the route with a resolver to run need to recompute inherited data.\n for (const newRoute of flattenRouteTree(route)) {\n routesNeedingDataUpdates.add(newRoute);\n }\n }\n let routesProcessed = 0;\n return from(routesNeedingDataUpdates).pipe(\n concatMap((route) => {\n if (routesWithResolversToRun.has(route)) {\n return runResolve(route, targetSnapshot!, paramsInheritanceStrategy);\n } else {\n route.data = getInherited(route, route.parent, paramsInheritanceStrategy).resolve;\n return of(void 0);\n }\n }),\n tap(() => routesProcessed++),\n takeLast(1),\n mergeMap((_) => (routesProcessed === routesNeedingDataUpdates.size ? of(t) : EMPTY)),\n );\n });\n}\n\n/**\n * Returns the `ActivatedRouteSnapshot` tree as an array, using DFS to traverse the route tree.\n */\nfunction flattenRouteTree(route: ActivatedRouteSnapshot): ActivatedRouteSnapshot[] {\n const descendants = route.children.map((child) => flattenRouteTree(child)).flat();\n return [route, ...descendants];\n}\n\nfunction runResolve(\n futureARS: ActivatedRouteSnapshot,\n futureRSS: RouterStateSnapshot,\n paramsInheritanceStrategy: 'emptyOnly' | 'always',\n) {\n const config = futureARS.routeConfig;\n const resolve = futureARS._resolve;\n if (config?.title !== undefined && !hasStaticTitle(config)) {\n resolve[RouteTitleKey] = config.title;\n }\n return defer(() => {\n futureARS.data = getInherited(futureARS, futureARS.parent, paramsInheritanceStrategy).resolve;\n return resolveNode(resolve, futureARS, futureRSS).pipe(\n map((resolvedData: any) => {\n futureARS._resolvedData = resolvedData;\n futureARS.data = {...futureARS.data, ...resolvedData};\n return null;\n }),\n );\n });\n}\n\nfunction resolveNode(\n resolve: ResolveData,\n futureARS: ActivatedRouteSnapshot,\n futureRSS: RouterStateSnapshot,\n): Observable<any> {\n const keys = getDataKeys(resolve);\n if (keys.length === 0) {\n return of({});\n }\n const data: {[k: string | symbol]: any} = {};\n return from(keys).pipe(\n mergeMap((key) =>\n getResolver(resolve[key], futureARS, futureRSS).pipe(\n first(),\n tap((value: any) => {\n if (value instanceof RedirectCommand) {\n throw redirectingNavigationError(new DefaultUrlSerializer(), value);\n }\n data[key] = value;\n }),\n ),\n ),\n takeLast(1),\n map(() => data),\n catchError((e: unknown) => (isEmptyError(e as Error) ? EMPTY : throwError(e))),\n );\n}\n\nfunction getResolver(\n injectionToken: ProviderToken<any> | Function,\n futureARS: ActivatedRouteSnapshot,\n futureRSS: RouterStateSnapshot,\n): Observable<any> {\n const closestInjector = futureARS._environmentInjector;\n const resolver = getTokenOrFunctionIdentity(injectionToken, closestInjector);\n const resolverValue = resolver.resolve\n ? resolver.resolve(futureARS, futureRSS)\n : runInInjectionContext(closestInjector, () => resolver(futureARS, futureRSS));\n return wrapIntoObservable(resolverValue);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {from, MonoTypeOperatorFunction, ObservableInput, of} from 'rxjs';\nimport {map, switchMap} from 'rxjs/operators';\n\n/**\n * Perform a side effect through a switchMap for every emission on the source Observable,\n * but return an Observable that is identical to the source. It's essentially the same as\n * the `tap` operator, but if the side effectful `next` function returns an ObservableInput,\n * it will wait before continuing with the original value.\n */\nexport function switchTap<T>(\n next: (x: T) => void | ObservableInput<any>,\n): MonoTypeOperatorFunction<T> {\n return switchMap((v) => {\n const nextResult = next(v);\n if (nextResult) {\n return from(nextResult).pipe(map(() => v));\n }\n return of(v);\n });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {inject, Injectable} from '@angular/core';\nimport {Title} from '@angular/platform-browser';\n\nimport {ActivatedRouteSnapshot, RouterStateSnapshot} from './router_state';\nimport {PRIMARY_OUTLET, RouteTitleKey} from './shared';\n\n/**\n * Provides a strategy for setting the page title after a router navigation.\n *\n * The built-in implementation traverses the router state snapshot and finds the deepest primary\n * outlet with `title` property. Given the `Routes` below, navigating to\n * `/base/child(popup:aux)` would result in the document title being set to \"child\".\n * ```ts\n * [\n * {path: 'base', title: 'base', children: [\n * {path: 'child', title: 'child'},\n * ],\n * {path: 'aux', outlet: 'popup', title: 'popupTitle'}\n * ]\n * ```\n *\n * This class can be used as a base class for custom title strategies. That is, you can create your\n * own class that extends the `TitleStrategy`. Note that in the above example, the `title`\n * from the named outlet is never used. However, a custom strategy might be implemented to\n * incorporate titles in named outlets.\n *\n * @publicApi\n * @see [Page title guide](guide/routing/define-routes#using-titlestrategy-for-page-titles)\n */\n@Injectable({providedIn: 'root', useFactory: () => inject(DefaultTitleStrategy)})\nexport abstract class TitleStrategy {\n /** Performs the application title update. */\n abstract updateTitle(snapshot: RouterStateSnapshot): void;\n\n /**\n * @returns The `title` of the deepest primary route.\n */\n buildTitle(snapshot: RouterStateSnapshot): string | undefined {\n let pageTitle: string | undefined;\n let route: ActivatedRouteSnapshot | undefined = snapshot.root;\n while (route !== undefined) {\n pageTitle = this.getResolvedTitleForRoute(route) ?? pageTitle;\n route = route.children.find((child) => child.outlet === PRIMARY_OUTLET);\n }\n return pageTitle;\n }\n\n /**\n * Given an `ActivatedRouteSnapshot`, returns the final value of the\n * `Route.title` property, which can either be a static string or a resolved value.\n */\n getResolvedTitleForRoute(snapshot: ActivatedRouteSnapshot) {\n return snapshot.data[RouteTitleKey];\n }\n}\n\n/**\n * The default `TitleStrategy` used by the router that updates the title using the `Title` service.\n */\n@Injectable({providedIn: 'root'})\nexport class DefaultTitleStrategy extends TitleStrategy {\n constructor(readonly title: Title) {\n super();\n }\n\n /**\n * Sets the title of the browser to the given value.\n *\n * @param title The `pageTitle` from the deepest primary route.\n */\n override updateTitle(snapshot: RouterStateSnapshot): void {\n const title = this.buildTitle(snapshot);\n if (title !== undefined) {\n this.title.setTitle(title);\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '@angular/core';\n\nimport {OnSameUrlNavigation, QueryParamsHandling, RedirectCommand} from './models';\n\n/**\n * Allowed values in an `ExtraOptions` object that configure\n * when the router performs the initial navigation operation.\n *\n * * 'enabledNonBlocking' - (default) The initial navigation starts after the\n * root component has been created. The bootstrap is not blocked on the completion of the initial\n * navigation.\n * * 'enabledBlocking' - The initial navigation starts before the root component is created.\n * The bootstrap is blocked until the initial navigation is complete. This value should be set in\n * case you use [server-side rendering](guide/ssr), but do not enable [hydration](guide/hydration)\n * for your application.\n * * 'disabled' - The initial navigation is not performed. The location listener is set up before\n * the root component gets created. Use if there is a reason to have\n * more control over when the router starts its initial navigation due to some complex\n * initialization logic.\n *\n * @see {@link /api/router/RouterModule#forRoot forRoot}\n *\n * @publicApi\n */\nexport type InitialNavigation = 'disabled' | 'enabledBlocking' | 'enabledNonBlocking';\n\n/**\n * Extra configuration options that can be used with the `withRouterConfig` function.\n *\n * @see [Router configuration options](guide/routing/customizing-route-behavior#router-configuration-options)\n *\n * @publicApi\n */\nexport interface RouterConfigOptions {\n /**\n * Configures how the Router attempts to restore state when a navigation is cancelled.\n *\n * 'replace' - Always uses `location.replaceState` to set the browser state to the state of the\n * router before the navigation started. This means that if the URL of the browser is updated\n * _before_ the navigation is canceled, the Router will simply replace the item in history rather\n * than trying to restore to the previous location in the session history. This happens most\n * frequently with `urlUpdateStrategy: 'eager'` and navigations with the browser back/forward\n * buttons.\n *\n * 'computed' - Will attempt to return to the same index in the session history that corresponds\n * to the Angular route when the navigation gets cancelled. For example, if the browser back\n * button is clicked and the navigation is cancelled, the Router will trigger a forward navigation\n * and vice versa.\n *\n * Note: the 'computed' option is incompatible with any `UrlHandlingStrategy` which only\n * handles a portion of the URL because the history restoration navigates to the previous place in\n * the browser history rather than simply resetting a portion of the URL.\n *\n * The default value is `replace` when not set.\n *\n * @see [Handle canceled navigations](guide/routing/customizing-route-behavior#handle-canceled-navigations)\n *\n */\n canceledNavigationResolution?: 'replace' | 'computed';\n\n /**\n * Configures the default for handling a navigation request to the current URL.\n *\n * If unset, the `Router` will use `'ignore'`.\n *\n * @see {@link OnSameUrlNavigation}\n *\n * @see [React to same-URL navigations](guide/routing/customizing-route-behavior#react-to-same-url-navigations)\n */\n onSameUrlNavigation?: OnSameUrlNavigation;\n\n /**\n * Defines how the router merges parameters, data, and resolved data from parent to child\n * routes.\n *\n * By default ('emptyOnly'), a route inherits the parent route's parameters when the route itself\n * has an empty path (meaning its configured with path: '') or when the parent route doesn't have\n * any component set.\n *\n * Set to 'always' to enable unconditional inheritance of parent parameters.\n *\n * Note that when dealing with matrix parameters, \"parent\" refers to the parent `Route`\n * config which does not necessarily mean the \"URL segment to the left\". When the `Route` `path`\n * contains multiple segments, the matrix parameters must appear on the last segment. For example,\n * matrix parameters for `{path: 'a/b', component: MyComp}` should appear as `a/b;foo=bar` and not\n * `a;foo=bar/b`.\n *\n * @see [Control parameter inheritance](guide/routing/customizing-route-behavior#control-parameter-inheritance)\n *\n */\n paramsInheritanceStrategy?: 'emptyOnly' | 'always';\n\n /**\n * Defines when the router updates the browser URL. By default ('deferred'),\n * update after successful navigation.\n * Set to 'eager' if prefer to update the URL at the beginning of navigation.\n * Updating the URL early allows you to handle a failure of navigation by\n * showing an error message with the URL that failed.\n *\n * @see [Decide when the URL updates](guide/routing/customizing-route-behavior#decide-when-the-url-updates)\n *\n */\n urlUpdateStrategy?: 'deferred' | 'eager';\n\n /**\n * The default strategy to use for handling query params in `Router.createUrlTree` when one is not provided.\n *\n * The `createUrlTree` method is used internally by `Router.navigate` and `RouterLink`.\n * Note that `QueryParamsHandling` does not apply to `Router.navigateByUrl`.\n *\n * When neither the default nor the queryParamsHandling option is specified in the call to `createUrlTree`,\n * the current parameters will be replaced by new parameters.\n *\n * @see {@link Router#createUrlTree}\n * @see {@link QueryParamsHandling}\n * \n * @see [Choose default query parameter handling](guide/routing/customizing-route-behavior#choose-default-query-parameter-handling)\n\n * \n */\n defaultQueryParamsHandling?: QueryParamsHandling;\n\n /**\n * When `true`, the `Promise` will instead resolve with `false`, as it does with other failed\n * navigations (for example, when guards are rejected).\n\n * Otherwise the `Promise` returned by the Router's navigation with be rejected\n * if an error occurs.\n */\n resolveNavigationPromiseOnError?: boolean;\n}\n\n/**\n * Configuration options for the scrolling feature which can be used with `withInMemoryScrolling`\n * function or `RouterModule.forRoot`.\n *\n * @publicApi\n * @see withInMemoryScrolling\n * @see RouterModule#forRoot\n */\nexport interface InMemoryScrollingOptions {\n /**\n * When set to 'enabled', scrolls to the anchor element when the URL has a fragment.\n * Anchor scrolling is disabled by default.\n *\n * Anchor scrolling does not happen on 'popstate'. Instead, we restore the position\n * that we stored or scroll to the top.\n */\n anchorScrolling?: 'disabled' | 'enabled';\n\n /**\n * Configures if the scroll position needs to be restored when navigating back.\n *\n * * 'disabled'- (Default) Does nothing. Scroll position is maintained on navigation.\n * * 'top'- Sets the scroll position to x = 0, y = 0 on all navigation.\n * * 'enabled'- Restores the previous scroll position on backward navigation, else sets the\n * position to the anchor if one is provided, or sets the scroll position to [0, 0] (forward\n * navigation). This option will be the default in the future.\n *\n * You can implement custom scroll restoration behavior by adapting the enabled behavior as\n * in the following example.\n *\n * ```ts\n * class AppComponent {\n * movieData: any;\n *\n * constructor(private router: Router, private viewportScroller: ViewportScroller,\n * changeDetectorRef: ChangeDetectorRef) {\n * router.events.pipe(filter((event: Event): event is Scroll => event instanceof Scroll)\n * ).subscribe(e => {\n * fetch('http://example.com/movies.json').then(response => {\n * this.movieData = response.json();\n * // update the template with the data before restoring scroll\n * changeDetectorRef.detectChanges();\n *\n * if (e.position) {\n * viewportScroller.scrollToPosition(e.position);\n * }\n * });\n * });\n * }\n * }\n * ```\n */\n scrollPositionRestoration?: 'disabled' | 'enabled' | 'top';\n}\n\n/**\n * A set of configuration options for a router module, provided in the\n * `forRoot()` method.\n *\n * @see {@link /api/router/routerModule#forRoot forRoot}\n *\n *\n * @publicApi\n */\nexport interface ExtraOptions extends InMemoryScrollingOptions, RouterConfigOptions {\n /**\n * When true, log all internal navigation events to the console.\n * Use for debugging.\n */\n enableTracing?: boolean;\n\n /**\n * When true, enable the location strategy that uses the URL fragment\n * instead of the history API.\n */\n useHash?: boolean;\n\n /**\n * One of `enabled`, `enabledBlocking`, `enabledNonBlocking` or `disabled`.\n * When set to `enabled` or `enabledBlocking`, the initial navigation starts before the root\n * component is created. The bootstrap is blocked until the initial navigation is complete. This\n * value should be set in case you use [server-side rendering](guide/ssr), but do not enable\n * [hydration](guide/hydration) for your application. When set to `enabledNonBlocking`,\n * the initial navigation starts after the root component has been created.\n * The bootstrap is not blocked on the completion of the initial navigation. When set to\n * `disabled`, the initial navigation is not performed. The location listener is set up before the\n * root component gets created. Use if there is a reason to have more control over when the router\n * starts its initial navigation due to some complex initialization logic.\n */\n initialNavigation?: InitialNavigation;\n\n /**\n * When true, enables binding information from the `Router` state directly to the inputs of the\n * component in `Route` configurations.\n */\n bindToComponentInputs?: boolean;\n\n /**\n * When true, enables view transitions in the Router by running the route activation and\n * deactivation inside of `document.startViewTransition`.\n *\n * @see https://developer.chrome.com/docs/web-platform/view-transitions/\n * @see https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API\n * @experimental 17.0\n */\n enableViewTransitions?: boolean;\n\n /**\n * A custom error handler for failed navigations.\n * If the handler returns a value, the navigation Promise is resolved with this value.\n * If the handler throws an exception, the navigation Promise is rejected with the exception.\n *\n * @see RouterConfigOptions\n */\n errorHandler?: (error: any) => RedirectCommand | any;\n\n /**\n * Configures a preloading strategy.\n * One of `PreloadAllModules` or `NoPreloading` (the default).\n */\n preloadingStrategy?: any;\n\n /**\n * Configures the scroll offset the router will use when scrolling to an element.\n *\n * When given a tuple with x and y position value,\n * the router uses that offset each time it scrolls.\n * When given a function, the router invokes the function every time\n * it restores scroll position.\n */\n scrollOffset?: [number, number] | (() => [number, number]);\n}\n\n/**\n * A DI token for the router service.\n *\n * @publicApi\n */\nexport const ROUTER_CONFIGURATION = new InjectionToken<ExtraOptions>(\n typeof ngDevMode === 'undefined' || ngDevMode ? 'router config' : '',\n {\n factory: () => ({}),\n },\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n Compiler,\n EnvironmentInjector,\n inject,\n Injectable,\n InjectionToken,\n Injector,\n NgModuleFactory,\n runInInjectionContext,\n Type,\n ɵresolveComponentResources as resolveComponentResources,\n} from '@angular/core';\n\nimport {DefaultExport, LoadedRouterConfig, Route, Routes} from './models';\nimport {assertStandalone, validateConfig} from './utils/config';\nimport {standardizeConfig} from './components/empty_outlet';\nimport {wrapIntoPromise} from './utils/collection';\n\n/**\n * The DI token for a router configuration.\n *\n * `ROUTES` is a low level API for router configuration via dependency injection.\n *\n * We recommend that in almost all cases to use higher level APIs such as `RouterModule.forRoot()`,\n * `provideRouter`, or `Router.resetConfig()`.\n *\n * @publicApi\n */\nexport const ROUTES = new InjectionToken<Route[][]>(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'ROUTES' : '',\n);\n\n@Injectable({providedIn: 'root'})\nexport class RouterConfigLoader {\n private componentLoaders = new WeakMap<Route, Promise<Type<unknown>>>();\n private childrenLoaders = new WeakMap<Route, Promise<LoadedRouterConfig>>();\n onLoadStartListener?: (r: Route) => void;\n onLoadEndListener?: (r: Route) => void;\n private readonly compiler = inject(Compiler);\n\n async loadComponent(injector: EnvironmentInjector, route: Route): Promise<Type<unknown>> {\n if (this.componentLoaders.get(route)) {\n return this.componentLoaders.get(route)!;\n } else if (route._loadedComponent) {\n return Promise.resolve(route._loadedComponent);\n }\n\n if (this.onLoadStartListener) {\n this.onLoadStartListener(route);\n }\n const loader = (async () => {\n try {\n const loaded = await wrapIntoPromise(\n runInInjectionContext(injector, () => route.loadComponent!()),\n );\n const component = await maybeResolveResources(maybeUnwrapDefaultExport(loaded));\n\n if (this.onLoadEndListener) {\n this.onLoadEndListener(route);\n }\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n assertStandalone(route.path ?? '', component);\n route._loadedComponent = component;\n return component;\n } finally {\n this.componentLoaders.delete(route);\n }\n })();\n this.componentLoaders.set(route, loader);\n return loader;\n }\n\n loadChildren(parentInjector: Injector, route: Route): Promise<LoadedRouterConfig> {\n if (this.childrenLoaders.get(route)) {\n return this.childrenLoaders.get(route)!;\n } else if (route._loadedRoutes) {\n return Promise.resolve({routes: route._loadedRoutes, injector: route._loadedInjector});\n }\n\n if (this.onLoadStartListener) {\n this.onLoadStartListener(route);\n }\n const loader = (async () => {\n try {\n const result = await loadChildren(\n route,\n this.compiler,\n parentInjector,\n this.onLoadEndListener,\n );\n route._loadedRoutes = result.routes;\n route._loadedInjector = result.injector;\n route._loadedNgModuleFactory = result.factory;\n return result;\n } finally {\n this.childrenLoaders.delete(route);\n }\n })();\n this.childrenLoaders.set(route, loader);\n return loader;\n }\n}\n\n/**\n * Executes a `route.loadChildren` callback and converts the result to an array of child routes and\n * an injector if that callback returned a module.\n *\n * This function is used for the route discovery during prerendering\n * in @angular-devkit/build-angular. If there are any updates to the contract here, it will require\n * an update to the extractor.\n */\nexport async function loadChildren(\n route: Route,\n compiler: Compiler,\n parentInjector: Injector,\n onLoadEndListener?: (r: Route) => void,\n): Promise<LoadedRouterConfig> {\n const loaded = await wrapIntoPromise(\n runInInjectionContext(parentInjector, () => route.loadChildren!()),\n );\n const t = await maybeResolveResources(maybeUnwrapDefaultExport(loaded));\n\n let factoryOrRoutes: NgModuleFactory<any> | Routes;\n if (t instanceof NgModuleFactory || Array.isArray(t)) {\n factoryOrRoutes = t;\n } else {\n factoryOrRoutes = await compiler.compileModuleAsync(t);\n }\n\n if (onLoadEndListener) {\n onLoadEndListener(route);\n }\n // This injector comes from the `NgModuleRef` when lazy loading an `NgModule`. There is\n // no injector associated with lazy loading a `Route` array.\n let injector: EnvironmentInjector | undefined;\n let rawRoutes: Route[];\n let requireStandaloneComponents = false;\n let factory: NgModuleFactory<unknown> | undefined = undefined;\n if (Array.isArray(factoryOrRoutes)) {\n rawRoutes = factoryOrRoutes;\n requireStandaloneComponents = true;\n } else {\n injector = factoryOrRoutes.create(parentInjector).injector;\n factory = factoryOrRoutes;\n // When loading a module that doesn't provide `RouterModule.forChild()` preloader\n // will get stuck in an infinite loop. The child module's Injector will look to\n // its parent `Injector` when it doesn't find any ROUTES so it will return routes\n // for it's parent module instead.\n rawRoutes = injector.get(ROUTES, [], {optional: true, self: true}).flat();\n }\n const routes = rawRoutes.map(standardizeConfig);\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n validateConfig(routes, route.path, requireStandaloneComponents);\n return {routes, injector, factory};\n}\n\nfunction isWrappedDefaultExport<T>(value: T | DefaultExport<T>): value is DefaultExport<T> {\n // We use `in` here with a string key `'default'`, because we expect `DefaultExport` objects to be\n // dynamically imported ES modules with a spec-mandated `default` key. Thus we don't expect that\n // `default` will be a renamed property.\n return value && typeof value === 'object' && 'default' in value;\n}\n\nfunction maybeUnwrapDefaultExport<T>(input: T | DefaultExport<T>): T {\n // As per `isWrappedDefaultExport`, the `default` key here is generated by the browser and not\n // subject to property renaming, so we reference it with bracket access.\n return isWrappedDefaultExport(input) ? input['default'] : input;\n}\n\nasync function maybeResolveResources<T>(value: T): Promise<T> {\n // In JIT mode we usually resolve the resources of components on bootstrap, however\n // that won't have happened for lazy-loaded. Attempt to load any pending\n // resources again here.\n if ((typeof ngJitMode === 'undefined' || ngJitMode) && typeof fetch === 'function') {\n try {\n await resolveComponentResources(fetch);\n } catch (error) {\n console.error(error);\n }\n }\n\n return value;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {inject, Injectable} from '@angular/core';\n\nimport {UrlTree} from './url_tree';\n\n/**\n * @description\n *\n * Provides a way to migrate AngularJS applications to Angular.\n *\n * @see [URL handling strategy](guide/routing/customizing-route-behavior#built-in-preloading-strategies)\n *\n * @publicApi\n */\n@Injectable({providedIn: 'root', useFactory: () => inject(DefaultUrlHandlingStrategy)})\nexport abstract class UrlHandlingStrategy {\n /**\n * Tells the router if this URL should be processed.\n *\n * When it returns true, the router will execute the regular navigation.\n * When it returns false, the router will set the router state to an empty state.\n * As a result, all the active components will be destroyed.\n *\n */\n abstract shouldProcessUrl(url: UrlTree): boolean;\n\n /**\n * Extracts the part of the URL that should be handled by the router.\n * The rest of the URL will remain untouched.\n */\n abstract extract(url: UrlTree): UrlTree;\n\n /**\n * Merges the URL fragment with the rest of the URL.\n */\n abstract merge(newUrlPart: UrlTree, rawUrl: UrlTree): UrlTree;\n}\n\n/**\n * @publicApi\n */\n@Injectable({providedIn: 'root'})\nexport class DefaultUrlHandlingStrategy implements UrlHandlingStrategy {\n shouldProcessUrl(url: UrlTree): boolean {\n return true;\n }\n extract(url: UrlTree): UrlTree {\n return url;\n }\n merge(newUrlPart: UrlTree, wholeUrl: UrlTree): UrlTree {\n return newUrlPart;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DOCUMENT} from '@angular/common';\nimport {afterNextRender, InjectionToken, Injector, runInInjectionContext} from '@angular/core';\n\nimport {ActivatedRouteSnapshot} from '../router_state';\n\nexport const CREATE_VIEW_TRANSITION = new InjectionToken<typeof createViewTransition>(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'view transition helper' : '',\n);\nexport const VIEW_TRANSITION_OPTIONS = new InjectionToken<\n ViewTransitionsFeatureOptions & {skipNextTransition: boolean}\n>(typeof ngDevMode !== 'undefined' && ngDevMode ? 'view transition options' : '');\n\n/**\n * Options to configure the View Transitions integration in the Router.\n *\n * @developerPreview 20.0\n * @see withViewTransitions\n */\nexport interface ViewTransitionsFeatureOptions {\n /**\n * Skips the very first call to `startViewTransition`. This can be useful for disabling the\n * animation during the application's initial loading phase.\n */\n skipInitialTransition?: boolean;\n\n /**\n * A function to run after the `ViewTransition` is created.\n *\n * This function is run in an injection context and can use `inject`.\n */\n onViewTransitionCreated?: (transitionInfo: ViewTransitionInfo) => void;\n}\n\n/**\n * The information passed to the `onViewTransitionCreated` function provided in the\n * `withViewTransitions` feature options.\n *\n * @developerPreview 20.0\n */\nexport interface ViewTransitionInfo {\n /**\n * The `ViewTransition` returned by the call to `startViewTransition`.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ViewTransition\n */\n transition: ViewTransition;\n /**\n * The `ActivatedRouteSnapshot` that the navigation is transitioning from.\n */\n from: ActivatedRouteSnapshot;\n /**\n * The `ActivatedRouteSnapshot` that the navigation is transitioning to.\n */\n to: ActivatedRouteSnapshot;\n}\n\n/**\n * A helper function for using browser view transitions. This function skips the call to\n * `startViewTransition` if the browser does not support it.\n *\n * @returns A Promise that resolves when the view transition callback begins.\n */\nexport function createViewTransition(\n injector: Injector,\n from: ActivatedRouteSnapshot,\n to: ActivatedRouteSnapshot,\n): Promise<void> {\n const transitionOptions = injector.get(VIEW_TRANSITION_OPTIONS);\n const document = injector.get(DOCUMENT);\n if (!document.startViewTransition || transitionOptions.skipNextTransition) {\n transitionOptions.skipNextTransition = false;\n // The timing of `startViewTransition` is closer to a macrotask. It won't be called\n // until the current event loop exits so we use a promise resolved in a timeout instead\n // of Promise.resolve().\n return new Promise((resolve) => setTimeout(resolve));\n }\n\n let resolveViewTransitionStarted: () => void;\n const viewTransitionStarted = new Promise<void>((resolve) => {\n resolveViewTransitionStarted = resolve;\n });\n const transition = document.startViewTransition(() => {\n resolveViewTransitionStarted();\n // We don't actually update dom within the transition callback. The resolving of the above\n // promise unblocks the Router navigation, which synchronously activates and deactivates\n // routes (the DOM update). This view transition waits for the next change detection to\n // complete (below), which includes the update phase of the routed components.\n return createRenderPromise(injector);\n });\n transition.updateCallbackDone.catch((error) => {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n console.error(error);\n }\n });\n transition.ready.catch((error) => {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n console.error(error);\n }\n });\n transition.finished.catch((error) => {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n console.error(error);\n }\n });\n const {onViewTransitionCreated} = transitionOptions;\n if (onViewTransitionCreated) {\n runInInjectionContext(injector, () => onViewTransitionCreated({transition, from, to}));\n }\n return viewTransitionStarted;\n}\n\n/**\n * Creates a promise that resolves after next render.\n */\nfunction createRenderPromise(injector: Injector) {\n return new Promise<void>((resolve) => {\n // Wait for the microtask queue to empty after the next render happens (by waiting a macrotask).\n // This ensures any follow-up renders in the microtask queue are completed before the\n // view transition starts animating.\n afterNextRender({read: () => setTimeout(resolve)}, {injector});\n });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Location} from '@angular/common';\nimport {\n DestroyRef,\n EnvironmentInjector,\n inject,\n Injectable,\n InjectionToken,\n runInInjectionContext,\n signal,\n Type,\n untracked,\n ɵWritable as Writable,\n} from '@angular/core';\nimport {BehaviorSubject, EMPTY, from, Observable, of, Subject} from 'rxjs';\nimport {catchError, filter, finalize, map, switchMap, take, takeUntil, tap} from 'rxjs/operators';\n\nimport {createRouterState} from './create_router_state';\n\nimport {INPUT_BINDER} from './directives/router_outlet';\nimport {\n BeforeActivateRoutes,\n Event,\n GuardsCheckEnd,\n GuardsCheckStart,\n IMPERATIVE_NAVIGATION,\n NavigationCancel,\n NavigationCancellationCode,\n NavigationEnd,\n NavigationError,\n NavigationSkipped,\n NavigationSkippedCode,\n NavigationStart,\n NavigationTrigger,\n RedirectRequest,\n ResolveEnd,\n ResolveStart,\n RouteConfigLoadEnd,\n RouteConfigLoadStart,\n RoutesRecognized,\n} from './events';\nimport {\n GuardResult,\n NavigationBehaviorOptions,\n QueryParamsHandling,\n RedirectCommand,\n Route,\n Routes,\n} from './models';\nimport {\n isNavigationCancelingError,\n isRedirectingNavigationCancelingError,\n redirectingNavigationError,\n} from './navigation_canceling_error';\nimport {ActivateRoutes} from './operators/activate_routes';\nimport {checkGuards} from './operators/check_guards';\nimport {recognize} from './operators/recognize';\nimport {resolveData} from './operators/resolve_data';\nimport {switchTap} from './operators/switch_tap';\nimport {TitleStrategy} from './page_title_strategy';\nimport {RouteReuseStrategy} from './route_reuse_strategy';\nimport {ROUTER_CONFIGURATION} from './router_config';\nimport {RouterConfigLoader} from './router_config_loader';\nimport {ChildrenOutletContexts} from './router_outlet_context';\nimport {\n ActivatedRoute,\n ActivatedRouteSnapshot,\n createEmptyState,\n RouterState,\n RouterStateSnapshot,\n} from './router_state';\nimport type {Params} from './shared';\nimport {UrlHandlingStrategy} from './url_handling_strategy';\nimport {UrlSerializer, UrlTree} from './url_tree';\nimport {Checks, getAllRouteGuards} from './utils/preactivation';\nimport {CREATE_VIEW_TRANSITION} from './utils/view_transition';\nimport {abortSignalToObservable} from './utils/abort_signal_to_observable';\nimport type {Router} from './router';\n\n/**\n * @description\n *\n * Options that modify the `Router` URL.\n * Supply an object containing any of these properties to a `Router` navigation function to\n * control how the target URL should be constructed.\n *\n * @see {@link Router#navigate}\n * @see {@link Router#createUrlTree}\n * @see [Routing and Navigation guide](guide/routing/common-router-tasks)\n *\n * @publicApi\n */\nexport interface UrlCreationOptions {\n /**\n * Specifies a root URI to use for relative navigation.\n *\n * For example, consider the following route configuration where the parent route\n * has two children.\n *\n * ```ts\n * [{\n * path: 'parent',\n * component: ParentComponent,\n * children: [{\n * path: 'list',\n * component: ListComponent\n * },{\n * path: 'child',\n * component: ChildComponent\n * }]\n * }]\n * ```\n *\n * The following `go()` function navigates to the `list` route by\n * interpreting the destination URI as relative to the activated `child` route\n *\n * ```ts\n * @Component({...})\n * class ChildComponent {\n * constructor(private router: Router, private route: ActivatedRoute) {}\n *\n * go() {\n * router.navigate(['../list'], { relativeTo: this.route });\n * }\n * }\n * ```\n *\n * A value of `null` or `undefined` indicates that the navigation commands should be applied\n * relative to the root.\n */\n relativeTo?: ActivatedRoute | null;\n\n /**\n * Sets query parameters to the URL.\n *\n * ```ts\n * // Navigate to /results?page=1\n * router.navigate(['/results'], { queryParams: { page: 1 } });\n * ```\n */\n queryParams?: Params | null;\n\n /**\n * Sets the hash fragment for the URL.\n *\n * ```ts\n * // Navigate to /results#top\n * router.navigate(['/results'], { fragment: 'top' });\n * ```\n */\n fragment?: string;\n\n /**\n * How to handle query parameters in the router link for the next navigation.\n * One of:\n * * `preserve` : Preserve current parameters.\n * * `merge` : Merge new with current parameters.\n *\n * The \"preserve\" option discards any new query params:\n * ```ts\n * // from /view1?page=1 to/view2?page=1\n * router.navigate(['/view2'], { queryParams: { page: 2 }, queryParamsHandling: \"preserve\"\n * });\n * ```\n * The \"merge\" option appends new query params to the params from the current URL:\n * ```ts\n * // from /view1?page=1 to/view2?page=1&otherKey=2\n * router.navigate(['/view2'], { queryParams: { otherKey: 2 }, queryParamsHandling: \"merge\"\n * });\n * ```\n * In case of a key collision between current parameters and those in the `queryParams` object,\n * the new value is used.\n *\n */\n queryParamsHandling?: QueryParamsHandling | null;\n\n /**\n * When true, preserves the URL fragment for the next navigation\n *\n * ```ts\n * // Preserve fragment from /results#top to /view#top\n * router.navigate(['/view'], { preserveFragment: true });\n * ```\n */\n preserveFragment?: boolean;\n}\n\n/**\n * @description\n *\n * Options that modify the `Router` navigation strategy.\n * Supply an object containing any of these properties to a `Router` navigation function to\n * control how the target URL should be constructed or interpreted.\n *\n * @see {@link Router#navigate}\n * @see {@link Router#navigateByUrl}\n * @see {@link Router#createurltree}\n * @see [Routing and Navigation guide](guide/routing/common-router-tasks)\n * @see {@link UrlCreationOptions}\n * @see {@link NavigationBehaviorOptions}\n *\n * @publicApi\n */\nexport interface NavigationExtras extends UrlCreationOptions, NavigationBehaviorOptions {}\n\nexport type RestoredState = {\n [k: string]: any;\n // TODO(#27607): Remove `navigationId` and `ɵrouterPageId` and move to `ng` or `ɵ` namespace.\n navigationId: number;\n // The `ɵ` prefix is there to reduce the chance of colliding with any existing user properties on\n // the history state.\n ɵrouterPageId?: number;\n};\n\n/**\n * Information about a navigation operation.\n * Retrieve the most recent navigation object with the\n * [Router.currentNavigation() method](api/router/Router#currentNavigation) .\n *\n * * *id* : The unique identifier of the current navigation.\n * * *initialUrl* : The target URL passed into the `Router#navigateByUrl()` call before navigation.\n * This is the value before the router has parsed or applied redirects to it.\n * * *extractedUrl* : The initial target URL after being parsed with `UrlSerializer.extract()`.\n * * *finalUrl* : The extracted URL after redirects have been applied.\n * This URL may not be available immediately, therefore this property can be `undefined`.\n * It is guaranteed to be set after the `RoutesRecognized` event fires.\n * * *trigger* : Identifies how this navigation was triggered.\n * -- 'imperative'--Triggered by `router.navigateByUrl` or `router.navigate`.\n * -- 'popstate'--Triggered by a popstate event.\n * -- 'hashchange'--Triggered by a hashchange event.\n * * *extras* : A `NavigationExtras` options object that controlled the strategy used for this\n * navigation.\n * * *previousNavigation* : The previously successful `Navigation` object. Only one previous\n * navigation is available, therefore this previous `Navigation` object has a `null` value for its\n * own `previousNavigation`.\n *\n * @publicApi\n */\nexport interface Navigation {\n /**\n * The unique identifier of the current navigation.\n */\n id: number;\n /**\n * The target URL passed into the `Router#navigateByUrl()` call before navigation. This is\n * the value before the router has parsed or applied redirects to it.\n */\n initialUrl: UrlTree;\n /**\n * The initial target URL after being parsed with `UrlHandlingStrategy.extract()`.\n */\n extractedUrl: UrlTree;\n /**\n * The extracted URL after redirects have been applied.\n * This URL may not be available immediately, therefore this property can be `undefined`.\n * It is guaranteed to be set after the `RoutesRecognized` event fires.\n */\n finalUrl?: UrlTree;\n /**\n * `UrlTree` to use when updating the browser URL for the navigation when `extras.browserUrl` is\n * defined.\n * @internal\n */\n readonly targetBrowserUrl?: UrlTree | string;\n /**\n * TODO(atscott): If we want to make StateManager public, they will need access to this. Note that\n * it's already eventually exposed through router.routerState.\n * @internal\n */\n targetRouterState?: RouterState;\n /**\n * Identifies how this navigation was triggered.\n */\n trigger: NavigationTrigger;\n /**\n * Options that controlled the strategy used for this navigation.\n * See `NavigationExtras`.\n */\n extras: NavigationExtras;\n /**\n * The previously successful `Navigation` object. Only one previous navigation\n * is available, therefore this previous `Navigation` object has a `null` value\n * for its own `previousNavigation`.\n */\n previousNavigation: Navigation | null;\n\n /**\n * Aborts the navigation if it has not yet been completed or reached the point where routes are being activated.\n * This function is a no-op if the navigation is beyond the point where it can be aborted.\n */\n readonly abort: () => void;\n}\n\nconst noop = () => {};\n\nexport interface NavigationTransition {\n id: number;\n currentUrlTree: UrlTree;\n extractedUrl: UrlTree;\n currentRawUrl: UrlTree;\n urlAfterRedirects?: UrlTree;\n rawUrl: UrlTree;\n extras: NavigationExtras;\n resolve: (value: boolean | PromiseLike<boolean>) => void;\n reject: (reason?: any) => void;\n promise: Promise<boolean>;\n source: NavigationTrigger;\n restoredState: RestoredState | null;\n currentSnapshot: RouterStateSnapshot;\n targetSnapshot: RouterStateSnapshot | null;\n currentRouterState: RouterState;\n targetRouterState: RouterState | null;\n guards: Checks;\n guardsResult: GuardResult | null;\n}\n\nexport const NAVIGATION_ERROR_HANDLER = new InjectionToken<\n (error: NavigationError) => unknown | RedirectCommand\n>(typeof ngDevMode === 'undefined' || ngDevMode ? 'navigation error handler' : '');\n\n@Injectable({providedIn: 'root'})\nexport class NavigationTransitions {\n // Some G3 targets expect the navigation object to be mutated (and not getting a new reference on changes).\n currentNavigation = signal<Navigation | null>(null, {equal: () => false});\n\n currentTransition: NavigationTransition | null = null;\n lastSuccessfulNavigation = signal<Navigation | null>(null);\n /**\n * These events are used to communicate back to the Router about the state of the transition. The\n * Router wants to respond to these events in various ways. Because the `NavigationTransition`\n * class is not public, this event subject is not publicly exposed.\n */\n readonly events = new Subject<Event | BeforeActivateRoutes | RedirectRequest>();\n /**\n * Used to abort the current transition with an error.\n */\n readonly transitionAbortWithErrorSubject = new Subject<Error>();\n private readonly configLoader = inject(RouterConfigLoader);\n private readonly environmentInjector = inject(EnvironmentInjector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly urlSerializer = inject(UrlSerializer);\n private readonly rootContexts = inject(ChildrenOutletContexts);\n private readonly location = inject(Location);\n private readonly inputBindingEnabled = inject(INPUT_BINDER, {optional: true}) !== null;\n private readonly titleStrategy?: TitleStrategy = inject(TitleStrategy);\n private readonly options = inject(ROUTER_CONFIGURATION, {optional: true}) || {};\n private readonly paramsInheritanceStrategy =\n this.options.paramsInheritanceStrategy || 'emptyOnly';\n private readonly urlHandlingStrategy = inject(UrlHandlingStrategy);\n private readonly createViewTransition = inject(CREATE_VIEW_TRANSITION, {optional: true});\n private readonly navigationErrorHandler = inject(NAVIGATION_ERROR_HANDLER, {optional: true});\n\n navigationId = 0;\n get hasRequestedNavigation() {\n return this.navigationId !== 0;\n }\n private transitions?: BehaviorSubject<NavigationTransition | null>;\n /**\n * Hook that enables you to pause navigation after the preactivation phase.\n * Used by `RouterModule`.\n *\n * @internal\n */\n afterPreactivation: () => Observable<void> = () => of(void 0);\n /** @internal */\n rootComponentType: Type<any> | null = null;\n\n private destroyed = false;\n\n constructor() {\n const onLoadStart = (r: Route) => this.events.next(new RouteConfigLoadStart(r));\n const onLoadEnd = (r: Route) => this.events.next(new RouteConfigLoadEnd(r));\n this.configLoader.onLoadEndListener = onLoadEnd;\n this.configLoader.onLoadStartListener = onLoadStart;\n this.destroyRef.onDestroy(() => {\n this.destroyed = true;\n });\n }\n\n complete() {\n this.transitions?.complete();\n }\n\n handleNavigationRequest(\n request: Pick<\n NavigationTransition,\n | 'source'\n | 'restoredState'\n | 'currentUrlTree'\n | 'currentRawUrl'\n | 'rawUrl'\n | 'extras'\n | 'resolve'\n | 'reject'\n | 'promise'\n | 'currentSnapshot'\n | 'currentRouterState'\n >,\n ) {\n const id = ++this.navigationId;\n\n // Navigation can happen as a side effect of template execution, as such we need to untrack signal updates\n // (Writing to signals is not allowed while Angular renders the template)\n // TODO: We might want to reconsider allowing navigation as side effect of template execution.\n untracked(() => {\n this.transitions?.next({\n ...request,\n extractedUrl: this.urlHandlingStrategy.extract(request.rawUrl),\n targetSnapshot: null,\n targetRouterState: null,\n guards: {canActivateChecks: [], canDeactivateChecks: []},\n guardsResult: null,\n id,\n });\n });\n }\n\n setupNavigations(router: Router): Observable<NavigationTransition> {\n this.transitions = new BehaviorSubject<NavigationTransition | null>(null);\n return this.transitions.pipe(\n filter((t): t is NavigationTransition => t !== null),\n\n // Using switchMap so we cancel executing navigations when a new one comes in\n switchMap((overallTransitionState) => {\n let completedOrAborted = false;\n const abortController = new AbortController();\n const shouldContinueNavigation = () => {\n return !completedOrAborted && this.currentTransition?.id === overallTransitionState.id;\n };\n return of(overallTransitionState).pipe(\n switchMap((t) => {\n // It is possible that `switchMap` fails to cancel previous navigations if a new one happens synchronously while the operator\n // is processing the `next` notification of that previous navigation. This can happen when a new navigation (say 2) cancels a\n // previous one (1) and yet another navigation (3) happens synchronously in response to the `NavigationCancel` event for (1).\n // https://github.com/ReactiveX/rxjs/issues/7455\n if (this.navigationId > overallTransitionState.id) {\n const cancellationReason =\n typeof ngDevMode === 'undefined' || ngDevMode\n ? `Navigation ID ${overallTransitionState.id} is not equal to the current navigation id ${this.navigationId}`\n : '';\n this.cancelNavigationTransition(\n overallTransitionState,\n cancellationReason,\n NavigationCancellationCode.SupersededByNewNavigation,\n );\n return EMPTY;\n }\n this.currentTransition = overallTransitionState;\n const lastSuccessfulNavigation = this.lastSuccessfulNavigation();\n // Store the Navigation object\n this.currentNavigation.set({\n id: t.id,\n initialUrl: t.rawUrl,\n extractedUrl: t.extractedUrl,\n targetBrowserUrl:\n typeof t.extras.browserUrl === 'string'\n ? this.urlSerializer.parse(t.extras.browserUrl)\n : t.extras.browserUrl,\n trigger: t.source,\n extras: t.extras,\n previousNavigation: !lastSuccessfulNavigation\n ? null\n : {\n ...lastSuccessfulNavigation,\n previousNavigation: null,\n },\n abort: () => abortController.abort(),\n });\n const urlTransition =\n !router.navigated || this.isUpdatingInternalState() || this.isUpdatedBrowserUrl();\n\n const onSameUrlNavigation = t.extras.onSameUrlNavigation ?? router.onSameUrlNavigation;\n if (!urlTransition && onSameUrlNavigation !== 'reload') {\n const reason =\n typeof ngDevMode === 'undefined' || ngDevMode\n ? `Navigation to ${t.rawUrl} was ignored because it is the same as the current Router URL.`\n : '';\n this.events.next(\n new NavigationSkipped(\n t.id,\n this.urlSerializer.serialize(t.rawUrl),\n reason,\n NavigationSkippedCode.IgnoredSameUrlNavigation,\n ),\n );\n t.resolve(false);\n return EMPTY;\n }\n\n if (this.urlHandlingStrategy.shouldProcessUrl(t.rawUrl)) {\n return of(t).pipe(\n // Fire NavigationStart event\n switchMap((t) => {\n this.events.next(\n new NavigationStart(\n t.id,\n this.urlSerializer.serialize(t.extractedUrl),\n t.source,\n t.restoredState,\n ),\n );\n if (t.id !== this.navigationId) {\n return EMPTY;\n }\n\n // This delay is required to match old behavior that forced\n // navigation to always be async\n return Promise.resolve(t);\n }),\n\n // Recognize\n recognize(\n this.environmentInjector,\n this.configLoader,\n this.rootComponentType,\n router.config,\n this.urlSerializer,\n this.paramsInheritanceStrategy,\n abortController.signal,\n ),\n\n // Update URL if in `eager` update mode\n tap((t) => {\n overallTransitionState.targetSnapshot = t.targetSnapshot;\n overallTransitionState.urlAfterRedirects = t.urlAfterRedirects;\n this.currentNavigation.update((nav) => {\n nav!.finalUrl = t.urlAfterRedirects;\n return nav;\n });\n\n // Fire RoutesRecognized\n const routesRecognized = new RoutesRecognized(\n t.id,\n this.urlSerializer.serialize(t.extractedUrl),\n this.urlSerializer.serialize(t.urlAfterRedirects!),\n t.targetSnapshot!,\n );\n this.events.next(routesRecognized);\n }),\n );\n } else if (\n urlTransition &&\n this.urlHandlingStrategy.shouldProcessUrl(t.currentRawUrl)\n ) {\n /* When the current URL shouldn't be processed, but the previous one\n * was, we handle this \"error condition\" by navigating to the\n * previously successful URL, but leaving the URL intact.*/\n const {id, extractedUrl, source, restoredState, extras} = t;\n const navStart = new NavigationStart(\n id,\n this.urlSerializer.serialize(extractedUrl),\n source,\n restoredState,\n );\n this.events.next(navStart);\n const targetSnapshot = createEmptyState(\n this.rootComponentType,\n this.environmentInjector,\n ).snapshot;\n\n this.currentTransition = overallTransitionState = {\n ...t,\n targetSnapshot,\n urlAfterRedirects: extractedUrl,\n extras: {...extras, skipLocationChange: false, replaceUrl: false},\n };\n this.currentNavigation.update((nav) => {\n nav!.finalUrl = extractedUrl;\n return nav;\n });\n return of(overallTransitionState);\n } else {\n /* When neither the current or previous URL can be processed, do\n * nothing other than update router's internal reference to the\n * current \"settled\" URL. This way the next navigation will be coming\n * from the current URL in the browser.\n */\n const reason =\n typeof ngDevMode === 'undefined' || ngDevMode\n ? `Navigation was ignored because the UrlHandlingStrategy` +\n ` indicated neither the current URL ${t.currentRawUrl} nor target URL ${t.rawUrl} should be processed.`\n : '';\n this.events.next(\n new NavigationSkipped(\n t.id,\n this.urlSerializer.serialize(t.extractedUrl),\n reason,\n NavigationSkippedCode.IgnoredByUrlHandlingStrategy,\n ),\n );\n t.resolve(false);\n return EMPTY;\n }\n }),\n\n map((t) => {\n const guardsStart = new GuardsCheckStart(\n t.id,\n this.urlSerializer.serialize(t.extractedUrl),\n this.urlSerializer.serialize(t.urlAfterRedirects!),\n t.targetSnapshot!,\n );\n this.events.next(guardsStart);\n // Note we don't have to check shouldContinueNavigation here because we don't do anything\n // in the remainder of this operator that has side effects. If `checkGuards` is combined into\n // this operators, we would need to ensure we check shouldContinueNavigation before running the guards.\n\n this.currentTransition = overallTransitionState = {\n ...t,\n guards: getAllRouteGuards(t.targetSnapshot!, t.currentSnapshot, this.rootContexts),\n };\n return overallTransitionState;\n }),\n\n checkGuards((evt: Event) => this.events.next(evt)),\n\n switchMap((t) => {\n overallTransitionState.guardsResult = t.guardsResult;\n if (t.guardsResult && typeof t.guardsResult !== 'boolean') {\n throw redirectingNavigationError(this.urlSerializer, t.guardsResult);\n }\n\n const guardsEnd = new GuardsCheckEnd(\n t.id,\n this.urlSerializer.serialize(t.extractedUrl),\n this.urlSerializer.serialize(t.urlAfterRedirects!),\n t.targetSnapshot!,\n !!t.guardsResult,\n );\n this.events.next(guardsEnd);\n if (!shouldContinueNavigation()) {\n return EMPTY;\n }\n if (!t.guardsResult) {\n this.cancelNavigationTransition(t, '', NavigationCancellationCode.GuardRejected);\n return EMPTY;\n }\n\n if (t.guards.canActivateChecks.length === 0) {\n return of(t);\n }\n\n const resolveStart = new ResolveStart(\n t.id,\n this.urlSerializer.serialize(t.extractedUrl),\n this.urlSerializer.serialize(t.urlAfterRedirects!),\n t.targetSnapshot!,\n );\n this.events.next(resolveStart);\n if (!shouldContinueNavigation()) {\n return EMPTY;\n }\n\n let dataResolved = false;\n return of(t).pipe(\n resolveData(this.paramsInheritanceStrategy),\n tap({\n next: () => {\n dataResolved = true;\n const resolveEnd = new ResolveEnd(\n t.id,\n this.urlSerializer.serialize(t.extractedUrl),\n this.urlSerializer.serialize(t.urlAfterRedirects!),\n t.targetSnapshot!,\n );\n this.events.next(resolveEnd);\n },\n complete: () => {\n if (!dataResolved) {\n this.cancelNavigationTransition(\n t,\n typeof ngDevMode === 'undefined' || ngDevMode\n ? `At least one route resolver didn't emit any value.`\n : '',\n NavigationCancellationCode.NoDataFromResolver,\n );\n }\n },\n }),\n );\n }),\n\n // --- LOAD COMPONENTS ---\n switchTap((t: NavigationTransition) => {\n const loadComponents = (route: ActivatedRouteSnapshot): Array<Promise<void>> => {\n const loaders: Array<Promise<void>> = [];\n if (route.routeConfig?._loadedComponent) {\n route.component = route.routeConfig?._loadedComponent;\n } else if (route.routeConfig?.loadComponent) {\n const injector = route._environmentInjector;\n loaders.push(\n this.configLoader\n .loadComponent(injector, route.routeConfig)\n .then((loadedComponent) => {\n route.component = loadedComponent;\n }),\n );\n }\n for (const child of route.children) {\n loaders.push(...loadComponents(child));\n }\n return loaders;\n };\n const loaders = loadComponents(t.targetSnapshot!.root);\n return loaders.length === 0 ? of(t) : from(Promise.all(loaders).then(() => t));\n }),\n\n switchTap(() => this.afterPreactivation()),\n\n // TODO(atscott): Move this into the last block below.\n switchMap(() => {\n const {currentSnapshot, targetSnapshot} = overallTransitionState;\n const viewTransitionStarted = this.createViewTransition?.(\n this.environmentInjector,\n currentSnapshot.root,\n targetSnapshot!.root,\n );\n\n // If view transitions are enabled, block the navigation until the view\n // transition callback starts. Otherwise, continue immediately.\n return viewTransitionStarted\n ? from(viewTransitionStarted).pipe(map(() => overallTransitionState))\n : of(overallTransitionState);\n }),\n\n // Ensure that if some observable used to drive the transition doesn't\n // complete, the navigation still finalizes This should never happen, but\n // this is done as a safety measure to avoid surfacing this error (#49567).\n take(1),\n\n map((t: NavigationTransition) => {\n const targetRouterState = createRouterState(\n router.routeReuseStrategy,\n t.targetSnapshot!,\n t.currentRouterState,\n );\n this.currentTransition = overallTransitionState = t = {...t, targetRouterState};\n this.currentNavigation.update((nav) => {\n nav!.targetRouterState = targetRouterState;\n return nav;\n });\n\n this.events.next(new BeforeActivateRoutes());\n if (!shouldContinueNavigation()) {\n return;\n }\n\n new ActivateRoutes(\n router.routeReuseStrategy,\n overallTransitionState.targetRouterState!,\n overallTransitionState.currentRouterState,\n (evt: Event) => this.events.next(evt),\n this.inputBindingEnabled,\n ).activate(this.rootContexts);\n\n if (!shouldContinueNavigation()) {\n return;\n }\n\n completedOrAborted = true;\n this.currentNavigation.update((nav) => {\n (nav as Writable<Navigation>).abort = noop;\n return nav;\n });\n this.lastSuccessfulNavigation.set(untracked(this.currentNavigation));\n this.events.next(\n new NavigationEnd(\n t.id,\n this.urlSerializer.serialize(t.extractedUrl),\n this.urlSerializer.serialize(t.urlAfterRedirects!),\n ),\n );\n this.titleStrategy?.updateTitle(t.targetRouterState!.snapshot);\n t.resolve(true);\n }),\n\n takeUntil(\n abortSignalToObservable(abortController.signal).pipe(\n // Ignore aborts if we are already completed, canceled, or are in the activation stage (we have targetRouterState)\n filter(() => !completedOrAborted && !overallTransitionState.targetRouterState),\n tap(() => {\n this.cancelNavigationTransition(\n overallTransitionState,\n abortController.signal.reason + '',\n NavigationCancellationCode.Aborted,\n );\n }),\n ),\n ),\n\n tap({\n complete: () => {\n completedOrAborted = true;\n },\n }),\n\n // There used to be a lot more logic happening directly within the\n // transition Observable. Some of this logic has been refactored out to\n // other places but there may still be errors that happen there. This gives\n // us a way to cancel the transition from the outside. This may also be\n // required in the future to support something like the abort signal of the\n // Navigation API where the navigation gets aborted from outside the\n // transition.\n takeUntil(\n this.transitionAbortWithErrorSubject.pipe(\n tap((err) => {\n throw err;\n }),\n ),\n ),\n\n finalize(() => {\n abortController.abort();\n /* When the navigation stream finishes either through error or success,\n * we set the `completed` or `errored` flag. However, there are some\n * situations where we could get here without either of those being set.\n * For instance, a redirect during NavigationStart. Therefore, this is a\n * catch-all to make sure the NavigationCancel event is fired when a\n * navigation gets cancelled but not caught by other means. */\n if (!completedOrAborted) {\n const cancelationReason =\n typeof ngDevMode === 'undefined' || ngDevMode\n ? `Navigation ID ${overallTransitionState.id} is not equal to the current navigation id ${this.navigationId}`\n : '';\n this.cancelNavigationTransition(\n overallTransitionState,\n cancelationReason,\n NavigationCancellationCode.SupersededByNewNavigation,\n );\n }\n // Only clear current navigation if it is still set to the one that\n // finalized.\n if (this.currentTransition?.id === overallTransitionState.id) {\n this.currentNavigation.set(null);\n this.currentTransition = null;\n }\n }),\n catchError((e) => {\n completedOrAborted = true;\n // If the application is already destroyed, the catch block should not\n // execute anything in practice because other resources have already\n // been released and destroyed.\n if (this.destroyed) {\n overallTransitionState.resolve(false);\n return EMPTY;\n }\n\n /* This error type is issued during Redirect, and is handled as a\n * cancellation rather than an error. */\n if (isNavigationCancelingError(e)) {\n this.events.next(\n new NavigationCancel(\n overallTransitionState.id,\n this.urlSerializer.serialize(overallTransitionState.extractedUrl),\n e.message,\n e.cancellationCode,\n ),\n );\n\n // When redirecting, we need to delay resolving the navigation\n // promise and push it to the redirect navigation\n if (!isRedirectingNavigationCancelingError(e)) {\n overallTransitionState.resolve(false);\n } else {\n this.events.next(new RedirectRequest(e.url, e.navigationBehaviorOptions));\n }\n\n /* All other errors should reset to the router's internal URL reference\n * to the pre-error state. */\n } else {\n const navigationError = new NavigationError(\n overallTransitionState.id,\n this.urlSerializer.serialize(overallTransitionState.extractedUrl),\n e,\n overallTransitionState.targetSnapshot ?? undefined,\n );\n\n try {\n const navigationErrorHandlerResult = runInInjectionContext(\n this.environmentInjector,\n () => this.navigationErrorHandler?.(navigationError),\n );\n\n if (navigationErrorHandlerResult instanceof RedirectCommand) {\n const {message, cancellationCode} = redirectingNavigationError(\n this.urlSerializer,\n navigationErrorHandlerResult,\n );\n this.events.next(\n new NavigationCancel(\n overallTransitionState.id,\n this.urlSerializer.serialize(overallTransitionState.extractedUrl),\n message,\n cancellationCode,\n ),\n );\n this.events.next(\n new RedirectRequest(\n navigationErrorHandlerResult.redirectTo,\n navigationErrorHandlerResult.navigationBehaviorOptions,\n ),\n );\n } else {\n this.events.next(navigationError);\n throw e;\n }\n } catch (ee) {\n // TODO(atscott): consider flipping the default behavior of\n // resolveNavigationPromiseOnError to be `resolve(false)` when\n // undefined. This is the most sane thing to do given that\n // applications very rarely handle the promise rejection and, as a\n // result, would get \"unhandled promise rejection\" console logs.\n // The vast majority of applications would not be affected by this\n // change so omitting a migration seems reasonable. Instead,\n // applications that rely on rejection can specifically opt-in to the\n // old behavior.\n if (this.options.resolveNavigationPromiseOnError) {\n overallTransitionState.resolve(false);\n } else {\n overallTransitionState.reject(ee);\n }\n }\n }\n\n return EMPTY;\n }),\n );\n // casting because `pipe` returns observable({}) when called with 8+ arguments\n }),\n ) as Observable<NavigationTransition>;\n }\n\n private cancelNavigationTransition(\n t: NavigationTransition,\n reason: string,\n code: NavigationCancellationCode,\n ) {\n const navCancel = new NavigationCancel(\n t.id,\n this.urlSerializer.serialize(t.extractedUrl),\n reason,\n code,\n );\n this.events.next(navCancel);\n t.resolve(false);\n }\n\n /**\n * @returns Whether we're navigating to somewhere that is not what the Router is\n * currently set to.\n */\n private isUpdatingInternalState() {\n // TODO(atscott): The serializer should likely be used instead of\n // `UrlTree.toString()`. Custom serializers are often written to handle\n // things better than the default one (objects, for example will be\n // [Object object] with the custom serializer and be \"the same\" when they\n // aren't).\n // (Same for isUpdatedBrowserUrl)\n return (\n this.currentTransition?.extractedUrl.toString() !==\n this.currentTransition?.currentUrlTree.toString()\n );\n }\n\n /**\n * @returns Whether we're updating the browser URL to something new (navigation is going\n * to somewhere not displayed in the URL bar and we will update the URL\n * bar if navigation succeeds).\n */\n private isUpdatedBrowserUrl() {\n // The extracted URL is the part of the URL that this application cares about. `extract` may\n // return only part of the browser URL and that part may have not changed even if some other\n // portion of the URL did.\n const currentBrowserUrl = this.urlHandlingStrategy.extract(\n this.urlSerializer.parse(this.location.path(true)),\n );\n\n const currentNavigation = untracked(this.currentNavigation);\n const targetBrowserUrl = currentNavigation?.targetBrowserUrl ?? currentNavigation?.extractedUrl;\n return (\n currentBrowserUrl.toString() !== targetBrowserUrl?.toString() &&\n !currentNavigation?.extras.skipLocationChange\n );\n }\n}\n\nexport function isBrowserTriggeredNavigation(source: NavigationTrigger) {\n return source !== IMPERATIVE_NAVIGATION;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '@angular/core';\n\nimport {Route, Routes} from './models';\nimport {\n DetachedRouteHandleInternal,\n ExperimentalRouteReuseStrategy,\n RouteReuseStrategy,\n} from './route_reuse_strategy';\nimport {ActivatedRouteSnapshot, RouterState} from './router_state';\n\n/**\n * @description\n *\n * Cleans up `EnvironmentInjector`s assigned to `Route`s that are no longer in use.\n */\nexport const ROUTE_INJECTOR_CLEANUP = new InjectionToken<typeof routeInjectorCleanup>(\n typeof ngDevMode === 'undefined' || ngDevMode ? 'RouteInjectorCleanup' : '',\n);\n\nexport function routeInjectorCleanup(\n routeReuseStrategy: RouteReuseStrategy,\n routerState: RouterState,\n config: Routes,\n) {\n const activeRoutes = new Set<Route>();\n // Collect all active routes from the current state tree\n if (routerState.snapshot.root) {\n collectDescendants(routerState.snapshot.root, activeRoutes);\n }\n\n // For stored routes, collect them and all their parents by iterating pathFromRoot.\n const storedHandles =\n (routeReuseStrategy as ExperimentalRouteReuseStrategy).retrieveStoredRouteHandles?.() || [];\n for (const handle of storedHandles) {\n const internalHandle = handle as DetachedRouteHandleInternal;\n if (internalHandle?.route?.value?.snapshot) {\n for (const snapshot of internalHandle.route.value.snapshot.pathFromRoot) {\n if (snapshot.routeConfig) {\n activeRoutes.add(snapshot.routeConfig);\n }\n }\n }\n }\n\n destroyUnusedInjectors(config, activeRoutes, routeReuseStrategy, false);\n}\n\nfunction collectDescendants(snapshot: ActivatedRouteSnapshot, activeRoutes: Set<Route>) {\n if (snapshot.routeConfig) {\n activeRoutes.add(snapshot.routeConfig);\n }\n\n for (const child of snapshot.children) {\n collectDescendants(child, activeRoutes);\n }\n}\n\nfunction destroyUnusedInjectors(\n routes: Routes,\n activeRoutes: Set<Route>,\n strategy: RouteReuseStrategy,\n inheritedForceDestroy: boolean,\n) {\n for (const route of routes) {\n const shouldDestroyCurrentRoute =\n inheritedForceDestroy ||\n !!(\n (route._injector || route._loadedInjector) &&\n !activeRoutes.has(route) &&\n ((strategy as ExperimentalRouteReuseStrategy).shouldDestroyInjector?.(route) ?? false)\n );\n\n if (route.children) {\n destroyUnusedInjectors(route.children, activeRoutes, strategy, shouldDestroyCurrentRoute);\n }\n if (route.loadChildren && route._loadedRoutes) {\n destroyUnusedInjectors(\n route._loadedRoutes,\n activeRoutes,\n strategy,\n shouldDestroyCurrentRoute,\n );\n }\n\n if (shouldDestroyCurrentRoute) {\n if (route._injector) {\n route._injector.destroy();\n route._injector = undefined;\n }\n if (route._loadedInjector) {\n route._loadedInjector.destroy();\n route._loadedInjector = undefined;\n }\n }\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ComponentRef, inject, Injectable} from '@angular/core';\n\nimport {OutletContext} from './router_outlet_context';\nimport {ActivatedRoute, ActivatedRouteSnapshot} from './router_state';\nimport {Route} from './models';\nimport {TreeNode} from './utils/tree';\n\n/**\n * @description\n *\n * Represents the detached route tree.\n *\n * This is an opaque value the router will give to a custom route reuse strategy\n * to store and retrieve later on.\n *\n * @publicApi\n */\nexport type DetachedRouteHandle = {};\n\n/** @internal */\nexport type DetachedRouteHandleInternal = {\n contexts: Map<string, OutletContext>;\n componentRef: ComponentRef<any>;\n route: TreeNode<ActivatedRoute>;\n};\n\n/**\n * @description\n *\n * Destroys the component associated with a `DetachedRouteHandle`.\n *\n * This function should be used when a `RouteReuseStrategy` decides to drop a stored handle\n * and wants to ensure that the component is destroyed.\n *\n * @param handle The detached route handle to destroy.\n *\n * @publicApi\n * @see [Manually destroying detached route handles](guide/routing/customizing-route-behavior#manually-destroying-detached-route-handles)\n */\nexport function destroyDetachedRouteHandle(handle: DetachedRouteHandle): void {\n const internalHandle = handle as DetachedRouteHandleInternal;\n if (internalHandle && internalHandle.componentRef) {\n internalHandle.componentRef.destroy();\n }\n}\n\nexport interface ExperimentalRouteReuseStrategy {\n shouldDestroyInjector?(route: Route): boolean;\n retrieveStoredRouteHandles?(): Array<DetachedRouteHandleInternal>;\n}\n\n/**\n * @description\n *\n * Provides a way to customize when activated routes get reused.\n *\n * @publicApi\n */\n@Injectable({providedIn: 'root', useFactory: () => inject(DefaultRouteReuseStrategy)})\nexport abstract class RouteReuseStrategy {\n /** Determines if this route (and its subtree) should be detached to be reused later */\n abstract shouldDetach(route: ActivatedRouteSnapshot): boolean;\n\n /**\n * Stores the detached route.\n *\n * Storing a `null` value should erase the previously stored value.\n */\n abstract store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle | null): void;\n\n /** Determines if this route (and its subtree) should be reattached */\n abstract shouldAttach(route: ActivatedRouteSnapshot): boolean;\n\n /** Retrieves the previously stored route */\n abstract retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null;\n\n /** Determines if a route should be reused */\n abstract shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean;\n}\n\n/**\n * @description\n *\n * This base route reuse strategy only reuses routes when the matched router configs are\n * identical. This prevents components from being destroyed and recreated\n * when just the route parameters, query parameters or fragment change\n * (that is, the existing component is _reused_).\n *\n * This strategy does not store any routes for later reuse.\n *\n * Angular uses this strategy by default.\n *\n *\n * It can be used as a base class for custom route reuse strategies, i.e. you can create your own\n * class that extends the `BaseRouteReuseStrategy` one.\n * @publicApi\n */\nexport abstract class BaseRouteReuseStrategy implements RouteReuseStrategy {\n /**\n * Whether the given route should detach for later reuse.\n * Always returns false for `BaseRouteReuseStrategy`.\n * */\n shouldDetach(route: ActivatedRouteSnapshot): boolean {\n return false;\n }\n\n /**\n * A no-op; the route is never stored since this strategy never detaches routes for later re-use.\n */\n store(route: ActivatedRouteSnapshot, detachedTree: DetachedRouteHandle): void {}\n\n /** Returns `false`, meaning the route (and its subtree) is never reattached */\n shouldAttach(route: ActivatedRouteSnapshot): boolean {\n return false;\n }\n\n /** Returns `null` because this strategy does not store routes for later re-use. */\n retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null {\n return null;\n }\n\n /**\n * Determines if a route should be reused.\n * This strategy returns `true` when the future route config and current route config are\n * identical.\n */\n shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {\n return future.routeConfig === curr.routeConfig;\n }\n\n /**\n * Determines if the injector for the given route should be destroyed.\n *\n * This method is called by the router when the `RouteReuseStrategy` is destroyed.\n * If this method returns `true`, the router will destroy the injector for the given route.\n *\n * @see {@link withExperimentalAutoCleanupInjectors}\n * @xperimental 21.1\n */\n shouldDestroyInjector(route: Route): boolean {\n return true;\n }\n}\n\n@Injectable({providedIn: 'root'})\nexport class DefaultRouteReuseStrategy extends BaseRouteReuseStrategy {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Location} from '@angular/common';\nimport {EnvironmentInjector, inject, Injectable} from '@angular/core';\nimport {SubscriptionLike} from 'rxjs';\n\nimport {\n BeforeActivateRoutes,\n Event,\n isRedirectingEvent,\n NavigationCancel,\n NavigationEnd,\n NavigationError,\n NavigationSkipped,\n NavigationStart,\n NavigationTrigger,\n PrivateRouterEvents,\n RoutesRecognized,\n} from '../events';\nimport {Navigation, RestoredState} from '../navigation_transition';\nimport {ROUTER_CONFIGURATION} from '../router_config';\nimport {createEmptyState, RouterState} from '../router_state';\nimport {UrlHandlingStrategy} from '../url_handling_strategy';\nimport {UrlSerializer, UrlTree} from '../url_tree';\n\n@Injectable({providedIn: 'root', useFactory: () => inject(HistoryStateManager)})\nexport abstract class StateManager {\n protected readonly urlSerializer = inject(UrlSerializer);\n private readonly options = inject(ROUTER_CONFIGURATION, {optional: true}) || {};\n protected readonly canceledNavigationResolution =\n this.options.canceledNavigationResolution || 'replace';\n protected location = inject(Location);\n protected urlHandlingStrategy = inject(UrlHandlingStrategy);\n protected urlUpdateStrategy = this.options.urlUpdateStrategy || 'deferred';\n\n protected currentUrlTree = new UrlTree();\n /**\n * Returns the currently activated `UrlTree`.\n *\n * This `UrlTree` shows only URLs that the `Router` is configured to handle (through\n * `UrlHandlingStrategy`).\n *\n * The value is set after finding the route config tree to activate but before activating the\n * route.\n */\n getCurrentUrlTree(): UrlTree {\n return this.currentUrlTree;\n }\n\n protected rawUrlTree = this.currentUrlTree;\n /**\n * Returns a `UrlTree` that is represents what the browser is actually showing.\n *\n * In the life of a navigation transition:\n * 1. When a navigation begins, the raw `UrlTree` is updated to the full URL that's being\n * navigated to.\n * 2. During a navigation, redirects are applied, which might only apply to _part_ of the URL (due\n * to `UrlHandlingStrategy`).\n * 3. Just before activation, the raw `UrlTree` is updated to include the redirects on top of the\n * original raw URL.\n *\n * Note that this is _only_ here to support `UrlHandlingStrategy.extract` and\n * `UrlHandlingStrategy.shouldProcessUrl`. Without those APIs, the current `UrlTree` would not\n * deviated from the raw `UrlTree`.\n *\n * For `extract`, a raw `UrlTree` is needed because `extract` may only return part\n * of the navigation URL. Thus, the current `UrlTree` may only represent _part_ of the browser\n * URL. When a navigation gets cancelled and the router needs to reset the URL or a new navigation\n * occurs, it needs to know the _whole_ browser URL, not just the part handled by\n * `UrlHandlingStrategy`.\n * For `shouldProcessUrl`, when the return is `false`, the router ignores the navigation but\n * still updates the raw `UrlTree` with the assumption that the navigation was caused by the\n * location change listener due to a URL update by the AngularJS router. In this case, the router\n * still need to know what the browser's URL is for future navigations.\n */\n getRawUrlTree(): UrlTree {\n return this.rawUrlTree;\n }\n\n protected createBrowserPath({finalUrl, initialUrl, targetBrowserUrl}: Navigation): string {\n const rawUrl =\n finalUrl !== undefined ? this.urlHandlingStrategy.merge(finalUrl!, initialUrl) : initialUrl;\n const url = targetBrowserUrl ?? rawUrl;\n const path = url instanceof UrlTree ? this.urlSerializer.serialize(url) : url;\n return path;\n }\n\n protected commitTransition({targetRouterState, finalUrl, initialUrl}: Navigation): void {\n // If we are committing the transition after having a final URL and target state, we're updating\n // all pieces of the state. Otherwise, we likely skipped the transition (due to URL handling strategy)\n // and only want to update the rawUrlTree, which represents the browser URL (and doesn't necessarily match router state).\n if (finalUrl && targetRouterState) {\n this.currentUrlTree = finalUrl;\n this.rawUrlTree = this.urlHandlingStrategy.merge(finalUrl, initialUrl);\n this.routerState = targetRouterState;\n } else {\n this.rawUrlTree = initialUrl;\n }\n }\n\n protected routerState = createEmptyState(null, inject(EnvironmentInjector));\n\n /** Returns the current RouterState. */\n getRouterState(): RouterState {\n return this.routerState;\n }\n\n private _stateMemento = this.createStateMemento();\n get stateMemento() {\n return this._stateMemento;\n }\n\n protected updateStateMemento(): void {\n this._stateMemento = this.createStateMemento();\n }\n\n private createStateMemento() {\n return {\n rawUrlTree: this.rawUrlTree,\n currentUrlTree: this.currentUrlTree,\n routerState: this.routerState,\n };\n }\n\n /** Returns the current state stored by the browser for the current history entry. */\n restoredState(): RestoredState | null | undefined {\n return this.location.getState() as RestoredState | null | undefined;\n }\n\n /**\n * Registers a listener that is called whenever the current history entry changes by some API\n * outside the Router. This includes user-activated changes like back buttons and link clicks, but\n * also includes programmatic APIs called by non-Router JavaScript.\n */\n abstract registerNonRouterCurrentEntryChangeListener(\n listener: (\n url: string,\n state: RestoredState | null | undefined,\n trigger: NavigationTrigger,\n ) => void,\n ): SubscriptionLike;\n\n /**\n * Handles a navigation event sent from the Router. These are typically events that indicate a\n * navigation has started, progressed, been cancelled, or finished.\n */\n abstract handleRouterEvent(e: Event | PrivateRouterEvents, currentTransition: Navigation): void;\n}\n\n@Injectable({providedIn: 'root'})\nexport class HistoryStateManager extends StateManager {\n /**\n * The id of the currently active page in the router.\n * Updated to the transition's target id on a successful navigation.\n *\n * This is used to track what page the router last activated. When an attempted navigation fails,\n * the router can then use this to compute how to restore the state back to the previously active\n * page.\n */\n private currentPageId: number = 0;\n private lastSuccessfulId: number = -1;\n\n /**\n * The ɵrouterPageId of whatever page is currently active in the browser history. This is\n * important for computing the target page id for new navigations because we need to ensure each\n * page id in the browser history is 1 more than the previous entry.\n */\n private get browserPageId(): number {\n if (this.canceledNavigationResolution !== 'computed') {\n return this.currentPageId;\n }\n return this.restoredState()?.ɵrouterPageId ?? this.currentPageId;\n }\n\n override registerNonRouterCurrentEntryChangeListener(\n listener: (\n url: string,\n state: RestoredState | null | undefined,\n trigger: NavigationTrigger,\n ) => void,\n ): SubscriptionLike {\n return this.location.subscribe((event) => {\n if (event['type'] === 'popstate') {\n // The `setTimeout` was added in #12160 and is likely to support Angular/AngularJS\n // hybrid apps.\n setTimeout(() => {\n listener(event['url']!, event.state as RestoredState | null | undefined, 'popstate');\n });\n }\n });\n }\n\n override handleRouterEvent(e: Event | PrivateRouterEvents, currentTransition: Navigation): void {\n if (e instanceof NavigationStart) {\n this.updateStateMemento();\n } else if (e instanceof NavigationSkipped) {\n this.commitTransition(currentTransition);\n } else if (e instanceof RoutesRecognized) {\n if (this.urlUpdateStrategy === 'eager') {\n if (!currentTransition.extras.skipLocationChange) {\n this.setBrowserUrl(this.createBrowserPath(currentTransition), currentTransition);\n }\n }\n } else if (e instanceof BeforeActivateRoutes) {\n this.commitTransition(currentTransition);\n if (this.urlUpdateStrategy === 'deferred' && !currentTransition.extras.skipLocationChange) {\n this.setBrowserUrl(this.createBrowserPath(currentTransition), currentTransition);\n }\n } else if (e instanceof NavigationCancel && !isRedirectingEvent(e)) {\n this.restoreHistory(currentTransition);\n } else if (e instanceof NavigationError) {\n this.restoreHistory(currentTransition, true);\n } else if (e instanceof NavigationEnd) {\n this.lastSuccessfulId = e.id;\n this.currentPageId = this.browserPageId;\n }\n }\n\n private setBrowserUrl(path: string, {extras, id}: Navigation) {\n const {replaceUrl, state} = extras;\n if (this.location.isCurrentPathEqualTo(path) || !!replaceUrl) {\n // replacements do not update the target page\n const currentBrowserPageId = this.browserPageId;\n const newState = {\n ...state,\n ...this.generateNgRouterState(id, currentBrowserPageId),\n };\n this.location.replaceState(path, '', newState);\n } else {\n const newState = {\n ...state,\n ...this.generateNgRouterState(id, this.browserPageId + 1),\n };\n this.location.go(path, '', newState);\n }\n }\n\n /**\n * Performs the necessary rollback action to restore the browser URL to the\n * state before the transition.\n */\n private restoreHistory(navigation: Navigation, restoringFromCaughtError = false) {\n if (this.canceledNavigationResolution === 'computed') {\n const currentBrowserPageId = this.browserPageId;\n const targetPagePosition = this.currentPageId - currentBrowserPageId;\n if (targetPagePosition !== 0) {\n this.location.historyGo(targetPagePosition);\n } else if (this.getCurrentUrlTree() === navigation.finalUrl && targetPagePosition === 0) {\n // We got to the activation stage (where currentUrlTree is set to the navigation's\n // finalUrl), but we weren't moving anywhere in history (skipLocationChange or replaceUrl).\n // We still need to reset the router state back to what it was when the navigation started.\n this.resetInternalState(navigation);\n this.resetUrlToCurrentUrlTree();\n } else {\n // The browser URL and router state was not updated before the navigation cancelled so\n // there's no restoration needed.\n }\n } else if (this.canceledNavigationResolution === 'replace') {\n // TODO(atscott): It seems like we should _always_ reset the state here. It would be a no-op\n // for `deferred` navigations that haven't change the internal state yet because guards\n // reject. For 'eager' navigations, it seems like we also really should reset the state\n // because the navigation was cancelled. Investigate if this can be done by running TGP.\n if (restoringFromCaughtError) {\n this.resetInternalState(navigation);\n }\n this.resetUrlToCurrentUrlTree();\n }\n }\n\n private resetInternalState({finalUrl}: Navigation): void {\n this.routerState = this.stateMemento.routerState;\n this.currentUrlTree = this.stateMemento.currentUrlTree;\n // Note here that we use the urlHandlingStrategy to get the reset `rawUrlTree` because it may be\n // configured to handle only part of the navigation URL. This means we would only want to reset\n // the part of the navigation handled by the Angular router rather than the whole URL. In\n // addition, the URLHandlingStrategy may be configured to specifically preserve parts of the URL\n // when merging, such as the query params so they are not lost on a refresh.\n this.rawUrlTree = this.urlHandlingStrategy.merge(\n this.currentUrlTree,\n finalUrl ?? this.rawUrlTree,\n );\n }\n\n private resetUrlToCurrentUrlTree(): void {\n this.location.replaceState(\n this.urlSerializer.serialize(this.getRawUrlTree()),\n '',\n this.generateNgRouterState(this.lastSuccessfulId, this.currentPageId),\n );\n }\n\n private generateNgRouterState(navigationId: number, routerPageId: number) {\n if (this.canceledNavigationResolution === 'computed') {\n return {navigationId, ɵrouterPageId: routerPageId};\n }\n return {navigationId};\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Observable} from 'rxjs';\nimport {filter, map, take} from 'rxjs/operators';\n\nimport {\n Event,\n NavigationCancel,\n NavigationCancellationCode,\n NavigationEnd,\n NavigationError,\n NavigationSkipped,\n} from '../events';\n\nconst enum NavigationResult {\n COMPLETE,\n FAILED,\n REDIRECTING,\n}\n\n/**\n * Performs the given action once the router finishes its next/current navigation.\n *\n * The navigation is considered complete under the following conditions:\n * - `NavigationCancel` event emits and the code is not `NavigationCancellationCode.Redirect` or\n * `NavigationCancellationCode.SupersededByNewNavigation`. In these cases, the\n * redirecting/superseding navigation must finish.\n * - `NavigationError`, `NavigationEnd`, or `NavigationSkipped` event emits\n */\nexport function afterNextNavigation(router: {events: Observable<Event>}, action: () => void): void {\n router.events\n .pipe(\n filter(\n (e): e is NavigationEnd | NavigationCancel | NavigationError | NavigationSkipped =>\n e instanceof NavigationEnd ||\n e instanceof NavigationCancel ||\n e instanceof NavigationError ||\n e instanceof NavigationSkipped,\n ),\n map((e) => {\n if (e instanceof NavigationEnd || e instanceof NavigationSkipped) {\n return NavigationResult.COMPLETE;\n }\n const redirecting =\n e instanceof NavigationCancel\n ? e.code === NavigationCancellationCode.Redirect ||\n e.code === NavigationCancellationCode.SupersededByNewNavigation\n : false;\n return redirecting ? NavigationResult.REDIRECTING : NavigationResult.FAILED;\n }),\n filter(\n (result): result is NavigationResult.COMPLETE | NavigationResult.FAILED =>\n result !== NavigationResult.REDIRECTING,\n ),\n take(1),\n )\n .subscribe(() => {\n action();\n });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Location} from '@angular/common';\nimport {\n ɵConsole as Console,\n EnvironmentInjector,\n inject,\n Injectable,\n ɵPendingTasksInternal as PendingTasks,\n ɵRuntimeError as RuntimeError,\n Signal,\n Type,\n untracked,\n ɵINTERNAL_APPLICATION_ERROR_HANDLER,\n ɵformatRuntimeError as formatRuntimeError,\n} from '@angular/core';\nimport {Observable, Subject, Subscription, SubscriptionLike} from 'rxjs';\n\nimport {standardizeConfig} from './components/empty_outlet';\nimport {createSegmentGroupFromRoute, createUrlTreeFromSegmentGroup} from './create_url_tree';\nimport {INPUT_BINDER} from './directives/router_outlet';\nimport {RuntimeErrorCode} from './errors';\n\nimport {\n Event,\n IMPERATIVE_NAVIGATION,\n isPublicRouterEvent,\n NavigationCancel,\n NavigationCancellationCode,\n NavigationEnd,\n NavigationError,\n NavigationTrigger,\n RedirectRequest,\n} from './events';\n\nimport {NavigationBehaviorOptions, OnSameUrlNavigation, Routes} from './models';\nimport {\n isBrowserTriggeredNavigation,\n Navigation,\n NavigationExtras,\n NavigationTransitions,\n RestoredState,\n UrlCreationOptions,\n} from './navigation_transition';\nimport {ROUTE_INJECTOR_CLEANUP} from './route_injector_cleanup';\n\nimport {RouteReuseStrategy} from './route_reuse_strategy';\n\nimport {ROUTER_CONFIGURATION} from './router_config';\nimport {ROUTES} from './router_config_loader';\nimport {Params} from './shared';\nimport {StateManager} from './statemanager/state_manager';\nimport {UrlHandlingStrategy} from './url_handling_strategy';\nimport {\n containsTree,\n IsActiveMatchOptions,\n isUrlTree,\n UrlSegmentGroup,\n UrlSerializer,\n UrlTree,\n} from './url_tree';\nimport {validateConfig} from './utils/config';\nimport {afterNextNavigation} from './utils/navigations';\nimport {RouterState} from './router_state';\n\n/**\n * The equivalent `IsActiveMatchOptions` options for `isActive` is called with `true`\n * (exact = true).\n */\nexport const exactMatchOptions: IsActiveMatchOptions = {\n paths: 'exact',\n fragment: 'ignored',\n matrixParams: 'ignored',\n queryParams: 'exact',\n};\n\n/**\n * The equivalent `IsActiveMatchOptions` options for `isActive` is called with `false`\n * (exact = false).\n */\nexport const subsetMatchOptions: IsActiveMatchOptions = {\n paths: 'subset',\n fragment: 'ignored',\n matrixParams: 'ignored',\n queryParams: 'subset',\n};\n\n/**\n * @description\n *\n * A service that facilitates navigation among views and URL manipulation capabilities.\n * This service is provided in the root scope and configured with [provideRouter](api/router/provideRouter).\n *\n * @see {@link Route}\n * @see {@link provideRouter}\n * @see [Routing and Navigation Guide](guide/routing/common-router-tasks).\n *\n * @ngModule RouterModule\n *\n * @publicApi\n */\n@Injectable({providedIn: 'root'})\nexport class Router {\n private get currentUrlTree() {\n return this.stateManager.getCurrentUrlTree();\n }\n private get rawUrlTree() {\n return this.stateManager.getRawUrlTree();\n }\n private disposed = false;\n private nonRouterCurrentEntryChangeSubscription?: SubscriptionLike;\n\n private readonly console = inject(Console);\n private readonly stateManager = inject(StateManager);\n private readonly options = inject(ROUTER_CONFIGURATION, {optional: true}) || {};\n private readonly pendingTasks = inject(PendingTasks);\n private readonly urlUpdateStrategy = this.options.urlUpdateStrategy || 'deferred';\n private readonly navigationTransitions = inject(NavigationTransitions);\n private readonly urlSerializer = inject(UrlSerializer);\n private readonly location = inject(Location);\n private readonly urlHandlingStrategy = inject(UrlHandlingStrategy);\n private readonly injector = inject(EnvironmentInjector);\n\n /**\n * The private `Subject` type for the public events exposed in the getter. This is used internally\n * to push events to. The separate field allows us to expose separate types in the public API\n * (i.e., an Observable rather than the Subject).\n */\n private _events = new Subject<Event>();\n /**\n * An event stream for routing events.\n */\n public get events(): Observable<Event> {\n // TODO(atscott): This _should_ be events.asObservable(). However, this change requires internal\n // cleanup: tests are doing `(route.events as Subject<Event>).next(...)`. This isn't\n // allowed/supported but we still have to fix these or file bugs against the teams before making\n // the change.\n return this._events;\n }\n /**\n * The current state of routing in this NgModule.\n */\n get routerState(): RouterState {\n return this.stateManager.getRouterState();\n }\n\n /**\n * True if at least one navigation event has occurred,\n * false otherwise.\n */\n navigated: boolean = false;\n\n /**\n * A strategy for re-using routes.\n *\n * @deprecated Configure using `providers` instead:\n * `{provide: RouteReuseStrategy, useClass: MyStrategy}`.\n */\n routeReuseStrategy: RouteReuseStrategy = inject(RouteReuseStrategy);\n\n /** @internal */\n readonly injectorCleanup = inject(ROUTE_INJECTOR_CLEANUP, {optional: true});\n\n // TODO: Consider exposing releaseUnusedRouteInjectors as a public API\n\n /**\n * How to handle a navigation request to the current URL.\n *\n *\n * @deprecated Configure this through `provideRouter` or `RouterModule.forRoot` instead.\n * @see {@link withRouterConfig}\n * @see {@link provideRouter}\n * @see {@link RouterModule}\n */\n onSameUrlNavigation: OnSameUrlNavigation = this.options.onSameUrlNavigation || 'ignore';\n\n config: Routes = inject(ROUTES, {optional: true})?.flat() ?? [];\n\n /**\n * Indicates whether the application has opted in to binding Router data to component inputs.\n *\n * This option is enabled by the `withComponentInputBinding` feature of `provideRouter` or\n * `bindToComponentInputs` in the `ExtraOptions` of `RouterModule.forRoot`.\n */\n readonly componentInputBindingEnabled: boolean = !!inject(INPUT_BINDER, {optional: true});\n\n /**\n * Signal of the current `Navigation` object when the router is navigating, and `null` when idle.\n *\n * Note: The current navigation becomes to null after the NavigationEnd event is emitted.\n */\n readonly currentNavigation = this.navigationTransitions.currentNavigation.asReadonly();\n\n constructor() {\n this.resetConfig(this.config);\n\n this.navigationTransitions.setupNavigations(this).subscribe({\n error: (e) => {\n // Note: This subscription is not unsubscribed when the `Router` is destroyed.\n // This is intentional as the `Router` is generally never destroyed.\n // If it is destroyed, the `events` subject is completed, which cleans up this subscription.\n },\n });\n this.subscribeToNavigationEvents();\n }\n\n private eventsSubscription = new Subscription();\n private subscribeToNavigationEvents() {\n const subscription = this.navigationTransitions.events.subscribe((e) => {\n try {\n const currentTransition = this.navigationTransitions.currentTransition;\n const currentNavigation = untracked(this.navigationTransitions.currentNavigation);\n\n if (currentTransition !== null && currentNavigation !== null) {\n this.stateManager.handleRouterEvent(e, currentNavigation);\n if (\n e instanceof NavigationCancel &&\n e.code !== NavigationCancellationCode.Redirect &&\n e.code !== NavigationCancellationCode.SupersededByNewNavigation\n ) {\n // It seems weird that `navigated` is set to `true` when the navigation is rejected,\n // however it's how things were written initially. Investigation would need to be done\n // to determine if this can be removed.\n this.navigated = true;\n } else if (e instanceof NavigationEnd) {\n this.navigated = true;\n this.injectorCleanup?.(this.routeReuseStrategy, this.routerState, this.config);\n } else if (e instanceof RedirectRequest) {\n const opts = e.navigationBehaviorOptions;\n const mergedTree = this.urlHandlingStrategy.merge(\n e.url,\n currentTransition.currentRawUrl,\n );\n const extras = {\n scroll: currentTransition.extras.scroll,\n browserUrl: currentTransition.extras.browserUrl,\n info: currentTransition.extras.info,\n skipLocationChange: currentTransition.extras.skipLocationChange,\n // The URL is already updated at this point if we have 'eager' URL\n // updates or if the navigation was triggered by the browser (back\n // button, URL bar, etc). We want to replace that item in history\n // if the navigation is rejected.\n replaceUrl:\n currentTransition.extras.replaceUrl ||\n this.urlUpdateStrategy === 'eager' ||\n isBrowserTriggeredNavigation(currentTransition.source),\n // allow developer to override default options with RedirectCommand\n ...opts,\n };\n\n this.scheduleNavigation(mergedTree, IMPERATIVE_NAVIGATION, null, extras, {\n resolve: currentTransition.resolve,\n reject: currentTransition.reject,\n promise: currentTransition.promise,\n });\n }\n }\n\n // Note that it's important to have the Router process the events _before_ the event is\n // pushed through the public observable. This ensures the correct router state is in place\n // before applications observe the events.\n if (isPublicRouterEvent(e)) {\n this._events.next(e);\n }\n } catch (e: unknown) {\n this.navigationTransitions.transitionAbortWithErrorSubject.next(e as Error);\n }\n });\n this.eventsSubscription.add(subscription);\n }\n\n /** @internal */\n resetRootComponentType(rootComponentType: Type<any>): void {\n // TODO: vsavkin router 4.0 should make the root component set to null\n // this will simplify the lifecycle of the router.\n this.routerState.root.component = rootComponentType;\n this.navigationTransitions.rootComponentType = rootComponentType;\n }\n\n /**\n * Sets up the location change listener and performs the initial navigation.\n */\n initialNavigation(): void {\n this.setUpLocationChangeListener();\n if (!this.navigationTransitions.hasRequestedNavigation) {\n this.navigateToSyncWithBrowser(\n this.location.path(true),\n IMPERATIVE_NAVIGATION,\n this.stateManager.restoredState(),\n );\n }\n }\n\n /**\n * Sets up the location change listener. This listener detects navigations triggered from outside\n * the Router (the browser back/forward buttons, for example) and schedules a corresponding Router\n * navigation so that the correct events, guards, etc. are triggered.\n */\n setUpLocationChangeListener(): void {\n // Don't need to use Zone.wrap any more, because zone.js\n // already patch onPopState, so location change callback will\n // run into ngZone\n this.nonRouterCurrentEntryChangeSubscription ??=\n this.stateManager.registerNonRouterCurrentEntryChangeListener((url, state, source) => {\n this.navigateToSyncWithBrowser(url, source, state);\n });\n }\n\n /**\n * Schedules a router navigation to synchronize Router state with the browser state.\n *\n * This is done as a response to a popstate event and the initial navigation. These\n * two scenarios represent times when the browser URL/state has been updated and\n * the Router needs to respond to ensure its internal state matches.\n */\n private navigateToSyncWithBrowser(\n url: string,\n source: NavigationTrigger,\n state: RestoredState | null | undefined,\n ) {\n const extras: NavigationExtras = {replaceUrl: true};\n\n // TODO: restoredState should always include the entire state, regardless\n // of navigationId. This requires a breaking change to update the type on\n // NavigationStart’s restoredState, which currently requires navigationId\n // to always be present. The Router used to only restore history state if\n // a navigationId was present.\n\n // The stored navigationId is used by the RouterScroller to retrieve the scroll\n // position for the page.\n const restoredState = state?.navigationId ? state : null;\n\n // Separate to NavigationStart.restoredState, we must also restore the state to\n // history.state and generate a new navigationId, since it will be overwritten\n if (state) {\n const stateCopy = {...state} as Partial<RestoredState>;\n delete stateCopy.navigationId;\n delete stateCopy.ɵrouterPageId;\n if (Object.keys(stateCopy).length !== 0) {\n extras.state = stateCopy;\n }\n }\n\n const urlTree = this.parseUrl(url);\n this.scheduleNavigation(urlTree, source, restoredState, extras).catch((e) => {\n if (this.disposed) {\n return;\n }\n this.injector.get(ɵINTERNAL_APPLICATION_ERROR_HANDLER)(e);\n });\n }\n\n /** The current URL. */\n get url(): string {\n return this.serializeUrl(this.currentUrlTree);\n }\n\n /**\n * Returns the current `Navigation` object when the router is navigating,\n * and `null` when idle.\n *\n * @deprecated 20.2 Use the `currentNavigation` signal instead.\n */\n getCurrentNavigation(): Navigation | null {\n return untracked(this.navigationTransitions.currentNavigation);\n }\n\n /**\n * The `Navigation` object of the most recent navigation to succeed and `null` if there\n * has not been a successful navigation yet.\n */\n get lastSuccessfulNavigation(): Signal<Navigation | null> {\n return this.navigationTransitions.lastSuccessfulNavigation;\n }\n\n /**\n * Resets the route configuration used for navigation and generating links.\n *\n * @param config The route array for the new configuration.\n *\n * @usageNotes\n *\n * ```ts\n * router.resetConfig([\n * { path: 'team/:id', component: TeamCmp, children: [\n * { path: 'simple', component: SimpleCmp },\n * { path: 'user/:name', component: UserCmp }\n * ]}\n * ]);\n * ```\n */\n resetConfig(config: Routes): void {\n (typeof ngDevMode === 'undefined' || ngDevMode) && validateConfig(config);\n this.config = config.map(standardizeConfig);\n this.navigated = false;\n }\n\n /** @docs-private */\n ngOnDestroy(): void {\n this.dispose();\n }\n\n /** Disposes of the router. */\n dispose(): void {\n // We call `unsubscribe()` to release observers, as users may forget to\n // unsubscribe manually when subscribing to `router.events`. We do not call\n // `complete()` because it is unsafe; if someone subscribes using the `first`\n // operator and the observable completes before emitting a value,\n // RxJS will throw an error.\n this._events.unsubscribe();\n this.navigationTransitions.complete();\n this.nonRouterCurrentEntryChangeSubscription?.unsubscribe();\n this.nonRouterCurrentEntryChangeSubscription = undefined;\n this.disposed = true;\n this.eventsSubscription.unsubscribe();\n }\n\n /**\n * Appends URL segments to the current URL tree to create a new URL tree.\n *\n * @param commands An array of URL fragments with which to construct the new URL tree.\n * If the path is static, can be the literal URL string. For a dynamic path, pass an array of path\n * segments, followed by the parameters for each segment.\n * The fragments are applied to the current URL tree or the one provided in the `relativeTo`\n * property of the options object, if supplied.\n * @param navigationExtras Options that control the navigation strategy.\n * @returns The new URL tree.\n *\n * @usageNotes\n *\n * ```ts\n * // create /team/33/user/11\n * router.createUrlTree(['/team', 33, 'user', 11]);\n *\n * // create /team/33;expand=true/user/11\n * router.createUrlTree(['/team', 33, {expand: true}, 'user', 11]);\n *\n * // you can collapse static segments like this (this works only with the first passed-in value):\n * router.createUrlTree(['/team/33/user', userId]);\n *\n * // If the first segment can contain slashes, and you do not want the router to split it,\n * // you can do the following:\n * router.createUrlTree([{segmentPath: '/one/two'}]);\n *\n * // create /team/33/(user/11//right:chat)\n * router.createUrlTree(['/team', 33, {outlets: {primary: 'user/11', right: 'chat'}}]);\n *\n * // remove the right secondary node\n * router.createUrlTree(['/team', 33, {outlets: {primary: 'user/11', right: null}}]);\n *\n * // assuming the current url is `/team/33/user/11` and the route points to `user/11`\n *\n * // navigate to /team/33/user/11/details\n * router.createUrlTree(['details'], {relativeTo: route});\n *\n * // navigate to /team/33/user/22\n * router.createUrlTree(['../22'], {relativeTo: route});\n *\n * // navigate to /team/44/user/22\n * router.createUrlTree(['../../team/44/user/22'], {relativeTo: route});\n * ```\n * Note that a value of `null` or `undefined` for `relativeTo` indicates that the\n * tree should be created relative to the root.\n *\n */\n createUrlTree(commands: readonly any[], navigationExtras: UrlCreationOptions = {}): UrlTree {\n const {relativeTo, queryParams, fragment, queryParamsHandling, preserveFragment} =\n navigationExtras;\n const f = preserveFragment ? this.currentUrlTree.fragment : fragment;\n let q: Params | null = null;\n switch (queryParamsHandling ?? this.options.defaultQueryParamsHandling) {\n case 'merge':\n q = {...this.currentUrlTree.queryParams, ...queryParams};\n break;\n case 'preserve':\n q = this.currentUrlTree.queryParams;\n break;\n default:\n q = queryParams || null;\n }\n if (q !== null) {\n q = this.removeEmptyProps(q);\n }\n\n let relativeToUrlSegmentGroup: UrlSegmentGroup | undefined;\n try {\n const relativeToSnapshot = relativeTo ? relativeTo.snapshot : this.routerState.snapshot.root;\n relativeToUrlSegmentGroup = createSegmentGroupFromRoute(relativeToSnapshot);\n } catch (e: unknown) {\n // This is strictly for backwards compatibility with tests that create\n // invalid `ActivatedRoute` mocks.\n // Note: the difference between having this fallback for invalid `ActivatedRoute` setups and\n // just throwing is ~500 test failures. Fixing all of those tests by hand is not feasible at\n // the moment.\n if (typeof commands[0] !== 'string' || commands[0][0] !== '/') {\n // Navigations that were absolute in the old way of creating UrlTrees\n // would still work because they wouldn't attempt to match the\n // segments in the `ActivatedRoute` to the `currentUrlTree` but\n // instead just replace the root segment with the navigation result.\n // Non-absolute navigations would fail to apply the commands because\n // the logic could not find the segment to replace (so they'd act like there were no\n // commands).\n commands = [];\n }\n relativeToUrlSegmentGroup = this.currentUrlTree.root;\n }\n return createUrlTreeFromSegmentGroup(\n relativeToUrlSegmentGroup,\n commands,\n q,\n f ?? null,\n this.urlSerializer,\n );\n }\n\n /**\n * Navigates to a view using an absolute route path.\n *\n * @param url An absolute path for a defined route. The function does not apply any delta to the\n * current URL.\n * @param extras An object containing properties that modify the navigation strategy.\n *\n * @returns A Promise that resolves to 'true' when navigation succeeds,\n * to 'false' when navigation fails, or is rejected on error.\n *\n * @usageNotes\n *\n * The following calls request navigation to an absolute path.\n *\n * ```ts\n * router.navigateByUrl(\"/team/33/user/11\");\n *\n * // Navigate without updating the URL\n * router.navigateByUrl(\"/team/33/user/11\", { skipLocationChange: true });\n * ```\n *\n * @see [Routing and Navigation guide](guide/routing/common-router-tasks)\n *\n */\n navigateByUrl(\n url: string | UrlTree,\n extras: NavigationBehaviorOptions = {\n skipLocationChange: false,\n },\n ): Promise<boolean> {\n const urlTree = isUrlTree(url) ? url : this.parseUrl(url);\n const mergedTree = this.urlHandlingStrategy.merge(urlTree, this.rawUrlTree);\n\n return this.scheduleNavigation(mergedTree, IMPERATIVE_NAVIGATION, null, extras);\n }\n\n /**\n * Navigate based on the provided array of commands and a starting point.\n * If no starting route is provided, the navigation is absolute.\n *\n * @param commands An array of URL fragments with which to construct the target URL.\n * If the path is static, can be the literal URL string. For a dynamic path, pass an array of path\n * segments, followed by the parameters for each segment.\n * The fragments are applied to the current URL or the one provided in the `relativeTo` property\n * of the options object, if supplied.\n * @param extras An options object that determines how the URL should be constructed or\n * interpreted.\n *\n * @returns A Promise that resolves to `true` when navigation succeeds, or `false` when navigation\n * fails. The Promise is rejected when an error occurs if `resolveNavigationPromiseOnError` is\n * not `true`.\n *\n * @usageNotes\n *\n * The following calls request navigation to a dynamic route path relative to the current URL.\n *\n * ```ts\n * router.navigate(['team', 33, 'user', 11], {relativeTo: route});\n *\n * // Navigate without updating the URL, overriding the default behavior\n * router.navigate(['team', 33, 'user', 11], {relativeTo: route, skipLocationChange: true});\n * ```\n *\n * @see [Routing and Navigation guide](guide/routing/common-router-tasks)\n *\n */\n navigate(\n commands: readonly any[],\n extras: NavigationExtras = {skipLocationChange: false},\n ): Promise<boolean> {\n validateCommands(commands);\n return this.navigateByUrl(this.createUrlTree(commands, extras), extras);\n }\n\n /** Serializes a `UrlTree` into a string */\n serializeUrl(url: UrlTree): string {\n return this.urlSerializer.serialize(url);\n }\n\n /** Parses a string into a `UrlTree` */\n parseUrl(url: string): UrlTree {\n try {\n return this.urlSerializer.parse(url);\n } catch (e) {\n this.console.warn(\n formatRuntimeError(\n RuntimeErrorCode.ERROR_PARSING_URL,\n ngDevMode && `Error parsing URL ${url}. Falling back to '/' instead. \\n` + e,\n ),\n );\n return this.urlSerializer.parse('/');\n }\n }\n\n /**\n * Returns whether the url is activated.\n *\n * @deprecated\n * Use `IsActiveMatchOptions` instead.\n *\n * - The equivalent `IsActiveMatchOptions` for `true` is\n * `{paths: 'exact', queryParams: 'exact', fragment: 'ignored', matrixParams: 'ignored'}`.\n * - The equivalent for `false` is\n * `{paths: 'subset', queryParams: 'subset', fragment: 'ignored', matrixParams: 'ignored'}`.\n */\n isActive(url: string | UrlTree, exact: boolean): boolean;\n /**\n * Returns whether the url is activated.\n * @deprecated 21.1 - Use the `isActive` function instead.\n * @see {@link isActive}\n */\n isActive(url: string | UrlTree, matchOptions: IsActiveMatchOptions): boolean;\n /** @internal */\n isActive(url: string | UrlTree, matchOptions: boolean | IsActiveMatchOptions): boolean;\n /**\n * @deprecated 21.1 - Use the `isActive` function instead.\n * @see {@link isActive}\n */\n isActive(url: string | UrlTree, matchOptions: boolean | IsActiveMatchOptions): boolean {\n let options: IsActiveMatchOptions;\n if (matchOptions === true) {\n options = {...exactMatchOptions};\n } else if (matchOptions === false) {\n options = {...subsetMatchOptions};\n } else {\n options = matchOptions;\n }\n if (isUrlTree(url)) {\n return containsTree(this.currentUrlTree, url, options);\n }\n\n const urlTree = this.parseUrl(url);\n return containsTree(this.currentUrlTree, urlTree, options);\n }\n\n private removeEmptyProps(params: Params): Params {\n return Object.entries(params).reduce((result: Params, [key, value]: [string, any]) => {\n if (value !== null && value !== undefined) {\n result[key] = value;\n }\n return result;\n }, {});\n }\n\n private scheduleNavigation(\n rawUrl: UrlTree,\n source: NavigationTrigger,\n restoredState: RestoredState | null,\n extras: NavigationExtras,\n priorPromise?: {\n resolve: (result: boolean | PromiseLike<boolean>) => void;\n reject: (reason?: any) => void;\n promise: Promise<boolean>;\n },\n ): Promise<boolean> {\n if (this.disposed) {\n return Promise.resolve(false);\n }\n\n let resolve: (result: boolean | PromiseLike<boolean>) => void;\n let reject: (reason?: any) => void;\n let promise: Promise<boolean>;\n if (priorPromise) {\n resolve = priorPromise.resolve;\n reject = priorPromise.reject;\n promise = priorPromise.promise;\n } else {\n promise = new Promise<boolean>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n }\n\n // Indicate that the navigation is happening.\n const taskId = this.pendingTasks.add();\n afterNextNavigation(this, () => {\n // Remove pending task in a microtask to allow for cancelled\n // initial navigations and redirects within the same task.\n queueMicrotask(() => this.pendingTasks.remove(taskId));\n });\n\n this.navigationTransitions.handleNavigationRequest({\n source,\n restoredState,\n currentUrlTree: this.currentUrlTree,\n currentRawUrl: this.currentUrlTree,\n rawUrl,\n extras,\n resolve: resolve!,\n reject: reject!,\n promise,\n currentSnapshot: this.routerState.snapshot,\n currentRouterState: this.routerState,\n });\n\n // Make sure that the error is propagated even though `processNavigations` catch\n // handler does not rethrow\n return promise.catch((e: any) => {\n return Promise.reject(e);\n });\n }\n}\n\nfunction validateCommands(commands: readonly string[]): void {\n for (let i = 0; i < commands.length; i++) {\n const cmd = commands[i];\n if (cmd == null) {\n throw new RuntimeError(\n RuntimeErrorCode.NULLISH_COMMAND,\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n `The requested path contains ${cmd} segment at index ${i}`,\n );\n }\n }\n}\n"],"names":["PRIMARY_OUTLET","RouteTitleKey","Symbol","ParamsAsMap","params","constructor","has","name","Object","prototype","hasOwnProperty","call","get","v","Array","isArray","getAll","keys","convertToParamMap","matchParts","routeParts","urlSegments","posParams","i","length","part","segment","isParameter","substring","path","defaultUrlMatcher","segments","segmentGroup","route","parts","split","wildcardIndex","indexOf","pathMatch","hasChildren","consumed","slice","lastIndexOf","pre","post","firstValueFrom","source","Promise","resolve","reject","pipe","first","subscribe","next","value","error","err","shallowEqualArrays","a","b","shallowEqual","k1","getDataKeys","undefined","k2","key","equalArraysOrString","obj","getOwnPropertySymbols","aSorted","sort","bSorted","every","val","index","last","wrapIntoObservable","isObservable","isPromise","from","of","wrapIntoPromise","pathCompareMap","equalSegmentGroups","containsSegmentGroup","paramCompareMap","equalParams","containsParams","ignored","isActive","url","router","matchOptions","urlTree","UrlTree","parseUrl","computed","containsTree","lastSuccessfulNavigation","finalUrl","container","containee","options","paths","root","matrixParams","queryParams","fragment","equalPath","matrixParamsMatch","numberOfChildren","c","children","containsSegmentGroupHelper","containeePaths","current","containerPaths","containeeSegment","parameters","_queryParamMap","UrlSegmentGroup","ngDevMode","RuntimeError","queryParamMap","toString","DEFAULT_SERIALIZER","serialize","parent","values","forEach","serializePaths","UrlSegment","_parameterMap","parameterMap","serializePath","equalSegments","as","bs","mapChildrenIntoArray","fn","res","entries","childOutlet","child","concat","UrlSerializer","deps","target","i0","ɵɵFactoryTarget","Injectable","providedIn","useFactory","DefaultUrlSerializer","decorators","args","parse","p","UrlParser","parseRootSegment","parseQueryParams","parseFragment","tree","serializeSegment","query","serializeQueryParams","encodeUriFragment","map","join","primary","k","push","encodeUriString","s","encodeURIComponent","replace","encodeUriQuery","encodeURI","encodeUriSegment","decode","decodeURIComponent","decodeQuery","serializeMatrixParams","strParams","filter","SEGMENT_RE","matchSegments","str","match","MATRIX_PARAM_SEGMENT_RE","matchMatrixKeySegments","QUERY_PARAM_RE","matchQueryParams","QUERY_PARAM_VALUE_RE","matchUrlQueryParamValue","remaining","consumeOptional","peekStartsWith","parseChildren","parseQueryParam","parseSegment","capture","parseParens","parseMatrixParams","parseParam","valueMatch","decodedKey","decodedVal","currentVal","allowPrimary","outletName","startsWith","createRoot","rootCandidate","squashSegmentGroup","newChildren","childCandidate","grandChildOutlet","grandChild","mergeTrivialChildren","isUrlTree","createUrlTreeFromSnapshot","relativeTo","commands","urlSerializer","relativeToUrlSegmentGroup","createSegmentGroupFromRoute","createUrlTreeFromSegmentGroup","targetGroup","createSegmentGroupFromRouteRecursive","currentRoute","childOutlets","childSnapshot","outlet","rootSegmentGroup","nav","computeNavigation","toRoot","position","findStartingPositionForTargetGroup","newSegmentGroup","processChildren","updateSegmentGroupChildren","updateSegmentGroup","isMatrixParams","command","outlets","segmentPath","isCommandWithOutlets","normalizeQueryParams","oldRoot","oldSegmentGroup","qp","replaceSegment","newRoot","oldSegment","newSegment","Navigation","isAbsolute","numberOfDoubleDots","cmdWithOutlet","find","reduce","cmd","cmdIdx","urlPart","partIndex","Position","NaN","modifier","createPositionApplyingDoubleDots","group","g","ci","dd","getOutlets","startIndex","m","prefixedWith","slicedCommands","commandIndex","pathIndex","createNewSegmentGroup","some","o","childrenOfEmptyChild","currentCommandIndex","currentPathIndex","noMatch","curr","compare","createNewSegmentChildren","stringify","IMPERATIVE_NAVIGATION","EventType","RouterEvent","id","NavigationStart","type","navigationTrigger","restoredState","NavigationEnd","urlAfterRedirects","NavigationCancellationCode","NavigationSkippedCode","NavigationCancel","reason","code","isRedirectingEvent","event","Redirect","SupersededByNewNavigation","NavigationSkipped","NavigationError","RoutesRecognized","state","GuardsCheckStart","GuardsCheckEnd","shouldActivate","ResolveStart","ResolveEnd","RouteConfigLoadStart","RouteConfigLoadEnd","ChildActivationStart","snapshot","routeConfig","ChildActivationEnd","ActivationStart","ActivationEnd","Scroll","routerEvent","anchor","scrollBehavior","pos","BeforeActivateRoutes","RedirectRequest","navigationBehaviorOptions","isPublicRouterEvent","e","stringifyEvent","OutletContext","rootInjector","attachRef","injector","_environmentInjector","ChildrenOutletContexts","contexts","Map","onChildOutletCreated","childName","context","getOrCreateContext","set","onChildOutletDestroyed","getContext","onOutletDeactivated","onOutletReAttached","token","EnvironmentInjector","ɵprov","ɵɵngDeclareInjectable","minVersion","version","ngImport","Tree","_root","t","pathFromRoot","n","findNode","firstChild","siblings","findPath","cc","node","unshift","TreeNode","nodeChildrenAsMap","RouterState","setRouterState","createEmptyState","rootComponent","createEmptyStateSnapshot","emptyUrl","BehaviorSubject","emptyParams","emptyData","emptyQueryParams","activated","ActivatedRoute","ActivatedRouteSnapshot","RouterStateSnapshot","urlSubject","paramsSubject","queryParamsSubject","fragmentSubject","dataSubject","component","_futureSnapshot","_routerState","_paramMap","title","data","futureSnapshot","d","paramMap","getInherited","paramsInheritanceStrategy","inherited","loadComponent","_resolvedData","hasStaticTitle","_resolve","environmentInjector","matched","serializeNode","advanceActivatedRoute","currentSnapshot","nextSnapshot","equalParamsAndUrlSegments","equalUrlParams","parentsMismatch","config","ROUTER_OUTLET_DATA","InjectionToken","RouterOutlet","activatedComponentRef","_activatedRoute","activateEvents","EventEmitter","deactivateEvents","attachEvents","detachEvents","routerOutletData","input","debugName","parentContexts","inject","location","ViewContainerRef","changeDetector","ChangeDetectorRef","inputBinder","INPUT_BINDER","optional","supportsBindingToComponentInputs","ngOnChanges","changes","firstChange","previousValue","isTrackedInParentContexts","deactivate","initializeOutletWithName","ngOnDestroy","unsubscribeFromRouteData","ngOnInit","attach","activateWith","isActivated","instance","activatedRoute","activatedRouteData","detach","cmp","emit","ref","insert","hostView","bindActivatedRouteToOutletComponent","destroy","childContexts","OutletInjector","createComponent","markForCheck","Directive","isStandalone","selector","inputs","classPropertyName","publicName","isSignal","isRequired","transformFunction","outputs","exportAs","usesOnChanges","Input","Output","outletData","notFoundValue","RoutedComponentInputBinder","outletDataSubscriptions","subscribeToRouteData","unsubscribe","delete","dataSubscription","combineLatest","switchMap","mirror","reflectComponentType","templateName","setInput","ɵEmptyOutletComponent","Component","template","isInline","dependencies","kind","imports","standardizeConfig","r","loadChildren","createRouterState","routeReuseStrategy","prevState","createNode","shouldReuseRoute","createOrReuseChildren","shouldAttach","detachedRouteHandle","retrieve","createActivatedRoute","RedirectCommand","redirectTo","NAVIGATION_CANCELING_ERROR","redirectingNavigationError","redirect","navigationCancelingError","message","Error","cancellationCode","isRedirectingNavigationCancelingError","isNavigationCancelingError","warnedAboutUnsupportedInputBinding","ActivateRoutes","futureState","currState","forwardEvent","inputBindingEnabled","activate","futureRoot","currRoot","deactivateChildRoutes","activateChildRoutes","futureNode","currNode","futureChild","childOutletName","deactivateRoutes","deactivateRouteAndItsChildren","parentContext","future","shouldDetach","detachAndStoreRouteSubtree","deactivateRouteAndOutlet","treeNode","componentRef","store","activateRoutes","stored","console","warn","CanActivate","CanDeactivate","getAllRouteGuards","getChildRouteGuards","getCanActivateChild","canActivateChild","guards","getTokenOrFunctionIdentity","tokenOrFunction","NOT_FOUND","result","isInjectable","futurePath","checks","canDeactivateChecks","canActivateChecks","prevChildren","getRouteGuards","shouldRun","shouldRunGuardsAndResolvers","runGuardsAndResolvers","mode","runInInjectionContext","isFunction","isBoolean","isCanLoad","guard","canLoad","isCanActivate","canActivate","isCanActivateChild","isCanDeactivate","canDeactivate","isCanMatch","canMatch","isEmptyError","EmptyError","INITIAL_VALUE","prioritizedGuardValue","obs","take","startWith","results","isRedirect","item","abortSignalToObservable","signal","aborted","Observable","subscriber","handler","complete","addEventListener","removeEventListener","takeUntilAbort","takeUntil","checkGuards","mergeMap","targetSnapshot","guardsResult","runCanDeactivateChecks","runCanActivateChecks","futureRSS","currRSS","check","runCanDeactivate","concatMap","fireChildActivationStart","fireActivationStart","runCanActivateChild","runCanActivate","futureARS","canActivateObservables","defer","closestInjector","guardVal","canActivateChildGuards","reverse","_","canActivateChildGuardsMapped","guardsMapped","currARS","canDeactivateObservables","runCanLoadGuards","abortSignal","canLoadObservables","injectionToken","obs$","redirectIfUrlTree","tap","runCanMatchGuards","canMatchObservables","NoMatch","setPrototypeOf","AbsoluteRedirect","namedOutletsRedirect","canLoadFails","GuardRejected","ApplyRedirects","lineralizeSegments","applyRedirectCommands","getRedirectResult","newTree","applyRedirectCreateUrlTree","createSegmentGroup","createQueryParams","redirectToParams","actualParams","copySourceValue","sourceName","updatedSegments","createSegments","redirectToSegments","actualSegments","findPosParam","findOrReturn","redirectToUrlSegment","idx","splice","redirectToFn","getOrCreateRouteInjectorIfNeeded","currentInjector","providers","_injector","createEnvironmentInjector","validateConfig","parentPath","requireStandaloneComponents","fullPath","getFullPath","validateNode","assertStandalone","isNgModule","matcher","charAt","exp","getOutlet","sortByMatchingOutlets","routes","sortedConfig","consumedSegments","remainingSegments","positionalParamSegments","matchWithChecks","slicedSegments","containsEmptyPathMatchesWithNamedOutlets","createChildrenForEmptyPaths","containsEmptyPathMatches","addEmptyPathsToChildrenIfNeeded","emptyPathMatch","primarySegment","noLeftoversInUrl","NoLeftoversInUrl","recognize","configLoader","rootComponentType","Recognizer","MAX_ALLOWED_REDIRECTS","applyRedirects","absoluteRedirectCount","allowRedirects","noMatchError","rootSnapshot","rootNode","routeState","freeze","processSegmentGroup","parentRoute","processSegment","outletChildren","mergedChildren","mergeEmptyPathMatches","checkOutletNameUniqueness","sortActivatedRouteSnapshots","processSegmentAgainstRoute","rawSegment","matchSegmentAgainstRoute","expandSegmentAgainstRouteUsingRedirect","getData","_loadedComponent","getResolve","newSegments","childConfig","getChildConfig","childInjector","_loadedInjector","matchedOnOutlet","_loadedRoutes","ngModuleFactory","_loadedNgModuleFactory","create","shouldLoadResult","cfg","factory","nodes","localeCompare","hasEmptyPathConfig","mergedNodes","Set","duplicateEmptyPathNode","resultNode","add","mergedNode","names","routeWithSameOutletName","serializer","recognizeFn","extractedUrl","resolveData","routesWithResolversToRun","routesNeedingDataUpdates","newRoute","flattenRouteTree","routesProcessed","runResolve","takeLast","size","EMPTY","descendants","flat","resolveNode","resolvedData","getResolver","catchError","throwError","resolver","resolverValue","switchTap","nextResult","TitleStrategy","buildTitle","pageTitle","getResolvedTitleForRoute","DefaultTitleStrategy","updateTitle","setTitle","i1","Title","ROUTER_CONFIGURATION","ROUTES","RouterConfigLoader","componentLoaders","WeakMap","childrenLoaders","onLoadStartListener","onLoadEndListener","compiler","Compiler","loader","loaded","maybeResolveResources","maybeUnwrapDefaultExport","parentInjector","factoryOrRoutes","NgModuleFactory","compileModuleAsync","rawRoutes","self","isWrappedDefaultExport","ngJitMode","fetch","resolveComponentResources","UrlHandlingStrategy","DefaultUrlHandlingStrategy","shouldProcessUrl","extract","merge","newUrlPart","wholeUrl","CREATE_VIEW_TRANSITION","VIEW_TRANSITION_OPTIONS","createViewTransition","to","transitionOptions","document","DOCUMENT","startViewTransition","skipNextTransition","setTimeout","resolveViewTransitionStarted","viewTransitionStarted","transition","createRenderPromise","updateCallbackDone","catch","ready","finished","onViewTransitionCreated","afterNextRender","read","noop","NAVIGATION_ERROR_HANDLER","NavigationTransitions","currentNavigation","equal","currentTransition","events","Subject","transitionAbortWithErrorSubject","destroyRef","DestroyRef","rootContexts","Location","titleStrategy","urlHandlingStrategy","navigationErrorHandler","navigationId","hasRequestedNavigation","transitions","afterPreactivation","destroyed","onLoadStart","onLoadEnd","onDestroy","handleNavigationRequest","request","untracked","rawUrl","targetRouterState","setupNavigations","overallTransitionState","completedOrAborted","abortController","AbortController","shouldContinueNavigation","cancellationReason","cancelNavigationTransition","initialUrl","targetBrowserUrl","extras","browserUrl","trigger","previousNavigation","abort","urlTransition","navigated","isUpdatingInternalState","isUpdatedBrowserUrl","onSameUrlNavigation","IgnoredSameUrlNavigation","update","routesRecognized","currentRawUrl","navStart","skipLocationChange","replaceUrl","IgnoredByUrlHandlingStrategy","guardsStart","evt","guardsEnd","resolveStart","dataResolved","resolveEnd","NoDataFromResolver","loadComponents","loaders","then","loadedComponent","all","currentRouterState","Aborted","finalize","cancelationReason","navigationError","navigationErrorHandlerResult","ee","resolveNavigationPromiseOnError","navCancel","currentUrlTree","currentBrowserUrl","isBrowserTriggeredNavigation","ROUTE_INJECTOR_CLEANUP","routeInjectorCleanup","routerState","activeRoutes","collectDescendants","storedHandles","retrieveStoredRouteHandles","handle","internalHandle","destroyUnusedInjectors","strategy","inheritedForceDestroy","shouldDestroyCurrentRoute","shouldDestroyInjector","destroyDetachedRouteHandle","RouteReuseStrategy","DefaultRouteReuseStrategy","BaseRouteReuseStrategy","detachedTree","StateManager","canceledNavigationResolution","urlUpdateStrategy","getCurrentUrlTree","rawUrlTree","getRawUrlTree","createBrowserPath","commitTransition","getRouterState","_stateMemento","createStateMemento","stateMemento","updateStateMemento","getState","HistoryStateManager","currentPageId","lastSuccessfulId","browserPageId","ɵrouterPageId","registerNonRouterCurrentEntryChangeListener","listener","handleRouterEvent","setBrowserUrl","restoreHistory","isCurrentPathEqualTo","currentBrowserPageId","newState","generateNgRouterState","replaceState","go","navigation","restoringFromCaughtError","targetPagePosition","historyGo","resetInternalState","resetUrlToCurrentUrlTree","routerPageId","afterNextNavigation","action","redirecting","exactMatchOptions","subsetMatchOptions","Router","stateManager","disposed","nonRouterCurrentEntryChangeSubscription","Console","pendingTasks","PendingTasks","navigationTransitions","_events","injectorCleanup","componentInputBindingEnabled","asReadonly","resetConfig","subscribeToNavigationEvents","eventsSubscription","Subscription","subscription","opts","mergedTree","scroll","info","scheduleNavigation","promise","resetRootComponentType","initialNavigation","setUpLocationChangeListener","navigateToSyncWithBrowser","stateCopy","ɵINTERNAL_APPLICATION_ERROR_HANDLER","serializeUrl","getCurrentNavigation","dispose","createUrlTree","navigationExtras","queryParamsHandling","preserveFragment","f","q","defaultQueryParamsHandling","removeEmptyProps","relativeToSnapshot","navigateByUrl","navigate","validateCommands","formatRuntimeError","priorPromise","rej","taskId","queueMicrotask","remove"],"mappings":"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"}
|