valyrian.js 7.2.12 → 8.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/flux-store/index.d.ts +32 -0
- package/dist/flux-store/index.d.ts.map +1 -0
- package/dist/flux-store/index.js +267 -0
- package/dist/flux-store/index.js.map +7 -0
- package/dist/flux-store/index.min.js +1 -0
- package/dist/flux-store/index.min.js.map +1 -0
- package/dist/flux-store/index.mjs +246 -0
- package/dist/flux-store/index.mjs.map +7 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +35 -51
- package/dist/hooks/index.js.map +3 -3
- package/dist/hooks/index.min.js +1 -0
- package/dist/hooks/index.min.js.map +1 -0
- package/dist/hooks/index.mjs +36 -52
- package/dist/hooks/index.mjs.map +3 -3
- package/dist/index.d.ts +18 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +107 -88
- package/dist/index.js.map +3 -3
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +107 -88
- package/dist/index.mjs.map +3 -3
- package/dist/native-store/index.d.ts +14 -0
- package/dist/native-store/index.d.ts.map +1 -0
- package/dist/native-store/index.js +103 -0
- package/dist/native-store/index.js.map +7 -0
- package/dist/native-store/index.min.js +1 -0
- package/dist/native-store/index.min.js.map +1 -0
- package/dist/native-store/index.mjs +82 -0
- package/dist/native-store/index.mjs.map +7 -0
- package/dist/node/index.d.ts +1 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +125 -10
- package/dist/node/index.js.map +4 -4
- package/dist/node/index.mjs +125 -10
- package/dist/node/index.mjs.map +4 -4
- package/dist/node/node.sw.js +152 -0
- package/dist/node/utils/icons.d.ts +4 -5
- package/dist/node/utils/icons.d.ts.map +1 -1
- package/dist/node/utils/inline.d.ts +1 -1
- package/dist/node/utils/inline.d.ts.map +1 -1
- package/dist/node/utils/node.sw.js +152 -0
- package/dist/node/utils/session-storage.d.ts +22 -0
- package/dist/node/utils/session-storage.d.ts.map +1 -0
- package/dist/node/utils/sw.d.ts.map +1 -1
- package/dist/node/utils/tree-adapter.d.ts +5 -1
- package/dist/node/utils/tree-adapter.d.ts.map +1 -1
- package/dist/pulse-store/index.d.ts +16 -0
- package/dist/pulse-store/index.d.ts.map +1 -0
- package/dist/pulse-store/index.js +143 -0
- package/dist/pulse-store/index.js.map +7 -0
- package/dist/pulse-store/index.min.js +1 -0
- package/dist/pulse-store/index.min.js.map +1 -0
- package/dist/pulse-store/index.mjs +122 -0
- package/dist/pulse-store/index.mjs.map +7 -0
- package/dist/request/index.d.ts +11 -11
- package/dist/request/index.d.ts.map +1 -1
- package/dist/request/index.js +63 -84
- package/dist/request/index.js.map +2 -2
- package/dist/request/index.min.js +1 -0
- package/dist/request/index.min.js.map +1 -0
- package/dist/request/index.mjs +63 -84
- package/dist/request/index.mjs.map +2 -2
- package/dist/router/index.d.ts +36 -33
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +247 -96
- package/dist/router/index.js.map +3 -3
- package/dist/router/index.min.js +1 -0
- package/dist/router/index.min.js.map +1 -0
- package/dist/router/index.mjs +247 -96
- package/dist/router/index.mjs.map +3 -3
- package/dist/signals/index.d.ts +6 -0
- package/dist/signals/index.d.ts.map +1 -0
- package/dist/signals/index.js +92 -0
- package/dist/signals/index.js.map +7 -0
- package/dist/signals/index.min.js +1 -0
- package/dist/signals/index.min.js.map +1 -0
- package/dist/signals/index.mjs +71 -0
- package/dist/signals/index.mjs.map +7 -0
- package/dist/suspense/index.d.ts +6 -0
- package/dist/suspense/index.d.ts.map +1 -0
- package/dist/suspense/index.js +67 -0
- package/dist/suspense/index.js.map +7 -0
- package/dist/suspense/index.min.js +1 -0
- package/dist/suspense/index.min.js.map +1 -0
- package/dist/suspense/index.mjs +46 -0
- package/dist/suspense/index.mjs.map +7 -0
- package/dist/sw/index.min.js +1 -0
- package/dist/sw/index.min.js.map +1 -0
- package/dist/translate/index.d.ts +19 -0
- package/dist/translate/index.d.ts.map +1 -0
- package/dist/translate/index.js +150 -0
- package/dist/translate/index.js.map +7 -0
- package/dist/translate/index.min.js +1 -0
- package/dist/translate/index.min.js.map +1 -0
- package/dist/translate/index.mjs +129 -0
- package/dist/translate/index.mjs.map +7 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/deep-freeze.d.ts +3 -0
- package/dist/utils/deep-freeze.d.ts.map +1 -0
- package/dist/utils/getter-setter.d.ts +3 -0
- package/dist/utils/getter-setter.d.ts.map +1 -0
- package/dist/utils/has-changed.d.ts +2 -0
- package/dist/utils/has-changed.d.ts.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +138 -0
- package/dist/utils/index.js.map +7 -0
- package/dist/utils/index.min.js +1 -0
- package/dist/utils/index.min.js.map +1 -0
- package/dist/utils/index.mjs +115 -0
- package/dist/utils/index.mjs.map +7 -0
- package/lib/flux-store/index.ts +312 -0
- package/lib/hooks/index.ts +39 -57
- package/lib/index.ts +135 -118
- package/lib/native-store/index.ts +106 -0
- package/lib/node/index.ts +3 -1
- package/lib/node/utils/icons.ts +4 -4
- package/lib/node/utils/inline.ts +2 -0
- package/lib/node/utils/node.sw.js +152 -0
- package/lib/node/utils/session-storage.ts +117 -0
- package/lib/node/utils/sw.ts +34 -10
- package/lib/node/utils/tree-adapter.ts +19 -1
- package/lib/pulse-store/index.ts +188 -0
- package/lib/request/index.ts +92 -122
- package/lib/router/index.ts +353 -164
- package/lib/signals/index.ts +98 -0
- package/lib/suspense/index.ts +57 -0
- package/lib/translate/index.ts +156 -0
- package/lib/utils/deep-freeze.ts +54 -0
- package/lib/utils/getter-setter.ts +40 -0
- package/lib/utils/has-changed.ts +43 -0
- package/lib/utils/index.ts +3 -0
- package/package.json +40 -57
- package/tsconfig.json +5 -4
- package/dist/dataset/index.d.ts +0 -24
- package/dist/dataset/index.d.ts.map +0 -1
- package/dist/dataset/index.js +0 -178
- package/dist/dataset/index.js.map +0 -7
- package/dist/dataset/index.mjs +0 -157
- package/dist/dataset/index.mjs.map +0 -7
- package/dist/node/node.sw.tpl +0 -133
- package/dist/node/utils/node.sw.tpl +0 -133
- package/dist/proxy-signal/index.d.ts +0 -23
- package/dist/proxy-signal/index.d.ts.map +0 -1
- package/dist/proxy-signal/index.js +0 -138
- package/dist/proxy-signal/index.js.map +0 -7
- package/dist/proxy-signal/index.mjs +0 -117
- package/dist/proxy-signal/index.mjs.map +0 -7
- package/dist/signal/index.d.ts +0 -9
- package/dist/signal/index.d.ts.map +0 -1
- package/dist/signal/index.js +0 -76
- package/dist/signal/index.js.map +0 -7
- package/dist/signal/index.mjs +0 -55
- package/dist/signal/index.mjs.map +0 -7
- package/dist/store/index.d.ts +0 -16
- package/dist/store/index.d.ts.map +0 -1
- package/dist/store/index.js +0 -93
- package/dist/store/index.js.map +0 -7
- package/dist/store/index.mjs +0 -72
- package/dist/store/index.mjs.map +0 -7
- package/lib/dataset/index.ts +0 -193
- package/lib/node/utils/node.sw.tpl +0 -133
- package/lib/proxy-signal/index.ts +0 -187
- package/lib/signal/index.ts +0 -86
- package/lib/store/index.ts +0 -101
package/dist/router/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../lib/router/index.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable no-use-before-define */\nimport {\n Component,\n POJOComponent,\n VnodeComponentInterface,\n VnodeWithDom,\n directive,\n isComponent,\n isNodeJs,\n isVnodeComponent,\n mount,\n setAttribute,\n v\n} from \"valyrian.js\";\n\ninterface Request {\n params: Record<string, any>;\n query: Record<string, any>;\n url: string;\n path: string;\n matches: string[];\n // eslint-disable-next-line no-unused-vars\n redirect: (path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface) => false;\n}\n\ninterface Middleware {\n // eslint-disable-next-line no-unused-vars\n (req: Request, res?: any):\n | Promise<any | Component | POJOComponent | VnodeComponentInterface>\n | any\n | Component\n | POJOComponent\n | VnodeComponentInterface;\n}\n\ninterface Middlewares extends Array<Middleware> {}\n\ninterface Path {\n method: string;\n path: string;\n middlewares: Middlewares;\n params: string[];\n regexp: RegExp;\n}\n\ninterface RouterInterface {\n paths: Path[];\n container: Element | string | null;\n query: Record<string, string | number>;\n options: Record<string, any>;\n url: string;\n path: string;\n params: Record<string, string | number | any>;\n matches: string[];\n pathPrefix: string;\n // eslint-disable-next-line no-unused-vars\n add(method: string, ...args: Middlewares): Router;\n // eslint-disable-next-line no-unused-vars\n use(...args: (string | Middleware | Router)[]): Router;\n\n routes(): string[];\n // eslint-disable-next-line no-unused-vars\n go(path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface): Promise<string | void>;\n}\n\ninterface RedirectFunction {\n // eslint-disable-next-line no-unused-vars\n (\n path: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState?: boolean\n ): Promise<string | void>;\n}\n\nfunction flat(array: any) {\n return Array.isArray(array) ? array.flat(Infinity) : [array];\n}\n\nfunction getPathWithoutPrefix(path: string, prefix: string) {\n return getPathWithoutLastSlash(path.replace(new RegExp(`^${prefix}`), \"\"));\n}\n\nfunction getPathWithoutLastSlash(path: string) {\n let pathWithoutLastSlash = path.replace(/\\/$/, \"\");\n if (pathWithoutLastSlash === \"\") {\n pathWithoutLastSlash = \"/\";\n }\n return pathWithoutLastSlash;\n}\n\nconst addPath = ({\n router,\n method,\n path,\n middlewares\n}: {\n router: Router;\n method: string;\n path: string;\n middlewares: Middleware[];\n}): void => {\n if (!method || !path || !Array.isArray(middlewares) || middlewares.length === 0) {\n throw new Error(`Invalid route input: ${method} ${path} ${middlewares}`);\n }\n\n // Trim trailing slashes from the path\n const realpath = path.replace(/(\\S)(\\/+)$/, \"$1\");\n\n // Find the express-like params in the path\n const params = (realpath.match(/:(\\w+)?/gi) || [])\n // Set the names of the params found\n .map((param) => param.slice(1));\n\n // Generate a regular expression to match the path\n const regexpPath = \"^\" + realpath.replace(/:(\\w+)/gi, \"([^\\\\/\\\\s]+)\") + \"$\";\n\n router.paths.push({\n method,\n path: realpath,\n middlewares: flat(middlewares),\n params,\n regexp: new RegExp(regexpPath, \"i\")\n });\n};\n\n// Parse a query string into an object\nfunction parseQuery(queryParts?: string): Record<string, string> {\n // Split the query string into an array of name-value pairs\n const parts = queryParts ? queryParts.split(\"&\") : [];\n const query: Record<string, string> = {};\n\n // Iterate over the name-value pairs and add them to the query object\n for (const nameValue of parts) {\n const [name, value] = nameValue.split(\"=\", 2);\n query[name] = value || \"\";\n }\n\n return query;\n}\n\n// Search for middlewares that match a given path\nfunction searchMiddlewares(router: RouterInterface, path: string): Middlewares {\n const middlewares: Middlewares = [];\n const params: Record<string, any> = {};\n const matches = [];\n\n // Search for middlewares\n for (const item of router.paths) {\n const match = item.regexp.exec(path);\n\n // If we found middlewares\n if (Array.isArray(match)) {\n middlewares.push(...item.middlewares);\n match.shift();\n\n // Parse params\n for (const [index, key] of item.params.entries()) {\n params[key] = match[index];\n }\n\n // Add remaining matches to the array\n matches.push(...match);\n\n if (item.method === \"add\") {\n router.path = getPathWithoutPrefix(item.path, router.pathPrefix);\n break;\n }\n }\n }\n\n router.params = params;\n router.matches = matches;\n\n return middlewares;\n}\n\nasync function searchComponent(\n router: RouterInterface,\n middlewares: Middlewares\n): Promise<Component | VnodeComponentInterface | false | void> {\n // Define request object with default values\n const request: Request = {\n params: router.params,\n query: router.query,\n url: router.url,\n path: router.path,\n matches: router.matches,\n redirect: (path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface) => {\n router.go(path, parentComponent);\n // Return false to stop the middleware chain\n return false;\n }\n };\n\n // Initialize response variable\n let response;\n\n // Iterate through middlewares\n for (const middleware of middlewares) {\n // Invoke middleware and update response\n response = await middleware(request, response);\n\n // Return response if it's a valid component\n if (response !== undefined && (isComponent(response) || isVnodeComponent(response))) {\n return response;\n }\n\n // Return false if response is explicitly false to stop the middleware chain\n if (response === false) {\n return false;\n }\n }\n}\n\nexport class Router implements RouterInterface {\n paths: Path[] = [];\n container: Element | string | null = null;\n query: Record<string, string | number> = {};\n options: Record<string, any> = {};\n url: string = \"\";\n path: string = \"\";\n params: Record<string, string | number | any> = {};\n matches: string[] = [];\n pathPrefix: string = \"\";\n\n constructor(pathPrefix: string = \"\") {\n this.pathPrefix = pathPrefix;\n }\n\n add(path: string, ...middlewares: Middlewares): Router {\n const pathWithoutLastSlash = getPathWithoutLastSlash(`${this.pathPrefix}${path}`);\n addPath({ router: this, method: \"add\", path: pathWithoutLastSlash, middlewares });\n return this;\n }\n\n use(...middlewares: Middlewares | Router[] | string[]): Router {\n const path = getPathWithoutLastSlash(\n `${this.pathPrefix}${typeof middlewares[0] === \"string\" ? middlewares.shift() : \"/\"}`\n );\n\n for (const item of middlewares) {\n if (item instanceof Router) {\n const subrouter = item as Router;\n for (const subpath of subrouter.paths) {\n addPath({\n router: this,\n method: subpath.method,\n path: `${path}${subpath.path}`.replace(/^\\/\\//, \"/\"),\n middlewares: subpath.middlewares\n });\n }\n continue;\n }\n\n if (typeof item === \"function\") {\n addPath({ router: this, method: \"use\", path: `${path}.*`, middlewares: [item as Middleware] });\n }\n }\n\n return this;\n }\n\n routes(): string[] {\n return this.paths.filter((path) => path.method === \"add\").map((path) => path.path);\n }\n\n async go(\n path: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState = false\n ): Promise<string | void> {\n if (!path) {\n throw new Error(\"router.url.required\");\n }\n\n const constructedPath = getPathWithoutLastSlash(`${this.pathPrefix}${path}`);\n const parts = constructedPath.split(\"?\", 2);\n this.url = constructedPath;\n this.query = parseQuery(parts[1]);\n\n const middlewares = searchMiddlewares(this as RouterInterface, parts[0].replace(/(.+)\\/$/, \"$1\").split(\"#\")[0]);\n let component = await searchComponent(this as RouterInterface, middlewares);\n\n if (component === false) {\n return;\n }\n\n if (!component) {\n throw new Error(`The url ${constructedPath} requested wasn't found`);\n }\n\n if (isComponent(parentComponent) || isVnodeComponent(parentComponent)) {\n const childComponent = isVnodeComponent(component) ? component : v(component as Component, {});\n if (isVnodeComponent(parentComponent)) {\n parentComponent.children.push(childComponent);\n component = parentComponent;\n } else {\n component = v(parentComponent, {}, childComponent) as VnodeComponentInterface;\n }\n }\n\n if (!isNodeJs && !preventPushState) {\n window.history.pushState(null, \"\", constructedPath);\n }\n\n if (this.container) {\n return mount(this.container, component);\n }\n }\n\n getOnClickHandler(url: string) {\n return (e: MouseEvent) => {\n if (typeof url === \"string\" && url.length > 0) {\n this.go(url);\n }\n e.preventDefault();\n };\n }\n}\n\nlet localRedirect: RedirectFunction;\n\nexport function redirect(\n url: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState = false\n): Promise<string | void> {\n if (!localRedirect) {\n throw new Error(\"router.redirect.not.found\");\n }\n return localRedirect(url, parentComponent, preventPushState);\n}\n\nexport function mountRouter(elementContainer: string | any, router: Router): void {\n router.container = elementContainer;\n localRedirect = router.go.bind(router);\n\n if (!isNodeJs) {\n function onPopStateGoToRoute(): void {\n const pathWithoutPrefix = getPathWithoutPrefix(document.location.pathname, router.pathPrefix);\n (router as unknown as Router).go(pathWithoutPrefix, undefined, true);\n }\n window.addEventListener(\"popstate\", onPopStateGoToRoute, false);\n onPopStateGoToRoute();\n }\n\n directive(\"route\", (vnode: VnodeWithDom): void => {\n const url = vnode.props[\"v-route\"];\n setAttribute(\"href\", url, vnode);\n setAttribute(\"onclick\", router.getOnClickHandler(url), vnode);\n });\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
6
|
-
"names": ["onPopStateGoToRoute"]
|
|
4
|
+
"sourcesContent": ["/* eslint-disable no-console */\n/* eslint-disable no-use-before-define */\nimport {\n Component,\n POJOComponent,\n VnodeComponentInterface,\n VnodeWithDom,\n directive,\n isComponent,\n isNodeJs,\n isVnodeComponent,\n mount,\n setAttribute,\n v\n} from \"valyrian.js\";\n\nexport interface Request {\n params: Record<string, any>;\n query: Record<string, any>;\n url: string;\n path: string;\n matches: string[];\n // eslint-disable-next-line no-unused-vars\n redirect: (path: string) => Promise<string | void>;\n}\n\nexport interface Middleware {\n // eslint-disable-next-line no-unused-vars\n (req: Request, err?: any):\n | Promise<any | Component | POJOComponent | VnodeComponentInterface>\n | any\n | Component\n | POJOComponent\n | VnodeComponentInterface;\n}\n\ninterface Middlewares extends Array<Middleware> {}\n\ninterface RedirectFunction {\n (\n // eslint-disable-next-line no-unused-vars\n path: string,\n // eslint-disable-next-line no-unused-vars\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n // eslint-disable-next-line no-unused-vars\n preventPushState?: boolean\n ): Promise<string | void>;\n}\n\nfunction flat(array: any) {\n return Array.isArray(array) ? array.flat(Infinity) : [array];\n}\n\nfunction getPathWithoutPrefix(path: string, prefix: string) {\n return getPathWithoutLastSlash(path.replace(new RegExp(`^${prefix}`), \"\"));\n}\n\nfunction getPathWithoutLastSlash(path: string) {\n let pathWithoutLastSlash = path.replace(/\\/$/, \"\");\n if (pathWithoutLastSlash === \"\") {\n pathWithoutLastSlash = \"/\";\n }\n return pathWithoutLastSlash;\n}\n\n// Parse a query string into an object\nfunction parseQuery(queryParts?: string): Record<string, any> {\n const parts = queryParts ? queryParts.split(\"&\") : [];\n const query: Record<string, any> = {};\n\n for (const nameValue of parts) {\n const [name, value] = nameValue.split(\"=\", 2);\n query[name] =\n isNaN(Number(value)) === false ? Number(value) : value === \"true\" ? true : value === \"false\" ? false : value;\n }\n\n return query;\n}\n\ninterface RouteNode {\n segment: string;\n children: Map<string, RouteNode>;\n middlewares?: Middlewares;\n paramKey?: string;\n isDynamic: boolean;\n}\n\nclass RouteTree {\n root: RouteNode = { segment: \"\", children: new Map(), isDynamic: false };\n\n addRoute(path: string, middlewares: Middlewares) {\n const segments = path === \"/\" ? [path] : path.split(\"/\").filter(Boolean); // Divide the path into segments\n let currentNode = this.root;\n\n for (const segment of segments) {\n const isDynamic = segment.startsWith(\":\");\n const key = isDynamic ? \":\" : segment; // If the segment is dynamic, use \":\" as key\n\n if (!currentNode.children.has(key)) {\n currentNode.children.set(key, {\n segment: segment,\n children: new Map(),\n isDynamic: isDynamic,\n paramKey: isDynamic ? segment.slice(1) : undefined\n });\n }\n\n currentNode = currentNode.children.get(key)!;\n }\n\n currentNode.middlewares = middlewares; // Assign the middlewares to the last node\n }\n\n // Search for a route in the tree\n // eslint-disable-next-line sonarjs/cognitive-complexity\n findRoute(path: string): { middlewares?: Middlewares; params: Record<string, string> } | null {\n const pathWithoutLastSlash = getPathWithoutLastSlash(path);\n const segments =\n pathWithoutLastSlash === \"/\" ? [pathWithoutLastSlash] : pathWithoutLastSlash.split(\"/\").filter(Boolean);\n let currentNode: RouteNode | null = this.root;\n const params: Record<string, string> = {};\n\n const wildcardMiddlewares: Middlewares = []; // Middlewares for wildcard routes\n const segmentsLength = segments.length;\n\n for (let i = 0; i < segmentsLength; i++) {\n if (!currentNode) {\n break;\n }\n\n const segment = segments[i];\n\n let found = false;\n\n for (const [key, child] of currentNode.children) {\n if (key === segment) {\n currentNode = child;\n found = true;\n break;\n }\n\n if (segment !== \".*\" && key === \":\") {\n currentNode = child;\n params[child.paramKey!] = segment;\n found = true;\n break;\n }\n\n if (key === \".*\" && !found) {\n wildcardMiddlewares.push(...(child.middlewares || []));\n }\n }\n\n if (!found) {\n if (currentNode.children.has(\".*\")) {\n return { middlewares: wildcardMiddlewares, params };\n }\n return null;\n }\n }\n\n // Add the wildcard middlewares to the current node middlewares\n const allMiddlewares = [...wildcardMiddlewares, ...(currentNode.middlewares || [])];\n\n // If there are no middlewares, return null\n if (allMiddlewares.length === 0) {\n return null;\n }\n\n // If there are middlewares, return them\n return { middlewares: allMiddlewares, params };\n }\n}\n\nexport const RouterError = class RouterError extends Error {\n status: number | undefined = 500;\n};\n\ntype RouteParams = string | Middleware | Router | (string | Middleware | Router | RouteParams)[];\n\nexport class Router {\n private routeTree = new RouteTree();\n container: Element | string | null = null;\n query: Record<string, string | number> = {};\n options: Record<string, any> = {};\n url: string = \"\";\n path: string = \"\";\n params: Record<string, string | number | any> = {};\n matches: string[] = [];\n pathPrefix: string = \"\";\n\n private errorHandlers: Map<number | string | Error | \"generic\", Middlewares> = new Map();\n\n constructor(pathPrefix: string = \"\") {\n this.pathPrefix = pathPrefix;\n }\n\n add(...args: RouteParams[]): Router {\n const flatArgs = flat(args);\n const path = getPathWithoutLastSlash(\n `${this.pathPrefix}${typeof flatArgs[0] === \"string\" ? flatArgs.shift() : \"/.*\"}`\n );\n\n // If the first argument is a Router, add all its routes\n if (flatArgs.length === 1 && flatArgs[0] instanceof Router) {\n const subrouter = flatArgs[0] as Router;\n for (const subroute of subrouter.routes()) {\n const subroutePath = `${path}${subroute}`;\n this.routeTree.addRoute(subroutePath, subrouter.routeTree.findRoute(subroute)!.middlewares || []);\n }\n } else {\n // Verify that no middlewares are added when a subrouter is added\n if (flatArgs.some((item) => item instanceof Router)) {\n throw new RouterError(\"You cannot add middlewares when adding a subrouter.\");\n }\n\n // Verify that all middlewares are functions\n if (flatArgs.some((item) => typeof item !== \"function\")) {\n throw new RouterError(\"All middlewares must be functions.\");\n }\n\n this.routeTree.addRoute(path, flatArgs as Middlewares);\n }\n\n return this;\n }\n\n catch(...args: (number | string | Error | typeof Error | Middleware)[]): Router {\n const condition =\n typeof args[0] === \"number\" || typeof args[0] === \"string\" || args[0].name.includes(\"Error\")\n ? (args.shift() as number | string | Error)\n : \"generic\";\n\n if (typeof condition !== \"number\" && typeof condition !== \"string\" && !condition.name.includes(\"Error\")) {\n throw new RouterError(\"The condition must be a number, string or an instance of Error.\");\n }\n\n // Verify that all middlewares are functions\n if (args.some((item) => typeof item !== \"function\")) {\n throw new RouterError(\"All middlewares must be functions.\");\n }\n\n let handlers = this.errorHandlers.get(condition);\n if (!handlers) {\n handlers = [];\n this.errorHandlers.set(condition, handlers);\n }\n\n handlers.push(...(args as Middlewares));\n return this;\n }\n\n routes(): string[] {\n return this.getAllRoutes(this.routeTree.root, \"\");\n }\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n async go(\n path: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface\n ): Promise<string | void> {\n if (!path) {\n return this.handleError(new RouterError(\"The URL is empty.\"), parentComponent);\n }\n\n if (/%[^0-9A-Fa-f]{2}/.test(path)) {\n return this.handleError(new RouterError(`The URL ${path} is malformed.`));\n }\n\n const constructedPath = getPathWithoutLastSlash(`${this.pathPrefix}${path}`);\n const parts = constructedPath.split(\"?\", 2);\n this.url = constructedPath;\n this.query = parseQuery(parts[1]);\n\n const finalPath = parts[0].replace(/(.+)\\/$/, \"$1\").split(\"#\")[0];\n this.path = path;\n\n let route = this.routeTree.findRoute(finalPath);\n\n if (!route || !route.middlewares) {\n // If the route is not found, search for a wildcard route\n const finalPathParts = finalPath.split(\"/\"); // Divide the path into segments\n\n while (finalPathParts.length > 0) {\n finalPathParts.pop(); // Remove the last segment\n const wildcardRoute = this.routeTree.findRoute(finalPathParts.join(\"/\") + \"/.*\"); // Search for a wildcard route\n if (wildcardRoute) {\n route = wildcardRoute;\n break;\n }\n }\n\n // If no route is found, return a 404 error\n if (!route || !route.middlewares) {\n const error = new RouterError(`The URL ${constructedPath} was not found in the router's registered paths.`);\n (error as any).status = 404;\n return this.handleError(error, parentComponent);\n }\n }\n\n const { middlewares, params } = route;\n this.params = params;\n\n let component = await this.searchComponent(middlewares, parentComponent);\n\n if (component === false) {\n return;\n }\n\n if (!component) {\n return this.handleError(\n new RouterError(`The URL ${constructedPath} did not return a valid component.`),\n parentComponent\n );\n }\n\n if (isComponent(parentComponent) || isVnodeComponent(parentComponent)) {\n const childComponent = isVnodeComponent(component) ? component : v(component as Component, {});\n if (isVnodeComponent(parentComponent)) {\n parentComponent.children.push(childComponent);\n component = parentComponent;\n } else {\n component = v(parentComponent, {}, childComponent) as VnodeComponentInterface;\n }\n }\n\n if (!isNodeJs && window.location.pathname + window.location.search !== constructedPath) {\n window.history.pushState(null, \"\", constructedPath);\n }\n\n if (this.container) {\n return mount(this.container, component);\n }\n }\n\n getOnClickHandler(url: string) {\n return (e: MouseEvent) => {\n if (e.button !== 0 || e.ctrlKey || e.metaKey || e.shiftKey || e.altKey || e.defaultPrevented) {\n return;\n }\n\n if (typeof url === \"string\" && url.length > 0) {\n this.go(url);\n }\n e.preventDefault();\n };\n }\n\n private getAllRoutes(node: RouteNode, prefix: string): string[] {\n const routes: string[] = [];\n\n for (const [key, child] of node.children) {\n // eslint-disable-next-line sonarjs/no-nested-template-literals\n const newPrefix = `${prefix}/${child.isDynamic ? `:${child.paramKey}` : key}`.replace(/\\/$/, \"\");\n if (child.middlewares) {\n routes.push(newPrefix);\n }\n routes.push(...this.getAllRoutes(child, newPrefix));\n }\n\n return routes;\n }\n\n private createRequest(): Request {\n return {\n params: this.params,\n query: this.query,\n url: this.url,\n path: this.path,\n matches: this.matches,\n redirect: (path: string) => this.go(path)\n };\n }\n\n private getErrorConditionMiddlewares(error: any): Middlewares | false {\n // Search first for class and name errors\n for (const [condition, middlewares] of this.errorHandlers) {\n if (\n typeof condition !== \"number\" &&\n typeof condition !== \"string\" &&\n error instanceof (condition as any) &&\n error.name === condition.name\n ) {\n return middlewares;\n }\n }\n\n // then for code errors\n for (const [condition, middlewares] of this.errorHandlers) {\n if (typeof condition === \"number\" && (error.status === condition || error.code === condition)) {\n return middlewares;\n }\n }\n\n // and then for message errors\n for (const [condition, middlewares] of this.errorHandlers) {\n if (typeof condition === \"string\" && (error.name === condition || error.message.includes(condition))) {\n return middlewares;\n }\n }\n\n // If no specific error handler is found, return the generic one\n return this.errorHandlers.get(\"generic\") || false;\n }\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n private async handleError(\n error: Error,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface\n ): Promise<void | string> {\n const request: Request = this.createRequest();\n let component = null;\n const middlewares = this.getErrorConditionMiddlewares(error);\n\n // If no error handler is found, throw the error\n if (middlewares === false) {\n throw error;\n }\n\n let response;\n try {\n for (const middleware of middlewares) {\n response = await middleware(request, error);\n\n // If the response is a component or vnode, return it for rendering\n if (response !== undefined && (isComponent(response) || isVnodeComponent(response))) {\n component = response;\n break;\n }\n\n // If the response is false, stop the middleware chain\n if (response === false) {\n return;\n }\n }\n } catch (err) {\n // If an error occurs during the error handling, we handle it recursively\n (err as Error).cause = error;\n\n let errorCauseCount = 0;\n while ((err as Error).cause) {\n errorCauseCount++;\n }\n\n if (errorCauseCount > 20) {\n throw new RouterError(\"Too many error causes. Possible circular error handling.\");\n }\n\n return this.handleError(err as Error, parentComponent);\n }\n\n if (component) {\n // If there is an error middleware that returns a component, we return it\n if (isComponent(parentComponent) || isVnodeComponent(parentComponent)) {\n const childComponent = isVnodeComponent(component) ? component : v(component as Component, {});\n if (isVnodeComponent(parentComponent)) {\n parentComponent.children.push(childComponent);\n component = parentComponent;\n } else {\n component = v(parentComponent, {}, childComponent) as VnodeComponentInterface;\n }\n }\n\n // If we are in the browser, we update the URL\n if (!isNodeJs && window.location.pathname + window.location.search !== this.url) {\n window.history.pushState(null, \"\", this.url);\n }\n\n // If there is a container, we mount the component\n if (this.container) {\n return mount(this.container, component);\n }\n }\n\n // If there is no component to render, we throw the error\n throw error;\n }\n\n private async searchComponent(\n middlewares: Middlewares,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface\n ) {\n const request: Request = this.createRequest();\n\n let response;\n\n for (const middleware of middlewares) {\n try {\n response = await middleware(request);\n } catch (error) {\n return this.handleError(error as Error, parentComponent);\n }\n\n // If the response is a component or vnode, return it for rendering\n if (response !== undefined && (isComponent(response) || isVnodeComponent(response))) {\n return response;\n }\n\n // If the response is false, stop the middleware chain\n if (response === false) {\n return false;\n }\n }\n\n return response;\n }\n}\n\nlet localRedirect: RedirectFunction;\n\nexport async function redirect(\n url: string,\n parentComponent?: Component | POJOComponent | VnodeComponentInterface,\n preventPushState = false\n): Promise<string | void> {\n if (!localRedirect) {\n // eslint-disable-next-line no-console\n console.warn(\"Redirect function is not initialized. Please mount the router first.\");\n return;\n }\n return localRedirect(url, parentComponent, preventPushState);\n}\n\nexport function mountRouter(elementContainer: string | any, router: Router): void {\n router.container = elementContainer;\n localRedirect = router.go.bind(router);\n\n if (!isNodeJs) {\n function onPopStateGoToRoute(): void {\n const pathWithoutPrefix = getPathWithoutPrefix(document.location.pathname, router.pathPrefix);\n (router as unknown as Router).go(pathWithoutPrefix);\n }\n window.addEventListener(\"popstate\", onPopStateGoToRoute, false);\n onPopStateGoToRoute();\n }\n\n directive(\"route\", (url: string, vnode: VnodeWithDom): void => {\n setAttribute(\"href\", url, vnode);\n setAttribute(\"onclick\", router.getOnClickHandler(url), vnode);\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["RouterError", "onPopStateGoToRoute"]
|
|
7
7
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(()=>{"use strict";var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,o={};((t,r)=>{for(var n in r)e(t,n,{get:r[n],enumerable:!0})})(o,{Router:()=>h,RouterError:()=>d,mountRouter:()=>p,redirect:()=>f});var s,i=(s=o,((o,s,i,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let l of r(s))n.call(o,l)||l===i||e(o,l,{get:()=>s[l],enumerable:!(a=t(s,l))||a.enumerable});return o})(e({},"__esModule",{value:!0}),s)),a=require("valyrian.js");function l(e){let t=e.replace(/\/$/,"");return""===t&&(t="/"),t}var c,u=class{root={segment:"",children:new Map,isDynamic:!1};addRoute(e,t){const r="/"===e?[e]:e.split("/").filter(Boolean);let n=this.root;for(const e of r){const t=e.startsWith(":"),r=t?":":e;n.children.has(r)||n.children.set(r,{segment:e,children:new Map,isDynamic:t,paramKey:t?e.slice(1):void 0}),n=n.children.get(r)}n.middlewares=t}findRoute(e){const t=l(e),r="/"===t?[t]:t.split("/").filter(Boolean);let n=this.root;const o={},s=[],i=r.length;for(let e=0;e<i&&n;e++){const t=r[e];let i=!1;for(const[e,r]of n.children){if(e===t){n=r,i=!0;break}if(".*"!==t&&":"===e){n=r,o[r.paramKey]=t,i=!0;break}".*"!==e||i||s.push(...r.middlewares||[])}if(!i)return n.children.has(".*")?{middlewares:s,params:o}:null}const a=[...s,...n.middlewares||[]];return 0===a.length?null:{middlewares:a,params:o}}},d=class extends Error{status=500},h=class e{routeTree=new u;container=null;query={};options={};url="";path="";params={};matches=[];pathPrefix="";errorHandlers=new Map;constructor(e=""){this.pathPrefix=e}add(...t){const r=(n=t,Array.isArray(n)?n.flat(1/0):[n]);var n;const o=l(`${this.pathPrefix}${"string"==typeof r[0]?r.shift():"/.*"}`);if(1===r.length&&r[0]instanceof e){const e=r[0];for(const t of e.routes()){const r=`${o}${t}`;this.routeTree.addRoute(r,e.routeTree.findRoute(t).middlewares||[])}}else{if(r.some(t=>t instanceof e))throw new d("You cannot add middlewares when adding a subrouter.");if(r.some(e=>"function"!=typeof e))throw new d("All middlewares must be functions.");this.routeTree.addRoute(o,r)}return this}catch(...e){const t="number"==typeof e[0]||"string"==typeof e[0]||e[0].name.includes("Error")?e.shift():"generic";if("number"!=typeof t&&"string"!=typeof t&&!t.name.includes("Error"))throw new d("The condition must be a number, string or an instance of Error.");if(e.some(e=>"function"!=typeof e))throw new d("All middlewares must be functions.");let r=this.errorHandlers.get(t);return r||(r=[],this.errorHandlers.set(t,r)),r.push(...e),this}routes(){return this.getAllRoutes(this.routeTree.root,"")}async go(e,t){if(!e)return this.handleError(new d("The URL is empty."),t);if(/%[^0-9A-Fa-f]{2}/.test(e))return this.handleError(new d(`The URL ${e} is malformed.`));const r=l(`${this.pathPrefix}${e}`),n=r.split("?",2);this.url=r,this.query=function(e){const t=e?e.split("&"):[],r={};for(const e of t){const[t,n]=e.split("=",2);r[t]=!1===isNaN(Number(n))?Number(n):"true"===n||"false"!==n&&n}return r}(n[1]);const o=n[0].replace(/(.+)\/$/,"$1").split("#")[0];this.path=e;let s=this.routeTree.findRoute(o);if(!s||!s.middlewares){const e=o.split("/");for(;e.length>0;){e.pop();const t=this.routeTree.findRoute(e.join("/")+"/.*");if(t){s=t;break}}if(!s||!s.middlewares){const e=new d(`The URL ${r} was not found in the router's registered paths.`);return e.status=404,this.handleError(e,t)}}const{middlewares:i,params:c}=s;this.params=c;let u=await this.searchComponent(i,t);if(!1!==u){if(!u)return this.handleError(new d(`The URL ${r} did not return a valid component.`),t);if((0,a.isComponent)(t)||(0,a.isVnodeComponent)(t)){const e=(0,a.isVnodeComponent)(u)?u:(0,a.v)(u,{});(0,a.isVnodeComponent)(t)?(t.children.push(e),u=t):u=(0,a.v)(t,{},e)}return a.isNodeJs||window.location.pathname+window.location.search===r||window.history.pushState(null,"",r),this.container?(0,a.mount)(this.container,u):void 0}}getOnClickHandler(e){return t=>{0!==t.button||t.ctrlKey||t.metaKey||t.shiftKey||t.altKey||t.defaultPrevented||("string"==typeof e&&e.length>0&&this.go(e),t.preventDefault())}}getAllRoutes(e,t){const r=[];for(const[n,o]of e.children){const e=`${t}/${o.isDynamic?`:${o.paramKey}`:n}`.replace(/\/$/,"");o.middlewares&&r.push(e),r.push(...this.getAllRoutes(o,e))}return r}createRequest(){return{params:this.params,query:this.query,url:this.url,path:this.path,matches:this.matches,redirect:e=>this.go(e)}}getErrorConditionMiddlewares(e){for(const[t,r]of this.errorHandlers)if("number"!=typeof t&&"string"!=typeof t&&e instanceof t&&e.name===t.name)return r;for(const[t,r]of this.errorHandlers)if("number"==typeof t&&(e.status===t||e.code===t))return r;for(const[t,r]of this.errorHandlers)if("string"==typeof t&&(e.name===t||e.message.includes(t)))return r;return this.errorHandlers.get("generic")||!1}async handleError(e,t){const r=this.createRequest();let n=null;const o=this.getErrorConditionMiddlewares(e);if(!1===o)throw e;let s;try{for(const t of o){if(s=await t(r,e),void 0!==s&&((0,a.isComponent)(s)||(0,a.isVnodeComponent)(s))){n=s;break}if(!1===s)return}}catch(r){r.cause=e;let n=0;for(;r.cause;)n++;if(n>20)throw new d("Too many error causes. Possible circular error handling.");return this.handleError(r,t)}if(n){if((0,a.isComponent)(t)||(0,a.isVnodeComponent)(t)){const e=(0,a.isVnodeComponent)(n)?n:(0,a.v)(n,{});(0,a.isVnodeComponent)(t)?(t.children.push(e),n=t):n=(0,a.v)(t,{},e)}if(a.isNodeJs||window.location.pathname+window.location.search===this.url||window.history.pushState(null,"",this.url),this.container)return(0,a.mount)(this.container,n)}throw e}async searchComponent(e,t){const r=this.createRequest();let n;for(const o of e){try{n=await o(r)}catch(e){return this.handleError(e,t)}if(void 0!==n&&((0,a.isComponent)(n)||(0,a.isVnodeComponent)(n)))return n;if(!1===n)return!1}return n}};async function f(e,t,r=!1){if(c)return c(e,t,r);console.warn("Redirect function is not initialized. Please mount the router first.")}function p(e,t){if(t.container=e,c=t.go.bind(t),!a.isNodeJs){let e=function(){const e=(r=document.location.pathname,n=t.pathPrefix,l(r.replace(new RegExp(`^${n}`),"")));var r,n;t.go(e)};window.addEventListener("popstate",e,!1),e()}(0,a.directive)("route",(e,r)=>{(0,a.setAttribute)("href",e,r),(0,a.setAttribute)("onclick",t.getOnClickHandler(e),r)})}"undefined"!=typeof module?module.exports=i:self.ValyrianRouter=i})();//# sourceMappingURL=index.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyb3V0ZXJfZXhwb3J0cyIsIl9fZXhwb3J0IiwiUm91dGVyIiwiUm91dGVyRXJyb3IiLCJtb3VudFJvdXRlciIsInJlZGlyZWN0IiwiX19FWFBPUlRTX18iLCJpbXBvcnRfdmFseXJpYW4iLCJyZXF1aXJlIiwiZ2V0UGF0aFdpdGhvdXRMYXN0U2xhc2giLCJwYXRoIiwicGF0aFdpdGhvdXRMYXN0U2xhc2giLCJyZXBsYWNlIiwibG9jYWxSZWRpcmVjdCIsIlJvdXRlVHJlZSIsInJvb3QiLCJzZWdtZW50IiwiY2hpbGRyZW4iLCJNYXAiLCJpc0R5bmFtaWMiLCJhZGRSb3V0ZSIsIm1pZGRsZXdhcmVzIiwic2VnbWVudHMiLCJzcGxpdCIsImZpbHRlciIsIkJvb2xlYW4iLCJjdXJyZW50Tm9kZSIsInRoaXMiLCJzdGFydHNXaXRoIiwia2V5IiwiaGFzIiwic2V0IiwicGFyYW1LZXkiLCJzbGljZSIsImdldCIsImZpbmRSb3V0ZSIsInBhcmFtcyIsIndpbGRjYXJkTWlkZGxld2FyZXMiLCJzZWdtZW50c0xlbmd0aCIsImxlbmd0aCIsImkiLCJmb3VuZCIsImNoaWxkIiwicHVzaCIsImFsbE1pZGRsZXdhcmVzIiwiRXJyb3IiLCJzdGF0dXMiLCJfUm91dGVyIiwicm91dGVUcmVlIiwiY29udGFpbmVyIiwicXVlcnkiLCJvcHRpb25zIiwidXJsIiwibWF0Y2hlcyIsInBhdGhQcmVmaXgiLCJlcnJvckhhbmRsZXJzIiwiY29uc3RydWN0b3IiLCJhZGQiLCJhcmdzIiwiZmxhdEFyZ3MiLCJhcnJheSIsIkFycmF5IiwiaXNBcnJheSIsImZsYXQiLCJJbmZpbml0eSIsInNoaWZ0Iiwic3Vicm91dGVyIiwic3Vicm91dGUiLCJyb3V0ZXMiLCJzdWJyb3V0ZVBhdGgiLCJzb21lIiwiaXRlbSIsImNvbmRpdGlvbiIsIm5hbWUiLCJpbmNsdWRlcyIsImhhbmRsZXJzIiwiZ2V0QWxsUm91dGVzIiwiZ28iLCJwYXJlbnRDb21wb25lbnQiLCJoYW5kbGVFcnJvciIsInRlc3QiLCJjb25zdHJ1Y3RlZFBhdGgiLCJwYXJ0cyIsInF1ZXJ5UGFydHMiLCJuYW1lVmFsdWUiLCJ2YWx1ZSIsImlzTmFOIiwiTnVtYmVyIiwicGFyc2VRdWVyeSIsImZpbmFsUGF0aCIsInJvdXRlIiwiZmluYWxQYXRoUGFydHMiLCJwb3AiLCJ3aWxkY2FyZFJvdXRlIiwiam9pbiIsImVycm9yIiwiY29tcG9uZW50Iiwic2VhcmNoQ29tcG9uZW50IiwiaXNDb21wb25lbnQiLCJpc1Zub2RlQ29tcG9uZW50IiwiY2hpbGRDb21wb25lbnQiLCJ2IiwiaXNOb2RlSnMiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsInBhdGhuYW1lIiwic2VhcmNoIiwiaGlzdG9yeSIsInB1c2hTdGF0ZSIsIm1vdW50IiwiZ2V0T25DbGlja0hhbmRsZXIiLCJlIiwiYnV0dG9uIiwiY3RybEtleSIsIm1ldGFLZXkiLCJzaGlmdEtleSIsImFsdEtleSIsImRlZmF1bHRQcmV2ZW50ZWQiLCJwcmV2ZW50RGVmYXVsdCIsIm5vZGUiLCJwcmVmaXgiLCJuZXdQcmVmaXgiLCJjcmVhdGVSZXF1ZXN0IiwiZ2V0RXJyb3JDb25kaXRpb25NaWRkbGV3YXJlcyIsImNvZGUiLCJtZXNzYWdlIiwicmVxdWVzdCIsInJlc3BvbnNlIiwibWlkZGxld2FyZSIsImVyciIsImNhdXNlIiwiZXJyb3JDYXVzZUNvdW50IiwiYXN5bmMiLCJwcmV2ZW50UHVzaFN0YXRlIiwiY29uc29sZSIsIndhcm4iLCJlbGVtZW50Q29udGFpbmVyIiwicm91dGVyIiwiYmluZCIsIm9uUG9wU3RhdGVHb1RvUm91dGUiLCJwYXRoV2l0aG91dFByZWZpeCIsImRvY3VtZW50IiwiUmVnRXhwIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRpcmVjdGl2ZSIsInZub2RlIiwic2V0QXR0cmlidXRlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3JvdXRlci9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBQT0pPQ29tcG9uZW50LFxuICBWbm9kZUNvbXBvbmVudEludGVyZmFjZSxcbiAgVm5vZGVXaXRoRG9tLFxuICBkaXJlY3RpdmUsXG4gIGlzQ29tcG9uZW50LFxuICBpc05vZGVKcyxcbiAgaXNWbm9kZUNvbXBvbmVudCxcbiAgbW91bnQsXG4gIHNldEF0dHJpYnV0ZSxcbiAgdlxufSBmcm9tIFwidmFseXJpYW4uanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0IHtcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgdXJsOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgbWF0Y2hlczogc3RyaW5nW107XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICByZWRpcmVjdDogKHBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCB2b2lkPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNaWRkbGV3YXJlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIChyZXE6IFJlcXVlc3QsIGVycj86IGFueSk6XG4gICAgfCBQcm9taXNlPGFueSB8IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQgfCBWbm9kZUNvbXBvbmVudEludGVyZmFjZT5cbiAgICB8IGFueVxuICAgIHwgQ29tcG9uZW50XG4gICAgfCBQT0pPQ29tcG9uZW50XG4gICAgfCBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbn1cblxuaW50ZXJmYWNlIE1pZGRsZXdhcmVzIGV4dGVuZHMgQXJyYXk8TWlkZGxld2FyZT4ge31cblxuaW50ZXJmYWNlIFJlZGlyZWN0RnVuY3Rpb24ge1xuICAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHBhcmVudENvbXBvbmVudD86IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQgfCBWbm9kZUNvbXBvbmVudEludGVyZmFjZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBwcmV2ZW50UHVzaFN0YXRlPzogYm9vbGVhblxuICApOiBQcm9taXNlPHN0cmluZyB8IHZvaWQ+O1xufVxuXG5mdW5jdGlvbiBmbGF0KGFycmF5OiBhbnkpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyYXkpID8gYXJyYXkuZmxhdChJbmZpbml0eSkgOiBbYXJyYXldO1xufVxuXG5mdW5jdGlvbiBnZXRQYXRoV2l0aG91dFByZWZpeChwYXRoOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiBnZXRQYXRoV2l0aG91dExhc3RTbGFzaChwYXRoLnJlcGxhY2UobmV3IFJlZ0V4cChgXiR7cHJlZml4fWApLCBcIlwiKSk7XG59XG5cbmZ1bmN0aW9uIGdldFBhdGhXaXRob3V0TGFzdFNsYXNoKHBhdGg6IHN0cmluZykge1xuICBsZXQgcGF0aFdpdGhvdXRMYXN0U2xhc2ggPSBwYXRoLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcbiAgaWYgKHBhdGhXaXRob3V0TGFzdFNsYXNoID09PSBcIlwiKSB7XG4gICAgcGF0aFdpdGhvdXRMYXN0U2xhc2ggPSBcIi9cIjtcbiAgfVxuICByZXR1cm4gcGF0aFdpdGhvdXRMYXN0U2xhc2g7XG59XG5cbi8vIFBhcnNlIGEgcXVlcnkgc3RyaW5nIGludG8gYW4gb2JqZWN0XG5mdW5jdGlvbiBwYXJzZVF1ZXJ5KHF1ZXJ5UGFydHM/OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3QgcGFydHMgPSBxdWVyeVBhcnRzID8gcXVlcnlQYXJ0cy5zcGxpdChcIiZcIikgOiBbXTtcbiAgY29uc3QgcXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBmb3IgKGNvbnN0IG5hbWVWYWx1ZSBvZiBwYXJ0cykge1xuICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBuYW1lVmFsdWUuc3BsaXQoXCI9XCIsIDIpO1xuICAgIHF1ZXJ5W25hbWVdID1cbiAgICAgIGlzTmFOKE51bWJlcih2YWx1ZSkpID09PSBmYWxzZSA/IE51bWJlcih2YWx1ZSkgOiB2YWx1ZSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogdmFsdWUgPT09IFwiZmFsc2VcIiA/IGZhbHNlIDogdmFsdWU7XG4gIH1cblxuICByZXR1cm4gcXVlcnk7XG59XG5cbmludGVyZmFjZSBSb3V0ZU5vZGUge1xuICBzZWdtZW50OiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBNYXA8c3RyaW5nLCBSb3V0ZU5vZGU+O1xuICBtaWRkbGV3YXJlcz86IE1pZGRsZXdhcmVzO1xuICBwYXJhbUtleT86IHN0cmluZztcbiAgaXNEeW5hbWljOiBib29sZWFuO1xufVxuXG5jbGFzcyBSb3V0ZVRyZWUge1xuICByb290OiBSb3V0ZU5vZGUgPSB7IHNlZ21lbnQ6IFwiXCIsIGNoaWxkcmVuOiBuZXcgTWFwKCksIGlzRHluYW1pYzogZmFsc2UgfTtcblxuICBhZGRSb3V0ZShwYXRoOiBzdHJpbmcsIG1pZGRsZXdhcmVzOiBNaWRkbGV3YXJlcykge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aCA9PT0gXCIvXCIgPyBbcGF0aF0gOiBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7IC8vIERpdmlkZSB0aGUgcGF0aCBpbnRvIHNlZ21lbnRzXG4gICAgbGV0IGN1cnJlbnROb2RlID0gdGhpcy5yb290O1xuXG4gICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzKSB7XG4gICAgICBjb25zdCBpc0R5bmFtaWMgPSBzZWdtZW50LnN0YXJ0c1dpdGgoXCI6XCIpO1xuICAgICAgY29uc3Qga2V5ID0gaXNEeW5hbWljID8gXCI6XCIgOiBzZWdtZW50OyAvLyBJZiB0aGUgc2VnbWVudCBpcyBkeW5hbWljLCB1c2UgXCI6XCIgYXMga2V5XG5cbiAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW4uaGFzKGtleSkpIHtcbiAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uc2V0KGtleSwge1xuICAgICAgICAgIHNlZ21lbnQ6IHNlZ21lbnQsXG4gICAgICAgICAgY2hpbGRyZW46IG5ldyBNYXAoKSxcbiAgICAgICAgICBpc0R5bmFtaWM6IGlzRHluYW1pYyxcbiAgICAgICAgICBwYXJhbUtleTogaXNEeW5hbWljID8gc2VnbWVudC5zbGljZSgxKSA6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5jaGlsZHJlbi5nZXQoa2V5KSE7XG4gICAgfVxuXG4gICAgY3VycmVudE5vZGUubWlkZGxld2FyZXMgPSBtaWRkbGV3YXJlczsgLy8gQXNzaWduIHRoZSBtaWRkbGV3YXJlcyB0byB0aGUgbGFzdCBub2RlXG4gIH1cblxuICAvLyBTZWFyY2ggZm9yIGEgcm91dGUgaW4gdGhlIHRyZWVcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvY29nbml0aXZlLWNvbXBsZXhpdHlcbiAgZmluZFJvdXRlKHBhdGg6IHN0cmluZyk6IHsgbWlkZGxld2FyZXM/OiBNaWRkbGV3YXJlczsgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0gfCBudWxsIHtcbiAgICBjb25zdCBwYXRoV2l0aG91dExhc3RTbGFzaCA9IGdldFBhdGhXaXRob3V0TGFzdFNsYXNoKHBhdGgpO1xuICAgIGNvbnN0IHNlZ21lbnRzID1cbiAgICAgIHBhdGhXaXRob3V0TGFzdFNsYXNoID09PSBcIi9cIiA/IFtwYXRoV2l0aG91dExhc3RTbGFzaF0gOiBwYXRoV2l0aG91dExhc3RTbGFzaC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBjdXJyZW50Tm9kZTogUm91dGVOb2RlIHwgbnVsbCA9IHRoaXMucm9vdDtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGNvbnN0IHdpbGRjYXJkTWlkZGxld2FyZXM6IE1pZGRsZXdhcmVzID0gW107IC8vIE1pZGRsZXdhcmVzIGZvciB3aWxkY2FyZCByb3V0ZXNcbiAgICBjb25zdCBzZWdtZW50c0xlbmd0aCA9IHNlZ21lbnRzLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHNMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFjdXJyZW50Tm9kZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW2ldO1xuXG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcblxuICAgICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgY3VycmVudE5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKGtleSA9PT0gc2VnbWVudCkge1xuICAgICAgICAgIGN1cnJlbnROb2RlID0gY2hpbGQ7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlZ21lbnQgIT09IFwiLipcIiAmJiBrZXkgPT09IFwiOlwiKSB7XG4gICAgICAgICAgY3VycmVudE5vZGUgPSBjaGlsZDtcbiAgICAgICAgICBwYXJhbXNbY2hpbGQucGFyYW1LZXkhXSA9IHNlZ21lbnQ7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSA9PT0gXCIuKlwiICYmICFmb3VuZCkge1xuICAgICAgICAgIHdpbGRjYXJkTWlkZGxld2FyZXMucHVzaCguLi4oY2hpbGQubWlkZGxld2FyZXMgfHwgW10pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS5jaGlsZHJlbi5oYXMoXCIuKlwiKSkge1xuICAgICAgICAgIHJldHVybiB7IG1pZGRsZXdhcmVzOiB3aWxkY2FyZE1pZGRsZXdhcmVzLCBwYXJhbXMgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIHdpbGRjYXJkIG1pZGRsZXdhcmVzIHRvIHRoZSBjdXJyZW50IG5vZGUgbWlkZGxld2FyZXNcbiAgICBjb25zdCBhbGxNaWRkbGV3YXJlcyA9IFsuLi53aWxkY2FyZE1pZGRsZXdhcmVzLCAuLi4oY3VycmVudE5vZGUubWlkZGxld2FyZXMgfHwgW10pXTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBtaWRkbGV3YXJlcywgcmV0dXJuIG51bGxcbiAgICBpZiAoYWxsTWlkZGxld2FyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgbWlkZGxld2FyZXMsIHJldHVybiB0aGVtXG4gICAgcmV0dXJuIHsgbWlkZGxld2FyZXM6IGFsbE1pZGRsZXdhcmVzLCBwYXJhbXMgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUm91dGVyRXJyb3IgPSBjbGFzcyBSb3V0ZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgc3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQgPSA1MDA7XG59O1xuXG50eXBlIFJvdXRlUGFyYW1zID0gc3RyaW5nIHwgTWlkZGxld2FyZSB8IFJvdXRlciB8IChzdHJpbmcgfCBNaWRkbGV3YXJlIHwgUm91dGVyIHwgUm91dGVQYXJhbXMpW107XG5cbmV4cG9ydCBjbGFzcyBSb3V0ZXIge1xuICBwcml2YXRlIHJvdXRlVHJlZSA9IG5ldyBSb3V0ZVRyZWUoKTtcbiAgY29udGFpbmVyOiBFbGVtZW50IHwgc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+ID0ge307XG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgdXJsOiBzdHJpbmcgPSBcIlwiO1xuICBwYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGFueT4gPSB7fTtcbiAgbWF0Y2hlczogc3RyaW5nW10gPSBbXTtcbiAgcGF0aFByZWZpeDogc3RyaW5nID0gXCJcIjtcblxuICBwcml2YXRlIGVycm9ySGFuZGxlcnM6IE1hcDxudW1iZXIgfCBzdHJpbmcgfCBFcnJvciB8IFwiZ2VuZXJpY1wiLCBNaWRkbGV3YXJlcz4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IocGF0aFByZWZpeDogc3RyaW5nID0gXCJcIikge1xuICAgIHRoaXMucGF0aFByZWZpeCA9IHBhdGhQcmVmaXg7XG4gIH1cblxuICBhZGQoLi4uYXJnczogUm91dGVQYXJhbXNbXSk6IFJvdXRlciB7XG4gICAgY29uc3QgZmxhdEFyZ3MgPSBmbGF0KGFyZ3MpO1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoV2l0aG91dExhc3RTbGFzaChcbiAgICAgIGAke3RoaXMucGF0aFByZWZpeH0ke3R5cGVvZiBmbGF0QXJnc1swXSA9PT0gXCJzdHJpbmdcIiA/IGZsYXRBcmdzLnNoaWZ0KCkgOiBcIi8uKlwifWBcbiAgICApO1xuXG4gICAgLy8gSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgUm91dGVyLCBhZGQgYWxsIGl0cyByb3V0ZXNcbiAgICBpZiAoZmxhdEFyZ3MubGVuZ3RoID09PSAxICYmIGZsYXRBcmdzWzBdIGluc3RhbmNlb2YgUm91dGVyKSB7XG4gICAgICBjb25zdCBzdWJyb3V0ZXIgPSBmbGF0QXJnc1swXSBhcyBSb3V0ZXI7XG4gICAgICBmb3IgKGNvbnN0IHN1YnJvdXRlIG9mIHN1YnJvdXRlci5yb3V0ZXMoKSkge1xuICAgICAgICBjb25zdCBzdWJyb3V0ZVBhdGggPSBgJHtwYXRofSR7c3Vicm91dGV9YDtcbiAgICAgICAgdGhpcy5yb3V0ZVRyZWUuYWRkUm91dGUoc3Vicm91dGVQYXRoLCBzdWJyb3V0ZXIucm91dGVUcmVlLmZpbmRSb3V0ZShzdWJyb3V0ZSkhLm1pZGRsZXdhcmVzIHx8IFtdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVmVyaWZ5IHRoYXQgbm8gbWlkZGxld2FyZXMgYXJlIGFkZGVkIHdoZW4gYSBzdWJyb3V0ZXIgaXMgYWRkZWRcbiAgICAgIGlmIChmbGF0QXJncy5zb21lKChpdGVtKSA9PiBpdGVtIGluc3RhbmNlb2YgUm91dGVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgUm91dGVyRXJyb3IoXCJZb3UgY2Fubm90IGFkZCBtaWRkbGV3YXJlcyB3aGVuIGFkZGluZyBhIHN1YnJvdXRlci5cIik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSB0aGF0IGFsbCBtaWRkbGV3YXJlcyBhcmUgZnVuY3Rpb25zXG4gICAgICBpZiAoZmxhdEFyZ3Muc29tZSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gIT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJvdXRlckVycm9yKFwiQWxsIG1pZGRsZXdhcmVzIG11c3QgYmUgZnVuY3Rpb25zLlwiKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yb3V0ZVRyZWUuYWRkUm91dGUocGF0aCwgZmxhdEFyZ3MgYXMgTWlkZGxld2FyZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY2F0Y2goLi4uYXJnczogKG51bWJlciB8IHN0cmluZyB8IEVycm9yIHwgdHlwZW9mIEVycm9yIHwgTWlkZGxld2FyZSlbXSk6IFJvdXRlciB7XG4gICAgY29uc3QgY29uZGl0aW9uID1cbiAgICAgIHR5cGVvZiBhcmdzWzBdID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiBhcmdzWzBdID09PSBcInN0cmluZ1wiIHx8IGFyZ3NbMF0ubmFtZS5pbmNsdWRlcyhcIkVycm9yXCIpXG4gICAgICAgID8gKGFyZ3Muc2hpZnQoKSBhcyBudW1iZXIgfCBzdHJpbmcgfCBFcnJvcilcbiAgICAgICAgOiBcImdlbmVyaWNcIjtcblxuICAgIGlmICh0eXBlb2YgY29uZGl0aW9uICE9PSBcIm51bWJlclwiICYmIHR5cGVvZiBjb25kaXRpb24gIT09IFwic3RyaW5nXCIgJiYgIWNvbmRpdGlvbi5uYW1lLmluY2x1ZGVzKFwiRXJyb3JcIikpIHtcbiAgICAgIHRocm93IG5ldyBSb3V0ZXJFcnJvcihcIlRoZSBjb25kaXRpb24gbXVzdCBiZSBhIG51bWJlciwgc3RyaW5nIG9yIGFuIGluc3RhbmNlIG9mIEVycm9yLlwiKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgdGhhdCBhbGwgbWlkZGxld2FyZXMgYXJlIGZ1bmN0aW9uc1xuICAgIGlmIChhcmdzLnNvbWUoKGl0ZW0pID0+IHR5cGVvZiBpdGVtICE9PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgUm91dGVyRXJyb3IoXCJBbGwgbWlkZGxld2FyZXMgbXVzdCBiZSBmdW5jdGlvbnMuXCIpO1xuICAgIH1cblxuICAgIGxldCBoYW5kbGVycyA9IHRoaXMuZXJyb3JIYW5kbGVycy5nZXQoY29uZGl0aW9uKTtcbiAgICBpZiAoIWhhbmRsZXJzKSB7XG4gICAgICBoYW5kbGVycyA9IFtdO1xuICAgICAgdGhpcy5lcnJvckhhbmRsZXJzLnNldChjb25kaXRpb24sIGhhbmRsZXJzKTtcbiAgICB9XG5cbiAgICBoYW5kbGVycy5wdXNoKC4uLihhcmdzIGFzIE1pZGRsZXdhcmVzKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByb3V0ZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmdldEFsbFJvdXRlcyh0aGlzLnJvdXRlVHJlZS5yb290LCBcIlwiKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzb25hcmpzL2NvZ25pdGl2ZS1jb21wbGV4aXR5XG4gIGFzeW5jIGdvKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBwYXJlbnRDb21wb25lbnQ/OiBDb21wb25lbnQgfCBQT0pPQ29tcG9uZW50IHwgVm5vZGVDb21wb25lbnRJbnRlcmZhY2VcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCB2b2lkPiB7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvcihuZXcgUm91dGVyRXJyb3IoXCJUaGUgVVJMIGlzIGVtcHR5LlwiKSwgcGFyZW50Q29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBpZiAoLyVbXjAtOUEtRmEtZl17Mn0vLnRlc3QocGF0aCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yKG5ldyBSb3V0ZXJFcnJvcihgVGhlIFVSTCAke3BhdGh9IGlzIG1hbGZvcm1lZC5gKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uc3RydWN0ZWRQYXRoID0gZ2V0UGF0aFdpdGhvdXRMYXN0U2xhc2goYCR7dGhpcy5wYXRoUHJlZml4fSR7cGF0aH1gKTtcbiAgICBjb25zdCBwYXJ0cyA9IGNvbnN0cnVjdGVkUGF0aC5zcGxpdChcIj9cIiwgMik7XG4gICAgdGhpcy51cmwgPSBjb25zdHJ1Y3RlZFBhdGg7XG4gICAgdGhpcy5xdWVyeSA9IHBhcnNlUXVlcnkocGFydHNbMV0pO1xuXG4gICAgY29uc3QgZmluYWxQYXRoID0gcGFydHNbMF0ucmVwbGFjZSgvKC4rKVxcLyQvLCBcIiQxXCIpLnNwbGl0KFwiI1wiKVswXTtcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuXG4gICAgbGV0IHJvdXRlID0gdGhpcy5yb3V0ZVRyZWUuZmluZFJvdXRlKGZpbmFsUGF0aCk7XG5cbiAgICBpZiAoIXJvdXRlIHx8ICFyb3V0ZS5taWRkbGV3YXJlcykge1xuICAgICAgLy8gSWYgdGhlIHJvdXRlIGlzIG5vdCBmb3VuZCwgc2VhcmNoIGZvciBhIHdpbGRjYXJkIHJvdXRlXG4gICAgICBjb25zdCBmaW5hbFBhdGhQYXJ0cyA9IGZpbmFsUGF0aC5zcGxpdChcIi9cIik7IC8vIERpdmlkZSB0aGUgcGF0aCBpbnRvIHNlZ21lbnRzXG5cbiAgICAgIHdoaWxlIChmaW5hbFBhdGhQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZpbmFsUGF0aFBhcnRzLnBvcCgpOyAvLyBSZW1vdmUgdGhlIGxhc3Qgc2VnbWVudFxuICAgICAgICBjb25zdCB3aWxkY2FyZFJvdXRlID0gdGhpcy5yb3V0ZVRyZWUuZmluZFJvdXRlKGZpbmFsUGF0aFBhcnRzLmpvaW4oXCIvXCIpICsgXCIvLipcIik7IC8vIFNlYXJjaCBmb3IgYSB3aWxkY2FyZCByb3V0ZVxuICAgICAgICBpZiAod2lsZGNhcmRSb3V0ZSkge1xuICAgICAgICAgIHJvdXRlID0gd2lsZGNhcmRSb3V0ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyByb3V0ZSBpcyBmb3VuZCwgcmV0dXJuIGEgNDA0IGVycm9yXG4gICAgICBpZiAoIXJvdXRlIHx8ICFyb3V0ZS5taWRkbGV3YXJlcykge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBSb3V0ZXJFcnJvcihgVGhlIFVSTCAke2NvbnN0cnVjdGVkUGF0aH0gd2FzIG5vdCBmb3VuZCBpbiB0aGUgcm91dGVyJ3MgcmVnaXN0ZXJlZCBwYXRocy5gKTtcbiAgICAgICAgKGVycm9yIGFzIGFueSkuc3RhdHVzID0gNDA0O1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvcihlcnJvciwgcGFyZW50Q29tcG9uZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7IG1pZGRsZXdhcmVzLCBwYXJhbXMgfSA9IHJvdXRlO1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuXG4gICAgbGV0IGNvbXBvbmVudCA9IGF3YWl0IHRoaXMuc2VhcmNoQ29tcG9uZW50KG1pZGRsZXdhcmVzLCBwYXJlbnRDb21wb25lbnQpO1xuXG4gICAgaWYgKGNvbXBvbmVudCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoXG4gICAgICAgIG5ldyBSb3V0ZXJFcnJvcihgVGhlIFVSTCAke2NvbnN0cnVjdGVkUGF0aH0gZGlkIG5vdCByZXR1cm4gYSB2YWxpZCBjb21wb25lbnQuYCksXG4gICAgICAgIHBhcmVudENvbXBvbmVudFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNDb21wb25lbnQocGFyZW50Q29tcG9uZW50KSB8fCBpc1Zub2RlQ29tcG9uZW50KHBhcmVudENvbXBvbmVudCkpIHtcbiAgICAgIGNvbnN0IGNoaWxkQ29tcG9uZW50ID0gaXNWbm9kZUNvbXBvbmVudChjb21wb25lbnQpID8gY29tcG9uZW50IDogdihjb21wb25lbnQgYXMgQ29tcG9uZW50LCB7fSk7XG4gICAgICBpZiAoaXNWbm9kZUNvbXBvbmVudChwYXJlbnRDb21wb25lbnQpKSB7XG4gICAgICAgIHBhcmVudENvbXBvbmVudC5jaGlsZHJlbi5wdXNoKGNoaWxkQ29tcG9uZW50KTtcbiAgICAgICAgY29tcG9uZW50ID0gcGFyZW50Q29tcG9uZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50ID0gdihwYXJlbnRDb21wb25lbnQsIHt9LCBjaGlsZENvbXBvbmVudCkgYXMgVm5vZGVDb21wb25lbnRJbnRlcmZhY2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc05vZGVKcyAmJiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoICE9PSBjb25zdHJ1Y3RlZFBhdGgpIHtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBcIlwiLCBjb25zdHJ1Y3RlZFBhdGgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIG1vdW50KHRoaXMuY29udGFpbmVyLCBjb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIGdldE9uQ2xpY2tIYW5kbGVyKHVybDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gIT09IDAgfHwgZS5jdHJsS2V5IHx8IGUubWV0YUtleSB8fCBlLnNoaWZ0S2V5IHx8IGUuYWx0S2V5IHx8IGUuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdXJsID09PSBcInN0cmluZ1wiICYmIHVybC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZ28odXJsKTtcbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxSb3V0ZXMobm9kZTogUm91dGVOb2RlLCBwcmVmaXg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByb3V0ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc29uYXJqcy9uby1uZXN0ZWQtdGVtcGxhdGUtbGl0ZXJhbHNcbiAgICAgIGNvbnN0IG5ld1ByZWZpeCA9IGAke3ByZWZpeH0vJHtjaGlsZC5pc0R5bmFtaWMgPyBgOiR7Y2hpbGQucGFyYW1LZXl9YCA6IGtleX1gLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcbiAgICAgIGlmIChjaGlsZC5taWRkbGV3YXJlcykge1xuICAgICAgICByb3V0ZXMucHVzaChuZXdQcmVmaXgpO1xuICAgICAgfVxuICAgICAgcm91dGVzLnB1c2goLi4udGhpcy5nZXRBbGxSb3V0ZXMoY2hpbGQsIG5ld1ByZWZpeCkpO1xuICAgIH1cblxuICAgIHJldHVybiByb3V0ZXM7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlcXVlc3QoKTogUmVxdWVzdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICBxdWVyeTogdGhpcy5xdWVyeSxcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICBwYXRoOiB0aGlzLnBhdGgsXG4gICAgICBtYXRjaGVzOiB0aGlzLm1hdGNoZXMsXG4gICAgICByZWRpcmVjdDogKHBhdGg6IHN0cmluZykgPT4gdGhpcy5nbyhwYXRoKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEVycm9yQ29uZGl0aW9uTWlkZGxld2FyZXMoZXJyb3I6IGFueSk6IE1pZGRsZXdhcmVzIHwgZmFsc2Uge1xuICAgIC8vIFNlYXJjaCBmaXJzdCBmb3IgY2xhc3MgYW5kIG5hbWUgZXJyb3JzXG4gICAgZm9yIChjb25zdCBbY29uZGl0aW9uLCBtaWRkbGV3YXJlc10gb2YgdGhpcy5lcnJvckhhbmRsZXJzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBjb25kaXRpb24gIT09IFwibnVtYmVyXCIgJiZcbiAgICAgICAgdHlwZW9mIGNvbmRpdGlvbiAhPT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIChjb25kaXRpb24gYXMgYW55KSAmJlxuICAgICAgICBlcnJvci5uYW1lID09PSBjb25kaXRpb24ubmFtZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBtaWRkbGV3YXJlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0aGVuIGZvciBjb2RlIGVycm9yc1xuICAgIGZvciAoY29uc3QgW2NvbmRpdGlvbiwgbWlkZGxld2FyZXNdIG9mIHRoaXMuZXJyb3JIYW5kbGVycykge1xuICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09IFwibnVtYmVyXCIgJiYgKGVycm9yLnN0YXR1cyA9PT0gY29uZGl0aW9uIHx8IGVycm9yLmNvZGUgPT09IGNvbmRpdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFuZCB0aGVuIGZvciBtZXNzYWdlIGVycm9yc1xuICAgIGZvciAoY29uc3QgW2NvbmRpdGlvbiwgbWlkZGxld2FyZXNdIG9mIHRoaXMuZXJyb3JIYW5kbGVycykge1xuICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09IFwic3RyaW5nXCIgJiYgKGVycm9yLm5hbWUgPT09IGNvbmRpdGlvbiB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKGNvbmRpdGlvbikpKSB7XG4gICAgICAgIHJldHVybiBtaWRkbGV3YXJlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBubyBzcGVjaWZpYyBlcnJvciBoYW5kbGVyIGlzIGZvdW5kLCByZXR1cm4gdGhlIGdlbmVyaWMgb25lXG4gICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVycy5nZXQoXCJnZW5lcmljXCIpIHx8IGZhbHNlO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvY29nbml0aXZlLWNvbXBsZXhpdHlcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVFcnJvcihcbiAgICBlcnJvcjogRXJyb3IsXG4gICAgcGFyZW50Q29tcG9uZW50PzogQ29tcG9uZW50IHwgUE9KT0NvbXBvbmVudCB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlXG4gICk6IFByb21pc2U8dm9pZCB8IHN0cmluZz4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IFJlcXVlc3QgPSB0aGlzLmNyZWF0ZVJlcXVlc3QoKTtcbiAgICBsZXQgY29tcG9uZW50ID0gbnVsbDtcbiAgICBjb25zdCBtaWRkbGV3YXJlcyA9IHRoaXMuZ2V0RXJyb3JDb25kaXRpb25NaWRkbGV3YXJlcyhlcnJvcik7XG5cbiAgICAvLyBJZiBubyBlcnJvciBoYW5kbGVyIGlzIGZvdW5kLCB0aHJvdyB0aGUgZXJyb3JcbiAgICBpZiAobWlkZGxld2FyZXMgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgbWlkZGxld2FyZSBvZiBtaWRkbGV3YXJlcykge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IG1pZGRsZXdhcmUocmVxdWVzdCwgZXJyb3IpO1xuXG4gICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBpcyBhIGNvbXBvbmVudCBvciB2bm9kZSwgcmV0dXJuIGl0IGZvciByZW5kZXJpbmdcbiAgICAgICAgaWYgKHJlc3BvbnNlICE9PSB1bmRlZmluZWQgJiYgKGlzQ29tcG9uZW50KHJlc3BvbnNlKSB8fCBpc1Zub2RlQ29tcG9uZW50KHJlc3BvbnNlKSkpIHtcbiAgICAgICAgICBjb21wb25lbnQgPSByZXNwb25zZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBpcyBmYWxzZSwgc3RvcCB0aGUgbWlkZGxld2FyZSBjaGFpblxuICAgICAgICBpZiAocmVzcG9uc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBlcnJvciBoYW5kbGluZywgd2UgaGFuZGxlIGl0IHJlY3Vyc2l2ZWx5XG4gICAgICAoZXJyIGFzIEVycm9yKS5jYXVzZSA9IGVycm9yO1xuXG4gICAgICBsZXQgZXJyb3JDYXVzZUNvdW50ID0gMDtcbiAgICAgIHdoaWxlICgoZXJyIGFzIEVycm9yKS5jYXVzZSkge1xuICAgICAgICBlcnJvckNhdXNlQ291bnQrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9yQ2F1c2VDb3VudCA+IDIwKSB7XG4gICAgICAgIHRocm93IG5ldyBSb3V0ZXJFcnJvcihcIlRvbyBtYW55IGVycm9yIGNhdXNlcy4gUG9zc2libGUgY2lyY3VsYXIgZXJyb3IgaGFuZGxpbmcuXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvcihlcnIgYXMgRXJyb3IsIHBhcmVudENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gZXJyb3IgbWlkZGxld2FyZSB0aGF0IHJldHVybnMgYSBjb21wb25lbnQsIHdlIHJldHVybiBpdFxuICAgICAgaWYgKGlzQ29tcG9uZW50KHBhcmVudENvbXBvbmVudCkgfHwgaXNWbm9kZUNvbXBvbmVudChwYXJlbnRDb21wb25lbnQpKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkQ29tcG9uZW50ID0gaXNWbm9kZUNvbXBvbmVudChjb21wb25lbnQpID8gY29tcG9uZW50IDogdihjb21wb25lbnQgYXMgQ29tcG9uZW50LCB7fSk7XG4gICAgICAgIGlmIChpc1Zub2RlQ29tcG9uZW50KHBhcmVudENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQuY2hpbGRyZW4ucHVzaChjaGlsZENvbXBvbmVudCk7XG4gICAgICAgICAgY29tcG9uZW50ID0gcGFyZW50Q29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBvbmVudCA9IHYocGFyZW50Q29tcG9uZW50LCB7fSwgY2hpbGRDb21wb25lbnQpIGFzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHdlIGFyZSBpbiB0aGUgYnJvd3Nlciwgd2UgdXBkYXRlIHRoZSBVUkxcbiAgICAgIGlmICghaXNOb2RlSnMgJiYgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCAhPT0gdGhpcy51cmwpIHtcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIFwiXCIsIHRoaXMudXJsKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlcmUgaXMgYSBjb250YWluZXIsIHdlIG1vdW50IHRoZSBjb21wb25lbnRcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICByZXR1cm4gbW91bnQodGhpcy5jb250YWluZXIsIGNvbXBvbmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gY29tcG9uZW50IHRvIHJlbmRlciwgd2UgdGhyb3cgdGhlIGVycm9yXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlYXJjaENvbXBvbmVudChcbiAgICBtaWRkbGV3YXJlczogTWlkZGxld2FyZXMsXG4gICAgcGFyZW50Q29tcG9uZW50PzogQ29tcG9uZW50IHwgUE9KT0NvbXBvbmVudCB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlXG4gICkge1xuICAgIGNvbnN0IHJlcXVlc3Q6IFJlcXVlc3QgPSB0aGlzLmNyZWF0ZVJlcXVlc3QoKTtcblxuICAgIGxldCByZXNwb25zZTtcblxuICAgIGZvciAoY29uc3QgbWlkZGxld2FyZSBvZiBtaWRkbGV3YXJlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBtaWRkbGV3YXJlKHJlcXVlc3QpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IgYXMgRXJyb3IsIHBhcmVudENvbXBvbmVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSByZXNwb25zZSBpcyBhIGNvbXBvbmVudCBvciB2bm9kZSwgcmV0dXJuIGl0IGZvciByZW5kZXJpbmdcbiAgICAgIGlmIChyZXNwb25zZSAhPT0gdW5kZWZpbmVkICYmIChpc0NvbXBvbmVudChyZXNwb25zZSkgfHwgaXNWbm9kZUNvbXBvbmVudChyZXNwb25zZSkpKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHJlc3BvbnNlIGlzIGZhbHNlLCBzdG9wIHRoZSBtaWRkbGV3YXJlIGNoYWluXG4gICAgICBpZiAocmVzcG9uc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cbn1cblxubGV0IGxvY2FsUmVkaXJlY3Q6IFJlZGlyZWN0RnVuY3Rpb247XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWRpcmVjdChcbiAgdXJsOiBzdHJpbmcsXG4gIHBhcmVudENvbXBvbmVudD86IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQgfCBWbm9kZUNvbXBvbmVudEludGVyZmFjZSxcbiAgcHJldmVudFB1c2hTdGF0ZSA9IGZhbHNlXG4pOiBQcm9taXNlPHN0cmluZyB8IHZvaWQ+IHtcbiAgaWYgKCFsb2NhbFJlZGlyZWN0KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oXCJSZWRpcmVjdCBmdW5jdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIFBsZWFzZSBtb3VudCB0aGUgcm91dGVyIGZpcnN0LlwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcmV0dXJuIGxvY2FsUmVkaXJlY3QodXJsLCBwYXJlbnRDb21wb25lbnQsIHByZXZlbnRQdXNoU3RhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW91bnRSb3V0ZXIoZWxlbWVudENvbnRhaW5lcjogc3RyaW5nIHwgYW55LCByb3V0ZXI6IFJvdXRlcik6IHZvaWQge1xuICByb3V0ZXIuY29udGFpbmVyID0gZWxlbWVudENvbnRhaW5lcjtcbiAgbG9jYWxSZWRpcmVjdCA9IHJvdXRlci5nby5iaW5kKHJvdXRlcik7XG5cbiAgaWYgKCFpc05vZGVKcykge1xuICAgIGZ1bmN0aW9uIG9uUG9wU3RhdGVHb1RvUm91dGUoKTogdm9pZCB7XG4gICAgICBjb25zdCBwYXRoV2l0aG91dFByZWZpeCA9IGdldFBhdGhXaXRob3V0UHJlZml4KGRvY3VtZW50LmxvY2F0aW9uLnBhdGhuYW1lLCByb3V0ZXIucGF0aFByZWZpeCk7XG4gICAgICAocm91dGVyIGFzIHVua25vd24gYXMgUm91dGVyKS5nbyhwYXRoV2l0aG91dFByZWZpeCk7XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgb25Qb3BTdGF0ZUdvVG9Sb3V0ZSwgZmFsc2UpO1xuICAgIG9uUG9wU3RhdGVHb1RvUm91dGUoKTtcbiAgfVxuXG4gIGRpcmVjdGl2ZShcInJvdXRlXCIsICh1cmw6IHN0cmluZywgdm5vZGU6IFZub2RlV2l0aERvbSk6IHZvaWQgPT4ge1xuICAgIHNldEF0dHJpYnV0ZShcImhyZWZcIiwgdXJsLCB2bm9kZSk7XG4gICAgc2V0QXR0cmlidXRlKFwib25jbGlja1wiLCByb3V0ZXIuZ2V0T25DbGlja0hhbmRsZXIodXJsKSwgdm5vZGUpO1xuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6ImdKQUFBQSxFQUFBLEcseURBQUFDLENBQUFELEVBQUEsQ0FBQUUsT0FBQSxJQUFBQSxFQUFBQyxZQUFBLElBQUFBLEVBQUFDLFlBQUEsSUFBQUEsRUFBQUMsU0FBQSxJQUFBQSxJQUFBLEksRUFBQUMsRyxFQUFBTixFLDBNQUVBTyxFQVlPQyxRQUFBLGVBMkNQLFNBQVNDLEVBQXdCQyxHQUMvQixJQUFJQyxFQUF1QkQsRUFBS0UsUUFBUSxNQUFPLElBSS9DLE1BSDZCLEtBQXpCRCxJQUNGQSxFQUF1QixLQUVsQkEsQ0FDVCxDQXdCQSxJQXFhSUUsRUFyYUVDLEVBQU4sTUFDRUMsS0FBa0IsQ0FBRUMsUUFBUyxHQUFJQyxTQUFVLElBQUlDLElBQU9DLFdBQVcsR0FFakUsUUFBQUMsQ0FBU1YsRUFBY1csR0FDckIsTUFBTUMsRUFBb0IsTUFBVFosRUFBZSxDQUFDQSxHQUFRQSxFQUFLYSxNQUFNLEtBQUtDLE9BQU9DLFNBQ2hFLElBQUlDLEVBQWNDLEtBQUtaLEtBRXZCLFVBQVdDLEtBQVdNLEVBQVUsQ0FDOUIsTUFBTUgsRUFBWUgsRUFBUVksV0FBVyxLQUMvQkMsRUFBTVYsRUFBWSxJQUFNSCxFQUV6QlUsRUFBWVQsU0FBU2EsSUFBSUQsSUFDNUJILEVBQVlULFNBQVNjLElBQUlGLEVBQUssQ0FDNUJiLFVBQ0FDLFNBQVUsSUFBSUMsSUFDZEMsWUFDQWEsU0FBVWIsRUFBWUgsRUFBUWlCLE1BQU0sUUFBSyxJQUk3Q1AsRUFBY0EsRUFB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
|