@mnaoumov/typescript-dev-toolkit 1.3.0 → 2.0.0

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.
Files changed (174) hide show
  1. package/assets/docs-site/components/ConstructorBlock.astro +16 -0
  2. package/assets/docs-site/components/ImportStatement.astro +12 -0
  3. package/assets/docs-site/components/MemberDetail.astro +101 -0
  4. package/assets/docs-site/components/MethodTable.astro +45 -0
  5. package/assets/docs-site/components/PropertyTable.astro +45 -0
  6. package/assets/docs-site/components/SiteTitle.astro +43 -0
  7. package/assets/docs-site/components/TypeSignature.astro +20 -0
  8. package/assets/docs-site/fonts/inter-latin-400-normal.ttf +0 -0
  9. package/assets/docs-site/fonts/inter-latin-700-normal.ttf +0 -0
  10. package/assets/docs-site/styles/global.css +221 -0
  11. package/dist/lib/cjs/build.cjs +1 -1
  12. package/dist/lib/cjs/build.d.cts +1 -1
  13. package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +2 -2
  14. package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +1 -1
  15. package/dist/lib/cjs/commitlint-spellcheck-header.cjs +2 -2
  16. package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +1 -1
  17. package/dist/lib/cjs/docs-site/api-doc-constants.cjs +171 -0
  18. package/dist/lib/cjs/docs-site/api-doc-constants.d.cts +18 -0
  19. package/dist/lib/cjs/docs-site/api-doc-jsdoc.cjs +414 -0
  20. package/dist/lib/cjs/docs-site/api-doc-jsdoc.d.cts +149 -0
  21. package/dist/lib/cjs/docs-site/api-doc-link-rendering.cjs +377 -0
  22. package/dist/lib/cjs/docs-site/api-doc-link-rendering.d.cts +185 -0
  23. package/dist/lib/cjs/docs-site/api-doc-package-sites.cjs +118 -0
  24. package/dist/lib/cjs/docs-site/api-doc-package-sites.d.cts +36 -0
  25. package/dist/lib/cjs/docs-site/api-doc-page-generation.cjs +561 -0
  26. package/dist/lib/cjs/docs-site/api-doc-page-generation.d.cts +159 -0
  27. package/dist/lib/cjs/docs-site/api-doc-route-segments.cjs +42 -0
  28. package/dist/lib/cjs/docs-site/api-doc-route-segments.d.cts +25 -0
  29. package/dist/lib/cjs/docs-site/api-doc-settings.cjs +47 -0
  30. package/dist/lib/cjs/docs-site/api-doc-settings.d.cts +53 -0
  31. package/dist/lib/cjs/docs-site/api-doc-source-processing.cjs +288 -0
  32. package/dist/lib/cjs/docs-site/api-doc-source-processing.d.cts +75 -0
  33. package/dist/lib/cjs/docs-site/api-doc-text-utils.cjs +281 -0
  34. package/dist/lib/cjs/docs-site/api-doc-text-utils.d.cts +178 -0
  35. package/dist/lib/cjs/docs-site/api-doc-type-merging.cjs +157 -0
  36. package/dist/lib/cjs/docs-site/api-doc-type-merging.d.cts +51 -0
  37. package/dist/lib/cjs/docs-site/api-doc-types.cjs +22 -0
  38. package/dist/lib/cjs/docs-site/api-doc-types.d.cts +157 -0
  39. package/dist/lib/cjs/docs-site/api-docs.cjs +143 -0
  40. package/dist/lib/cjs/docs-site/api-docs.d.cts +34 -0
  41. package/dist/lib/cjs/docs-site/astro-config.cjs +169 -0
  42. package/dist/lib/cjs/docs-site/astro-config.d.cts +23 -0
  43. package/dist/lib/cjs/docs-site/docs-links.cjs +123 -0
  44. package/dist/lib/cjs/docs-site/docs-links.d.cts +32 -0
  45. package/dist/lib/cjs/docs-site/docs-site-assets.cjs +64 -0
  46. package/dist/lib/cjs/docs-site/docs-site-assets.d.cts +23 -0
  47. package/dist/lib/cjs/docs-site/docs-site-commands.cjs +72 -0
  48. package/dist/lib/cjs/docs-site/docs-site-commands.d.cts +29 -0
  49. package/dist/lib/cjs/docs-site/docs-site-config.cjs +122 -0
  50. package/dist/lib/cjs/docs-site/docs-site-config.d.cts +162 -0
  51. package/dist/lib/cjs/docs-site/index.cjs +116 -0
  52. package/dist/lib/cjs/docs-site/index.d.cts +26 -0
  53. package/dist/lib/cjs/docs-site/link-check.cjs +197 -0
  54. package/dist/lib/cjs/docs-site/link-check.d.cts +163 -0
  55. package/dist/lib/cjs/docs-site/og-image-page.cjs +45 -0
  56. package/dist/lib/cjs/docs-site/og-image-page.d.cts +15 -0
  57. package/dist/lib/cjs/docs-site/og-image.cjs +326 -0
  58. package/dist/lib/cjs/docs-site/og-image.d.cts +70 -0
  59. package/dist/lib/cjs/docs-site/og-images.cjs +170 -0
  60. package/dist/lib/cjs/docs-site/og-images.d.cts +41 -0
  61. package/dist/lib/cjs/docs-site/route-data.cjs +47 -0
  62. package/dist/lib/cjs/docs-site/route-data.d.cts +14 -0
  63. package/dist/lib/cjs/docs-site/satteri-github-alerts.cjs +97 -0
  64. package/dist/lib/cjs/docs-site/satteri-github-alerts.d.cts +31 -0
  65. package/dist/lib/cjs/docs-site/satteri-relative-links.cjs +87 -0
  66. package/dist/lib/cjs/docs-site/satteri-relative-links.d.cts +29 -0
  67. package/dist/lib/cjs/docs-site/unrendered-alerts.cjs +51 -0
  68. package/dist/lib/cjs/docs-site/unrendered-alerts.d.cts +38 -0
  69. package/dist/lib/cjs/index.cjs +4 -1
  70. package/dist/lib/cjs/index.d.cts +1 -0
  71. package/dist/lib/cjs/library-build.cjs +1 -1
  72. package/dist/lib/cjs/library-build.d.cts +2 -2
  73. package/dist/lib/cjs/linters/eslint-config.cjs +17 -17
  74. package/dist/lib/cjs/linters/eslint-config.d.cts +1 -7
  75. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +2 -2
  76. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +5 -8
  77. package/dist/lib/cjs/linters/markdownlint.cjs +4 -1
  78. package/dist/lib/cjs/package-manager.cjs +2 -2
  79. package/dist/lib/esm/build.d.mts +1 -1
  80. package/dist/lib/esm/build.mjs +1 -1
  81. package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +1 -1
  82. package/dist/lib/esm/commitlint-forbidden-patterns.mjs +2 -2
  83. package/dist/lib/esm/commitlint-spellcheck-header.d.mts +1 -1
  84. package/dist/lib/esm/commitlint-spellcheck-header.mjs +2 -2
  85. package/dist/lib/esm/docs-site/api-doc-constants.d.mts +18 -0
  86. package/dist/lib/esm/docs-site/api-doc-constants.mjs +143 -0
  87. package/dist/lib/esm/docs-site/api-doc-jsdoc.d.mts +149 -0
  88. package/dist/lib/esm/docs-site/api-doc-jsdoc.mjs +377 -0
  89. package/dist/lib/esm/docs-site/api-doc-link-rendering.d.mts +185 -0
  90. package/dist/lib/esm/docs-site/api-doc-link-rendering.mjs +356 -0
  91. package/dist/lib/esm/docs-site/api-doc-package-sites.d.mts +36 -0
  92. package/dist/lib/esm/docs-site/api-doc-package-sites.mjs +91 -0
  93. package/dist/lib/esm/docs-site/api-doc-page-generation.d.mts +159 -0
  94. package/dist/lib/esm/docs-site/api-doc-page-generation.mjs +548 -0
  95. package/dist/lib/esm/docs-site/api-doc-route-segments.d.mts +25 -0
  96. package/dist/lib/esm/docs-site/api-doc-route-segments.mjs +17 -0
  97. package/dist/lib/esm/docs-site/api-doc-settings.d.mts +53 -0
  98. package/dist/lib/esm/docs-site/api-doc-settings.mjs +22 -0
  99. package/dist/lib/esm/docs-site/api-doc-source-processing.d.mts +75 -0
  100. package/dist/lib/esm/docs-site/api-doc-source-processing.mjs +274 -0
  101. package/dist/lib/esm/docs-site/api-doc-text-utils.d.mts +178 -0
  102. package/dist/lib/esm/docs-site/api-doc-text-utils.mjs +239 -0
  103. package/dist/lib/esm/docs-site/api-doc-type-merging.d.mts +51 -0
  104. package/dist/lib/esm/docs-site/api-doc-type-merging.mjs +129 -0
  105. package/dist/lib/esm/docs-site/api-doc-types.d.mts +157 -0
  106. package/dist/lib/esm/docs-site/api-doc-types.mjs +6 -0
  107. package/dist/lib/esm/docs-site/api-docs.d.mts +34 -0
  108. package/dist/lib/esm/docs-site/api-docs.mjs +139 -0
  109. package/dist/lib/esm/docs-site/astro-config.d.mts +23 -0
  110. package/dist/lib/esm/docs-site/astro-config.mjs +135 -0
  111. package/dist/lib/esm/docs-site/docs-links.d.mts +32 -0
  112. package/dist/lib/esm/docs-site/docs-links.mjs +113 -0
  113. package/dist/lib/esm/docs-site/docs-site-assets.d.mts +23 -0
  114. package/dist/lib/esm/docs-site/docs-site-assets.mjs +32 -0
  115. package/dist/lib/esm/docs-site/docs-site-commands.d.mts +29 -0
  116. package/dist/lib/esm/docs-site/docs-site-commands.mjs +46 -0
  117. package/dist/lib/esm/docs-site/docs-site-config.d.mts +162 -0
  118. package/dist/lib/esm/docs-site/docs-site-config.mjs +98 -0
  119. package/dist/lib/esm/docs-site/index.d.mts +26 -0
  120. package/dist/lib/esm/docs-site/index.mjs +58 -0
  121. package/dist/lib/esm/docs-site/link-check.d.mts +163 -0
  122. package/dist/lib/esm/docs-site/link-check.mjs +166 -0
  123. package/dist/lib/esm/docs-site/og-image-page.d.mts +15 -0
  124. package/dist/lib/esm/docs-site/og-image-page.mjs +21 -0
  125. package/dist/lib/esm/docs-site/og-image.d.mts +70 -0
  126. package/dist/lib/esm/docs-site/og-image.mjs +292 -0
  127. package/dist/lib/esm/docs-site/og-images.d.mts +41 -0
  128. package/dist/lib/esm/docs-site/og-images.mjs +156 -0
  129. package/dist/lib/esm/docs-site/route-data.d.mts +14 -0
  130. package/dist/lib/esm/docs-site/route-data.mjs +23 -0
  131. package/dist/lib/esm/docs-site/satteri-github-alerts.d.mts +31 -0
  132. package/dist/lib/esm/docs-site/satteri-github-alerts.mjs +72 -0
  133. package/dist/lib/esm/docs-site/satteri-relative-links.d.mts +29 -0
  134. package/dist/lib/esm/docs-site/satteri-relative-links.mjs +63 -0
  135. package/dist/lib/esm/docs-site/unrendered-alerts.d.mts +38 -0
  136. package/dist/lib/esm/docs-site/unrendered-alerts.mjs +26 -0
  137. package/dist/lib/esm/index.d.mts +1 -0
  138. package/dist/lib/esm/index.mjs +3 -1
  139. package/dist/lib/esm/library-build.d.mts +2 -2
  140. package/dist/lib/esm/library-build.mjs +1 -1
  141. package/dist/lib/esm/linters/eslint-config.d.mts +1 -7
  142. package/dist/lib/esm/linters/eslint-config.mjs +17 -17
  143. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +5 -8
  144. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +2 -2
  145. package/dist/lib/esm/linters/markdownlint.mjs +4 -1
  146. package/dist/lib/esm/package-manager.mjs +2 -2
  147. package/docs-site/api-doc-constants/package.json +6 -0
  148. package/docs-site/api-doc-jsdoc/package.json +6 -0
  149. package/docs-site/api-doc-link-rendering/package.json +6 -0
  150. package/docs-site/api-doc-package-sites/package.json +6 -0
  151. package/docs-site/api-doc-page-generation/package.json +6 -0
  152. package/docs-site/api-doc-route-segments/package.json +6 -0
  153. package/docs-site/api-doc-settings/package.json +6 -0
  154. package/docs-site/api-doc-source-processing/package.json +6 -0
  155. package/docs-site/api-doc-text-utils/package.json +6 -0
  156. package/docs-site/api-doc-type-merging/package.json +6 -0
  157. package/docs-site/api-doc-types/package.json +6 -0
  158. package/docs-site/api-docs/package.json +6 -0
  159. package/docs-site/astro-config/package.json +6 -0
  160. package/docs-site/docs-links/package.json +6 -0
  161. package/docs-site/docs-site-assets/package.json +6 -0
  162. package/docs-site/docs-site-commands/package.json +6 -0
  163. package/docs-site/docs-site-config/package.json +6 -0
  164. package/docs-site/index/package.json +6 -0
  165. package/docs-site/link-check/package.json +6 -0
  166. package/docs-site/og-image/package.json +6 -0
  167. package/docs-site/og-image-page/package.json +6 -0
  168. package/docs-site/og-images/package.json +6 -0
  169. package/docs-site/package.json +6 -0
  170. package/docs-site/route-data/package.json +6 -0
  171. package/docs-site/satteri-github-alerts/package.json +6 -0
  172. package/docs-site/satteri-relative-links/package.json +6 -0
  173. package/docs-site/unrendered-alerts/package.json +6 -0
  174. package/package.json +74 -4
@@ -0,0 +1,149 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * JSDoc/declaration extraction: turns ts-morph declarations into the generator's `TypeInfo`/`MemberInfo`.
6
+ */
7
+ import type { ClassDeclaration, ConstructorDeclaration, EnumDeclaration, InterfaceDeclaration, JSDocableNode, MethodDeclaration, MethodSignature, PropertyDeclaration, PropertySignature, SourceFile, TypeAliasDeclaration } from 'ts-morph';
8
+ import type { MemberInfo, ReturnTypeProvider, TypeInfo } from './api-doc-types.mjs';
9
+ /**
10
+ * Extracts a class's model: its constructor, non-private properties and methods, and documentation.
11
+ *
12
+ * @param cls - The class declaration.
13
+ * @param namespace - The type's namespace.
14
+ * @returns The class's model.
15
+ */
16
+ export declare function extractClassInfo(cls: ClassDeclaration, namespace: string): TypeInfo;
17
+ /**
18
+ * Extracts a constructor's model.
19
+ *
20
+ * @param ctor - The constructor declaration.
21
+ * @returns The constructor's model.
22
+ */
23
+ export declare function extractConstructorInfo(ctor: ConstructorDeclaration): MemberInfo;
24
+ /**
25
+ * Extracts an enum's model.
26
+ *
27
+ * @param enumDeclaration - The enum declaration.
28
+ * @param namespace - The type's namespace.
29
+ * @returns The enum's model.
30
+ */
31
+ export declare function extractEnumInfo(enumDeclaration: EnumDeclaration, namespace: string): TypeInfo;
32
+ /**
33
+ * Extract the module-level `@file` description text, if any.
34
+ *
35
+ * @param src - The source file.
36
+ * @returns The overview, or an empty string when the file has no `@file` block.
37
+ */
38
+ export declare function extractFileOverview(src: SourceFile): string;
39
+ /**
40
+ * Extracts an interface's model.
41
+ *
42
+ * @param iface - The interface declaration.
43
+ * @param namespace - The type's namespace.
44
+ * @returns The interface's model.
45
+ */
46
+ export declare function extractInterfaceInfo(iface: InterfaceDeclaration, namespace: string): TypeInfo;
47
+ /**
48
+ * Extracts a class method's model.
49
+ *
50
+ * @param method - The method.
51
+ * @returns The method's model.
52
+ */
53
+ export declare function extractMethodInfo(method: MethodDeclaration): MemberInfo;
54
+ /**
55
+ * Extracts an interface method's model.
56
+ *
57
+ * @param method - The method.
58
+ * @returns The method's model.
59
+ */
60
+ export declare function extractMethodSignatureInfo(method: MethodSignature): MemberInfo;
61
+ /**
62
+ * Extracts a class property's model.
63
+ *
64
+ * @param property - The property.
65
+ * @returns The property's model.
66
+ */
67
+ export declare function extractPropertyInfo(property: PropertyDeclaration): MemberInfo;
68
+ /**
69
+ * Extracts an interface property's model.
70
+ *
71
+ * @param property - The property.
72
+ * @returns The property's model.
73
+ */
74
+ export declare function extractPropertySignatureInfo(property: PropertySignature): MemberInfo;
75
+ /**
76
+ * Extracts a type alias's model.
77
+ *
78
+ * @param alias - The type alias declaration.
79
+ * @param namespace - The type's namespace.
80
+ * @returns The type alias's model.
81
+ */
82
+ export declare function extractTypeAliasInfo(alias: TypeAliasDeclaration, namespace: string): TypeInfo;
83
+ /**
84
+ * Get the return type as declared in source (preserves union order), falling back to resolved type
85
+ *
86
+ * @param method - The method or function.
87
+ * @returns The return type.
88
+ */
89
+ export declare function getDeclaredReturnType(method: ReturnTypeProvider): string;
90
+ /**
91
+ * Extracts the JSDoc description of a node.
92
+ *
93
+ * @param node - The node.
94
+ * @returns The description, or an empty string.
95
+ */
96
+ export declare function getDescription(node: JSDocableNode): string;
97
+ /**
98
+ * Extract
99
+ *
100
+ * @param node - The node.
101
+ * @returns The examples' texts.
102
+ * @example blocks from JSDoc
103
+ */
104
+ export declare function getExamples(node: JSDocableNode): string[];
105
+ /**
106
+ * Extract
107
+ *
108
+ * @param node - The node.
109
+ * @returns Each parameter's name mapped to its description.
110
+ */
111
+ export declare function getParameterDescriptions(node: JSDocableNode): Map<string, string>;
112
+ /**
113
+ * Strip `| undefined` only when it was implicitly added by ts-morph for optional properties
114
+ *
115
+ * @param property - The property.
116
+ * @returns The type text.
117
+ */
118
+ export declare function getPropertyType(property: PropertyDeclaration | PropertySignature): string;
119
+ /**
120
+ * Extract
121
+ *
122
+ * @param node - The node.
123
+ * @returns The remarks, or an empty string.
124
+ * @remarks text from JSDoc
125
+ */
126
+ export declare function getRemarks(node: JSDocableNode): string;
127
+ /**
128
+ * Extract
129
+ *
130
+ * @param node - The node.
131
+ * @returns description from JSDoc
132
+ */
133
+ export declare function getReturnDescription(node: JSDocableNode): string;
134
+ /**
135
+ * Extract the version a JSDoc `since` tag names.
136
+ *
137
+ * @param node - The node.
138
+ * @returns The version, or an empty string.
139
+ */
140
+ export declare function getSince(node: JSDocableNode): string;
141
+ /**
142
+ * Resolve `typeof aliasName` patterns where aliasName is an import alias.
143
+ * E.g., `typeof momentInstance` → `typeof moment` when `import { moment as momentInstance }`.
144
+ *
145
+ * @param typeText - The type text.
146
+ * @param sourceFile - The source file holding the imports.
147
+ * @returns The type text with the original names.
148
+ */
149
+ export declare function resolveTypeofAliases(typeText: string, sourceFile: SourceFile): string;
@@ -0,0 +1,377 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return '/';
11
+ },
12
+ env: {},
13
+ platform: 'android'
14
+ };
15
+
16
+ const existingProcess = globalThis.process;
17
+
18
+ if (!existingProcess) {
19
+ globalThis.process = browserProcess;
20
+ return;
21
+ }
22
+
23
+ if (existingProcess.versions?.node) {
24
+ return;
25
+ }
26
+
27
+ const existingProcessRecord = existingProcess;
28
+
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+
33
+ existingProcessRecord['browser'] = true;
34
+ }
35
+
36
+ ensureBrowserProcess();
37
+ })();
38
+
39
+ import { getMandatoryNamedGroup } from "@mnaoumov/typescript-lib/reg-exp";
40
+ import { Scope } from "ts-morph";
41
+ import {
42
+ computeOverloadKey,
43
+ foldTsDocParagraphs,
44
+ replaceRegExpMatches,
45
+ simplifyType
46
+ } from "./api-doc-text-utils.mjs";
47
+ function extractClassInfo(cls, namespace) {
48
+ const name = cls.getNameOrThrow();
49
+ const constructor = cls.getConstructors().find((c) => c.getScope() !== Scope.Private);
50
+ const extendsClause = cls.getExtends();
51
+ return {
52
+ baseTypes: extendsClause ? [extendsClause.getText()] : [],
53
+ constructorInfo: constructor ? extractConstructorInfo(constructor) : void 0,
54
+ description: getDescription(cls),
55
+ enumMembers: [],
56
+ examples: getExamples(cls),
57
+ implementsTypes: cls.getImplements().map((index) => index.getText()),
58
+ kind: "class",
59
+ methods: cls.getMethods().filter((m) => m.getScope() !== Scope.Private).map((m) => extractMethodInfo(m)),
60
+ name,
61
+ namespace,
62
+ properties: cls.getProperties().filter((p) => p.getScope() !== Scope.Private).map((p) => extractPropertyInfo(p)),
63
+ remarks: getRemarks(cls),
64
+ typeParameters: cls.getTypeParameters().map((tp) => tp.getText())
65
+ };
66
+ }
67
+ function extractConstructorInfo(ctor) {
68
+ const parameterDescriptions = getParameterDescriptions(ctor);
69
+ const params = ctor.getParameters().map((p) => {
70
+ const isOptional = p.isOptional();
71
+ const optionalSuffix = isOptional ? "?" : "";
72
+ return {
73
+ description: parameterDescriptions.get(p.getName()) ?? (isOptional ? "*(Optional)*" : ""),
74
+ name: `${p.getName()}${optionalSuffix}`,
75
+ type: simplifyType(p.getType().getText())
76
+ };
77
+ });
78
+ const parameterString = params.map((p) => `${p.name}: ${p.type}`).join(", ");
79
+ return {
80
+ description: getDescription(ctor),
81
+ examples: getExamples(ctor),
82
+ inheritedFrom: "",
83
+ isStatic: false,
84
+ name: "constructor",
85
+ overloadKey: "constructor",
86
+ parameters: params,
87
+ remarks: getRemarks(ctor),
88
+ returnDescription: "",
89
+ returnType: "",
90
+ signature: `(${parameterString})`,
91
+ since: getSince(ctor),
92
+ type: ""
93
+ };
94
+ }
95
+ function extractEnumInfo(enumDeclaration, namespace) {
96
+ const members = enumDeclaration.getMembers().map((m) => {
97
+ const initializer = m.getInitializer()?.getText() ?? "";
98
+ return {
99
+ description: getDescription(m),
100
+ name: m.getName(),
101
+ value: initializer
102
+ };
103
+ });
104
+ return {
105
+ baseTypes: [],
106
+ description: getDescription(enumDeclaration),
107
+ enumMembers: members,
108
+ examples: getExamples(enumDeclaration),
109
+ implementsTypes: [],
110
+ kind: "enum",
111
+ methods: [],
112
+ name: enumDeclaration.getName(),
113
+ namespace,
114
+ properties: [],
115
+ remarks: getRemarks(enumDeclaration),
116
+ typeParameters: []
117
+ };
118
+ }
119
+ function extractFileOverview(src) {
120
+ const text = src.getFullText();
121
+ const blockMatch = /\/\*\*(?<body>[\s\S]*?)\*\//.exec(text);
122
+ if (!blockMatch) {
123
+ return "";
124
+ }
125
+ const body = getMandatoryNamedGroup(blockMatch, "body");
126
+ if (!/@file\b/.test(body)) {
127
+ return "";
128
+ }
129
+ const stripped = body.split("\n").map((line) => line.replace(/^\s*\*?\s?/, "")).join("\n");
130
+ const afterFileTag = stripped.replace(/[\s\S]*?@file[ \t]*\r?\n?/, "");
131
+ return foldTsDocParagraphs(afterFileTag.trim());
132
+ }
133
+ function extractInterfaceInfo(iface, namespace) {
134
+ return {
135
+ baseTypes: iface.getExtends().map((error) => error.getText()),
136
+ description: getDescription(iface),
137
+ enumMembers: [],
138
+ examples: getExamples(iface),
139
+ implementsTypes: [],
140
+ kind: "interface",
141
+ methods: iface.getMethods().map((m) => extractMethodSignatureInfo(m)),
142
+ name: iface.getName(),
143
+ namespace,
144
+ properties: iface.getProperties().map((p) => extractPropertySignatureInfo(p)),
145
+ remarks: getRemarks(iface),
146
+ typeParameters: iface.getTypeParameters().map((tp) => tp.getText())
147
+ };
148
+ }
149
+ function extractMethodInfo(method) {
150
+ const name = method.getName();
151
+ const parameterDescriptions = getParameterDescriptions(method);
152
+ const params = method.getParameters().map((p) => {
153
+ const isOptional = p.isOptional();
154
+ const optionalSuffix = isOptional ? "?" : "";
155
+ return {
156
+ description: parameterDescriptions.get(p.getName()) ?? (isOptional ? "*(Optional)*" : ""),
157
+ name: `${p.getName()}${optionalSuffix}`,
158
+ type: simplifyType(p.getType().getText())
159
+ };
160
+ });
161
+ const parameterString = params.map((p) => `${p.name}: ${p.type}`).join(", ");
162
+ const info = {
163
+ description: getDescription(method),
164
+ examples: getExamples(method),
165
+ inheritedFrom: "",
166
+ isStatic: method.isStatic(),
167
+ name,
168
+ overloadKey: "",
169
+ parameters: params,
170
+ remarks: getRemarks(method),
171
+ returnDescription: getReturnDescription(method),
172
+ returnType: getDeclaredReturnType(method),
173
+ signature: `${name}(${parameterString})`,
174
+ since: getSince(method),
175
+ type: ""
176
+ };
177
+ info.overloadKey = computeOverloadKey(info);
178
+ return info;
179
+ }
180
+ function extractMethodSignatureInfo(method) {
181
+ const name = method.getName();
182
+ const parameterDescriptions = getParameterDescriptions(method);
183
+ const params = method.getParameters().map((p) => {
184
+ const isOptional = p.isOptional();
185
+ const optionalSuffix = isOptional ? "?" : "";
186
+ return {
187
+ description: parameterDescriptions.get(p.getName()) ?? (isOptional ? "*(Optional)*" : ""),
188
+ name: `${p.getName()}${optionalSuffix}`,
189
+ type: simplifyType(p.getType().getText())
190
+ };
191
+ });
192
+ const parameterString = params.map((p) => `${p.name}: ${p.type}`).join(", ");
193
+ const info = {
194
+ description: getDescription(method),
195
+ examples: getExamples(method),
196
+ inheritedFrom: "",
197
+ isStatic: false,
198
+ name,
199
+ overloadKey: "",
200
+ parameters: params,
201
+ remarks: getRemarks(method),
202
+ returnDescription: getReturnDescription(method),
203
+ returnType: getDeclaredReturnType(method),
204
+ signature: `${name}(${parameterString})`,
205
+ since: getSince(method),
206
+ type: ""
207
+ };
208
+ info.overloadKey = computeOverloadKey(info);
209
+ return info;
210
+ }
211
+ function extractPropertyInfo(property) {
212
+ const name = property.getName();
213
+ const isOptional = property.hasQuestionToken();
214
+ const optionalSuffix = isOptional ? "?" : "";
215
+ return {
216
+ description: getDescription(property),
217
+ examples: getExamples(property),
218
+ inheritedFrom: "",
219
+ isStatic: property.isStatic(),
220
+ name: `${name}${optionalSuffix}`,
221
+ overloadKey: "",
222
+ parameters: [],
223
+ remarks: getRemarks(property),
224
+ returnDescription: "",
225
+ returnType: "",
226
+ signature: `${name}${optionalSuffix}`,
227
+ since: getSince(property),
228
+ type: getPropertyType(property)
229
+ };
230
+ }
231
+ function extractPropertySignatureInfo(property) {
232
+ const name = property.getName();
233
+ const isOptional = property.hasQuestionToken();
234
+ const optionalSuffix = isOptional ? "?" : "";
235
+ return {
236
+ description: getDescription(property),
237
+ examples: getExamples(property),
238
+ inheritedFrom: "",
239
+ isStatic: false,
240
+ name: `${name}${optionalSuffix}`,
241
+ overloadKey: "",
242
+ parameters: [],
243
+ remarks: getRemarks(property),
244
+ returnDescription: "",
245
+ returnType: "",
246
+ signature: `${name}${optionalSuffix}`,
247
+ since: getSince(property),
248
+ type: getPropertyType(property)
249
+ };
250
+ }
251
+ function extractTypeAliasInfo(alias, namespace) {
252
+ return {
253
+ baseTypes: [],
254
+ description: getDescription(alias),
255
+ enumMembers: [],
256
+ examples: getExamples(alias),
257
+ implementsTypes: [],
258
+ kind: "type",
259
+ methods: [],
260
+ name: alias.getName(),
261
+ namespace,
262
+ properties: [],
263
+ remarks: getRemarks(alias),
264
+ typeAliasText: simplifyType(alias.getTypeNodeOrThrow().getText()),
265
+ typeParameters: alias.getTypeParameters().map((tp) => tp.getText())
266
+ };
267
+ }
268
+ function getDeclaredReturnType(method) {
269
+ const annotation = method.getReturnTypeNode?.()?.getText();
270
+ return simplifyType(annotation ?? method.getReturnType().getText());
271
+ }
272
+ function getDescription(node) {
273
+ const lastDoc = node.getJsDocs().at(-1);
274
+ return lastDoc ? foldTsDocParagraphs(lastDoc.getDescription().trim()) : "";
275
+ }
276
+ function getExamples(node) {
277
+ const examples = [];
278
+ for (const doc of node.getJsDocs()) {
279
+ for (const tag of doc.getTags()) {
280
+ if (tag.getTagName() !== "example") {
281
+ continue;
282
+ }
283
+ const text = tag.getCommentText()?.trim() ?? "";
284
+ if (text) {
285
+ examples.push(text);
286
+ }
287
+ }
288
+ }
289
+ return examples;
290
+ }
291
+ function getParameterDescriptions(node) {
292
+ const result = /* @__PURE__ */ new Map();
293
+ const docs = node.getJsDocs();
294
+ for (const doc of docs) {
295
+ for (const tag of doc.getTags()) {
296
+ if (tag.getTagName() !== "param") {
297
+ continue;
298
+ }
299
+ const comment = foldTsDocParagraphs(tag.getCommentText()?.trim().replaceAll(/\s*\*\s*$/g, "").replace(/^-\s*/, "").trim() ?? "");
300
+ const tagText = tag.getText();
301
+ const nameMatch = /@param\s+(?:\{[^}]*\}\s+)?(?<paramName>\w+)/.exec(tagText);
302
+ if (nameMatch) {
303
+ result.set(getMandatoryNamedGroup(nameMatch, "paramName"), comment);
304
+ }
305
+ }
306
+ }
307
+ return result;
308
+ }
309
+ function getPropertyType(property) {
310
+ const typeNode = property.getTypeNode();
311
+ return typeNode ? resolveTypeofAliases(simplifyType(typeNode.getText()), property.getSourceFile()) : simplifyType(property.getType().getText());
312
+ }
313
+ function getRemarks(node) {
314
+ for (const doc of node.getJsDocs()) {
315
+ for (const tag of doc.getTags()) {
316
+ if (tag.getTagName() === "remarks" || tag.getTagName() === "remark") {
317
+ return foldTsDocParagraphs(tag.getCommentText()?.trim().replaceAll(/\s*\*\s*$/g, "").trim() ?? "");
318
+ }
319
+ }
320
+ }
321
+ return "";
322
+ }
323
+ function getReturnDescription(node) {
324
+ for (const doc of node.getJsDocs()) {
325
+ for (const tag of doc.getTags()) {
326
+ if (tag.getTagName() === "returns") {
327
+ return foldTsDocParagraphs(tag.getCommentText()?.trim().replace(/^-\s*/, "").replaceAll(/\s*\*\s*$/g, "").trim() ?? "");
328
+ }
329
+ }
330
+ }
331
+ return "";
332
+ }
333
+ function getSince(node) {
334
+ for (const doc of node.getJsDocs()) {
335
+ for (const tag of doc.getTags()) {
336
+ if (tag.getTagName() === "since") {
337
+ return tag.getCommentText()?.trim().replaceAll(/\s*\*\s*$/g, "").trim() ?? "";
338
+ }
339
+ }
340
+ }
341
+ return "";
342
+ }
343
+ function resolveTypeofAliases(typeText, sourceFile) {
344
+ return replaceRegExpMatches(typeText, /\btypeof (?<alias>[a-zA-Z][a-zA-Z0-9]*)\b/g, (match) => {
345
+ const alias = getMandatoryNamedGroup(match, "alias");
346
+ for (const importDeclaration of sourceFile.getImportDeclarations()) {
347
+ for (const namedImport of importDeclaration.getNamedImports()) {
348
+ if (namedImport.getAliasNode()?.getText() === alias) {
349
+ return `typeof ${namedImport.getName()}`;
350
+ }
351
+ }
352
+ }
353
+ return match[0];
354
+ });
355
+ }
356
+ export {
357
+ extractClassInfo,
358
+ extractConstructorInfo,
359
+ extractEnumInfo,
360
+ extractFileOverview,
361
+ extractInterfaceInfo,
362
+ extractMethodInfo,
363
+ extractMethodSignatureInfo,
364
+ extractPropertyInfo,
365
+ extractPropertySignatureInfo,
366
+ extractTypeAliasInfo,
367
+ getDeclaredReturnType,
368
+ getDescription,
369
+ getExamples,
370
+ getParameterDescriptions,
371
+ getPropertyType,
372
+ getRemarks,
373
+ getReturnDescription,
374
+ getSince,
375
+ resolveTypeofAliases
376
+ };
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1qc2RvYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogSlNEb2MvZGVjbGFyYXRpb24gZXh0cmFjdGlvbjogdHVybnMgdHMtbW9ycGggZGVjbGFyYXRpb25zIGludG8gdGhlIGdlbmVyYXRvcidzIGBUeXBlSW5mb2AvYE1lbWJlckluZm9gLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ2xhc3NEZWNsYXJhdGlvbixcbiAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbixcbiAgRW51bURlY2xhcmF0aW9uLFxuICBJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgSlNEb2NhYmxlTm9kZSxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE1ldGhvZFNpZ25hdHVyZSxcbiAgUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgUHJvcGVydHlTaWduYXR1cmUsXG4gIFNvdXJjZUZpbGUsXG4gIFR5cGVBbGlhc0RlY2xhcmF0aW9uXG59IGZyb20gJ3RzLW1vcnBoJztcblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEVudW1NZW1iZXJJbmZvLFxuICBNZW1iZXJJbmZvLFxuICBSZXR1cm5UeXBlUHJvdmlkZXIsXG4gIFR5cGVJbmZvXG59IGZyb20gJy4vYXBpLWRvYy10eXBlcy50cyc7XG5cbmltcG9ydCB7XG4gIGNvbXB1dGVPdmVybG9hZEtleSxcbiAgZm9sZFRzRG9jUGFyYWdyYXBocyxcbiAgcmVwbGFjZVJlZ0V4cE1hdGNoZXMsXG4gIHNpbXBsaWZ5VHlwZVxufSBmcm9tICcuL2FwaS1kb2MtdGV4dC11dGlscy50cyc7XG5cbi8qKlxuICogRXh0cmFjdHMgYSBjbGFzcydzIG1vZGVsOiBpdHMgY29uc3RydWN0b3IsIG5vbi1wcml2YXRlIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMsIGFuZCBkb2N1bWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSBjbHMgLSBUaGUgY2xhc3MgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKiBAcmV0dXJucyBUaGUgY2xhc3MncyBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RDbGFzc0luZm8oY2xzOiBDbGFzc0RlY2xhcmF0aW9uLCBuYW1lc3BhY2U6IHN0cmluZyk6IFR5cGVJbmZvIHtcbiAgY29uc3QgbmFtZSA9IGNscy5nZXROYW1lT3JUaHJvdygpO1xuICBjb25zdCBjb25zdHJ1Y3RvciA9IGNscy5nZXRDb25zdHJ1Y3RvcnMoKS5maW5kKChjKSA9PiBjLmdldFNjb3BlKCkgIT09IFNjb3BlLlByaXZhdGUpO1xuICBjb25zdCBleHRlbmRzQ2xhdXNlID0gY2xzLmdldEV4dGVuZHMoKTtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVHlwZXM6IGV4dGVuZHNDbGF1c2UgPyBbZXh0ZW5kc0NsYXVzZS5nZXRUZXh0KCldIDogW10sXG4gICAgY29uc3RydWN0b3JJbmZvOiBjb25zdHJ1Y3RvciA/IGV4dHJhY3RDb25zdHJ1Y3RvckluZm8oY29uc3RydWN0b3IpIDogdW5kZWZpbmVkLFxuICAgIGRlc2NyaXB0aW9uOiBnZXREZXNjcmlwdGlvbihjbHMpLFxuICAgIGVudW1NZW1iZXJzOiBbXSxcbiAgICBleGFtcGxlczogZ2V0RXhhbXBsZXMoY2xzKSxcbiAgICBpbXBsZW1lbnRzVHlwZXM6IGNscy5nZXRJbXBsZW1lbnRzKCkubWFwKChpbmRleCkgPT4gaW5kZXguZ2V0VGV4dCgpKSxcbiAgICBraW5kOiAnY2xhc3MnLFxuICAgIG1ldGhvZHM6IGNscy5nZXRNZXRob2RzKCkuZmlsdGVyKChtKSA9PiBtLmdldFNjb3BlKCkgIT09IFNjb3BlLlByaXZhdGUpLm1hcCgobSkgPT4gZXh0cmFjdE1ldGhvZEluZm8obSkpLFxuICAgIG5hbWUsXG4gICAgbmFtZXNwYWNlLFxuICAgIHByb3BlcnRpZXM6IGNscy5nZXRQcm9wZXJ0aWVzKCkuZmlsdGVyKChwKSA9PiBwLmdldFNjb3BlKCkgIT09IFNjb3BlLlByaXZhdGUpLm1hcCgocCkgPT4gZXh0cmFjdFByb3BlcnR5SW5mbyhwKSksXG4gICAgcmVtYXJrczogZ2V0UmVtYXJrcyhjbHMpLFxuICAgIHR5cGVQYXJhbWV0ZXJzOiBjbHMuZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAoKHRwKSA9PiB0cC5nZXRUZXh0KCkpXG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBjb25zdHJ1Y3RvcidzIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBjdG9yIC0gVGhlIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uLlxuICogQHJldHVybnMgVGhlIGNvbnN0cnVjdG9yJ3MgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q29uc3RydWN0b3JJbmZvKGN0b3I6IENvbnN0cnVjdG9yRGVjbGFyYXRpb24pOiBNZW1iZXJJbmZvIHtcbiAgY29uc3QgcGFyYW1ldGVyRGVzY3JpcHRpb25zID0gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKGN0b3IpO1xuICBjb25zdCBwYXJhbXMgPSBjdG9yLmdldFBhcmFtZXRlcnMoKS5tYXAoKHApID0+IHtcbiAgICBjb25zdCBpc09wdGlvbmFsID0gcC5pc09wdGlvbmFsKCk7XG4gICAgY29uc3Qgb3B0aW9uYWxTdWZmaXggPSBpc09wdGlvbmFsID8gJz8nIDogJyc7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMuZ2V0KHAuZ2V0TmFtZSgpKSA/PyAoaXNPcHRpb25hbCA/ICcqKE9wdGlvbmFsKSonIDogJycpLFxuICAgICAgbmFtZTogYCR7cC5nZXROYW1lKCl9JHtvcHRpb25hbFN1ZmZpeH1gLFxuICAgICAgdHlwZTogc2ltcGxpZnlUeXBlKHAuZ2V0VHlwZSgpLmdldFRleHQoKSlcbiAgICB9O1xuICB9KTtcbiAgY29uc3QgcGFyYW1ldGVyU3RyaW5nID0gcGFyYW1zLm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHtwLnR5cGV9YCkuam9pbignLCAnKTtcbiAgcmV0dXJuIHtcbiAgICBkZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24oY3RvciksXG4gICAgZXhhbXBsZXM6IGdldEV4YW1wbGVzKGN0b3IpLFxuICAgIGluaGVyaXRlZEZyb206ICcnLFxuICAgIGlzU3RhdGljOiBmYWxzZSxcbiAgICBuYW1lOiAnY29uc3RydWN0b3InLFxuICAgIG92ZXJsb2FkS2V5OiAnY29uc3RydWN0b3InLFxuICAgIHBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICByZW1hcmtzOiBnZXRSZW1hcmtzKGN0b3IpLFxuICAgIHJldHVybkRlc2NyaXB0aW9uOiAnJyxcbiAgICByZXR1cm5UeXBlOiAnJyxcbiAgICBzaWduYXR1cmU6IGAoJHtwYXJhbWV0ZXJTdHJpbmd9KWAsXG4gICAgc2luY2U6IGdldFNpbmNlKGN0b3IpLFxuICAgIHR5cGU6ICcnXG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYW4gZW51bSdzIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBlbnVtRGVjbGFyYXRpb24gLSBUaGUgZW51bSBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqIEByZXR1cm5zIFRoZSBlbnVtJ3MgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RW51bUluZm8oZW51bURlY2xhcmF0aW9uOiBFbnVtRGVjbGFyYXRpb24sIG5hbWVzcGFjZTogc3RyaW5nKTogVHlwZUluZm8ge1xuICBjb25zdCBtZW1iZXJzOiBFbnVtTWVtYmVySW5mb1tdID0gZW51bURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKS5tYXAoKG0pID0+IHtcbiAgICBjb25zdCBpbml0aWFsaXplciA9IG0uZ2V0SW5pdGlhbGl6ZXIoKT8uZ2V0VGV4dCgpID8/ICcnO1xuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24obSksXG4gICAgICBuYW1lOiBtLmdldE5hbWUoKSxcbiAgICAgIHZhbHVlOiBpbml0aWFsaXplclxuICAgIH07XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGJhc2VUeXBlczogW10sXG4gICAgZGVzY3JpcHRpb246IGdldERlc2NyaXB0aW9uKGVudW1EZWNsYXJhdGlvbiksXG4gICAgZW51bU1lbWJlcnM6IG1lbWJlcnMsXG4gICAgZXhhbXBsZXM6IGdldEV4YW1wbGVzKGVudW1EZWNsYXJhdGlvbiksXG4gICAgaW1wbGVtZW50c1R5cGVzOiBbXSxcbiAgICBraW5kOiAnZW51bScsXG4gICAgbWV0aG9kczogW10sXG4gICAgbmFtZTogZW51bURlY2xhcmF0aW9uLmdldE5hbWUoKSxcbiAgICBuYW1lc3BhY2UsXG4gICAgcHJvcGVydGllczogW10sXG4gICAgcmVtYXJrczogZ2V0UmVtYXJrcyhlbnVtRGVjbGFyYXRpb24pLFxuICAgIHR5cGVQYXJhbWV0ZXJzOiBbXVxuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdGhlIG1vZHVsZS1sZXZlbCBgQGZpbGVgIGRlc2NyaXB0aW9uIHRleHQsIGlmIGFueS5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHJldHVybnMgVGhlIG92ZXJ2aWV3LCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgZmlsZSBoYXMgbm8gYEBmaWxlYCBibG9jay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RGaWxlT3ZlcnZpZXcoc3JjOiBTb3VyY2VGaWxlKTogc3RyaW5nIHtcbiAgY29uc3QgdGV4dCA9IHNyYy5nZXRGdWxsVGV4dCgpO1xuICBjb25zdCBibG9ja01hdGNoID0gL1xcL1xcKlxcKig/PGJvZHk+W1xcc1xcU10qPylcXCpcXC8vLmV4ZWModGV4dCk7XG4gIGlmICghYmxvY2tNYXRjaCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBib2R5ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChibG9ja01hdGNoLCAnYm9keScpO1xuICBpZiAoIS9AZmlsZVxcYi8udGVzdChib2R5KSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBzdHJpcHBlZCA9IGJvZHlcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4gbGluZS5yZXBsYWNlKC9eXFxzKlxcKj9cXHM/LywgJycpKVxuICAgIC5qb2luKCdcXG4nKTtcbiAgY29uc3QgYWZ0ZXJGaWxlVGFnID0gc3RyaXBwZWQucmVwbGFjZSgvW1xcc1xcU10qP0BmaWxlWyBcXHRdKlxccj9cXG4/LywgJycpO1xuICByZXR1cm4gZm9sZFRzRG9jUGFyYWdyYXBocyhhZnRlckZpbGVUYWcudHJpbSgpKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBhbiBpbnRlcmZhY2UncyBtb2RlbC5cbiAqXG4gKiBAcGFyYW0gaWZhY2UgLSBUaGUgaW50ZXJmYWNlIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSB0eXBlJ3MgbmFtZXNwYWNlLlxuICogQHJldHVybnMgVGhlIGludGVyZmFjZSdzIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEludGVyZmFjZUluZm8oaWZhY2U6IEludGVyZmFjZURlY2xhcmF0aW9uLCBuYW1lc3BhY2U6IHN0cmluZyk6IFR5cGVJbmZvIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVHlwZXM6IGlmYWNlLmdldEV4dGVuZHMoKS5tYXAoKGVycm9yKSA9PiBlcnJvci5nZXRUZXh0KCkpLFxuICAgIGRlc2NyaXB0aW9uOiBnZXREZXNjcmlwdGlvbihpZmFjZSksXG4gICAgZW51bU1lbWJlcnM6IFtdLFxuICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcyhpZmFjZSksXG4gICAgaW1wbGVtZW50c1R5cGVzOiBbXSxcbiAgICBraW5kOiAnaW50ZXJmYWNlJyxcbiAgICBtZXRob2RzOiBpZmFjZS5nZXRNZXRob2RzKCkubWFwKChtKSA9PiBleHRyYWN0TWV0aG9kU2lnbmF0dXJlSW5mbyhtKSksXG4gICAgbmFtZTogaWZhY2UuZ2V0TmFtZSgpLFxuICAgIG5hbWVzcGFjZSxcbiAgICBwcm9wZXJ0aWVzOiBpZmFjZS5nZXRQcm9wZXJ0aWVzKCkubWFwKChwKSA9PiBleHRyYWN0UHJvcGVydHlTaWduYXR1cmVJbmZvKHApKSxcbiAgICByZW1hcmtzOiBnZXRSZW1hcmtzKGlmYWNlKSxcbiAgICB0eXBlUGFyYW1ldGVyczogaWZhY2UuZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAoKHRwKSA9PiB0cC5nZXRUZXh0KCkpXG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBjbGFzcyBtZXRob2QncyBtb2RlbC5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kIC0gVGhlIG1ldGhvZC5cbiAqIEByZXR1cm5zIFRoZSBtZXRob2QncyBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNZXRob2RJbmZvKG1ldGhvZDogTWV0aG9kRGVjbGFyYXRpb24pOiBNZW1iZXJJbmZvIHtcbiAgY29uc3QgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7XG4gIGNvbnN0IHBhcmFtZXRlckRlc2NyaXB0aW9ucyA9IGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucyhtZXRob2QpO1xuICBjb25zdCBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpLm1hcCgocCkgPT4ge1xuICAgIGNvbnN0IGlzT3B0aW9uYWwgPSBwLmlzT3B0aW9uYWwoKTtcbiAgICBjb25zdCBvcHRpb25hbFN1ZmZpeCA9IGlzT3B0aW9uYWwgPyAnPycgOiAnJztcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRpb246IHBhcmFtZXRlckRlc2NyaXB0aW9ucy5nZXQocC5nZXROYW1lKCkpID8/IChpc09wdGlvbmFsID8gJyooT3B0aW9uYWwpKicgOiAnJyksXG4gICAgICBuYW1lOiBgJHtwLmdldE5hbWUoKX0ke29wdGlvbmFsU3VmZml4fWAsXG4gICAgICB0eXBlOiBzaW1wbGlmeVR5cGUocC5nZXRUeXBlKCkuZ2V0VGV4dCgpKVxuICAgIH07XG4gIH0pO1xuICBjb25zdCBwYXJhbWV0ZXJTdHJpbmcgPSBwYXJhbXMubWFwKChwKSA9PiBgJHtwLm5hbWV9OiAke3AudHlwZX1gKS5qb2luKCcsICcpO1xuICBjb25zdCBpbmZvOiBNZW1iZXJJbmZvID0ge1xuICAgIGRlc2NyaXB0aW9uOiBnZXREZXNjcmlwdGlvbihtZXRob2QpLFxuICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcyhtZXRob2QpLFxuICAgIGluaGVyaXRlZEZyb206ICcnLFxuICAgIGlzU3RhdGljOiBtZXRob2QuaXNTdGF0aWMoKSxcbiAgICBuYW1lLFxuICAgIG92ZXJsb2FkS2V5OiAnJyxcbiAgICBwYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgcmVtYXJrczogZ2V0UmVtYXJrcyhtZXRob2QpLFxuICAgIHJldHVybkRlc2NyaXB0aW9uOiBnZXRSZXR1cm5EZXNjcmlwdGlvbihtZXRob2QpLFxuICAgIHJldHVyblR5cGU6IGdldERlY2xhcmVkUmV0dXJuVHlwZShtZXRob2QpLFxuICAgIHNpZ25hdHVyZTogYCR7bmFtZX0oJHtwYXJhbWV0ZXJTdHJpbmd9KWAsXG4gICAgc2luY2U6IGdldFNpbmNlKG1ldGhvZCksXG4gICAgdHlwZTogJydcbiAgfTtcbiAgaW5mby5vdmVybG9hZEtleSA9IGNvbXB1dGVPdmVybG9hZEtleShpbmZvKTtcbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYW4gaW50ZXJmYWNlIG1ldGhvZCdzIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBtZXRob2QgLSBUaGUgbWV0aG9kLlxuICogQHJldHVybnMgVGhlIG1ldGhvZCdzIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1ldGhvZFNpZ25hdHVyZUluZm8obWV0aG9kOiBNZXRob2RTaWduYXR1cmUpOiBNZW1iZXJJbmZvIHtcbiAgY29uc3QgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7XG4gIGNvbnN0IHBhcmFtZXRlckRlc2NyaXB0aW9ucyA9IGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucyhtZXRob2QpO1xuICBjb25zdCBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpLm1hcCgocCkgPT4ge1xuICAgIGNvbnN0IGlzT3B0aW9uYWwgPSBwLmlzT3B0aW9uYWwoKTtcbiAgICBjb25zdCBvcHRpb25hbFN1ZmZpeCA9IGlzT3B0aW9uYWwgPyAnPycgOiAnJztcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRpb246IHBhcmFtZXRlckRlc2NyaXB0aW9ucy5nZXQocC5nZXROYW1lKCkpID8/IChpc09wdGlvbmFsID8gJyooT3B0aW9uYWwpKicgOiAnJyksXG4gICAgICBuYW1lOiBgJHtwLmdldE5hbWUoKX0ke29wdGlvbmFsU3VmZml4fWAsXG4gICAgICB0eXBlOiBzaW1wbGlmeVR5cGUocC5nZXRUeXBlKCkuZ2V0VGV4dCgpKVxuICAgIH07XG4gIH0pO1xuICBjb25zdCBwYXJhbWV0ZXJTdHJpbmcgPSBwYXJhbXMubWFwKChwKSA9PiBgJHtwLm5hbWV9OiAke3AudHlwZX1gKS5qb2luKCcsICcpO1xuICBjb25zdCBpbmZvOiBNZW1iZXJJbmZvID0ge1xuICAgIGRlc2NyaXB0aW9uOiBnZXREZXNjcmlwdGlvbihtZXRob2QpLFxuICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcyhtZXRob2QpLFxuICAgIGluaGVyaXRlZEZyb206ICcnLFxuICAgIGlzU3RhdGljOiBmYWxzZSxcbiAgICBuYW1lLFxuICAgIG92ZXJsb2FkS2V5OiAnJyxcbiAgICBwYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgcmVtYXJrczogZ2V0UmVtYXJrcyhtZXRob2QpLFxuICAgIHJldHVybkRlc2NyaXB0aW9uOiBnZXRSZXR1cm5EZXNjcmlwdGlvbihtZXRob2QpLFxuICAgIHJldHVyblR5cGU6IGdldERlY2xhcmVkUmV0dXJuVHlwZShtZXRob2QpLFxuICAgIHNpZ25hdHVyZTogYCR7bmFtZX0oJHtwYXJhbWV0ZXJTdHJpbmd9KWAsXG4gICAgc2luY2U6IGdldFNpbmNlKG1ldGhvZCksXG4gICAgdHlwZTogJydcbiAgfTtcbiAgaW5mby5vdmVybG9hZEtleSA9IGNvbXB1dGVPdmVybG9hZEtleShpbmZvKTtcbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBjbGFzcyBwcm9wZXJ0eSdzIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0eSdzIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFByb3BlcnR5SW5mbyhwcm9wZXJ0eTogUHJvcGVydHlEZWNsYXJhdGlvbik6IE1lbWJlckluZm8ge1xuICBjb25zdCBuYW1lID0gcHJvcGVydHkuZ2V0TmFtZSgpO1xuICBjb25zdCBpc09wdGlvbmFsID0gcHJvcGVydHkuaGFzUXVlc3Rpb25Ub2tlbigpO1xuICBjb25zdCBvcHRpb25hbFN1ZmZpeCA9IGlzT3B0aW9uYWwgPyAnPycgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBkZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24ocHJvcGVydHkpLFxuICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcyhwcm9wZXJ0eSksXG4gICAgaW5oZXJpdGVkRnJvbTogJycsXG4gICAgaXNTdGF0aWM6IHByb3BlcnR5LmlzU3RhdGljKCksXG4gICAgbmFtZTogYCR7bmFtZX0ke29wdGlvbmFsU3VmZml4fWAsXG4gICAgb3ZlcmxvYWRLZXk6ICcnLFxuICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgIHJlbWFya3M6IGdldFJlbWFya3MocHJvcGVydHkpLFxuICAgIHJldHVybkRlc2NyaXB0aW9uOiAnJyxcbiAgICByZXR1cm5UeXBlOiAnJyxcbiAgICBzaWduYXR1cmU6IGAke25hbWV9JHtvcHRpb25hbFN1ZmZpeH1gLFxuICAgIHNpbmNlOiBnZXRTaW5jZShwcm9wZXJ0eSksXG4gICAgdHlwZTogZ2V0UHJvcGVydHlUeXBlKHByb3BlcnR5KVxuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIGFuIGludGVyZmFjZSBwcm9wZXJ0eSdzIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0eSdzIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFByb3BlcnR5U2lnbmF0dXJlSW5mbyhwcm9wZXJ0eTogUHJvcGVydHlTaWduYXR1cmUpOiBNZW1iZXJJbmZvIHtcbiAgY29uc3QgbmFtZSA9IHByb3BlcnR5LmdldE5hbWUoKTtcbiAgY29uc3QgaXNPcHRpb25hbCA9IHByb3BlcnR5Lmhhc1F1ZXN0aW9uVG9rZW4oKTtcbiAgY29uc3Qgb3B0aW9uYWxTdWZmaXggPSBpc09wdGlvbmFsID8gJz8nIDogJyc7XG4gIHJldHVybiB7XG4gICAgZGVzY3JpcHRpb246IGdldERlc2NyaXB0aW9uKHByb3BlcnR5KSxcbiAgICBleGFtcGxlczogZ2V0RXhhbXBsZXMocHJvcGVydHkpLFxuICAgIGluaGVyaXRlZEZyb206ICcnLFxuICAgIGlzU3RhdGljOiBmYWxzZSxcbiAgICBuYW1lOiBgJHtuYW1lfSR7b3B0aW9uYWxTdWZmaXh9YCxcbiAgICBvdmVybG9hZEtleTogJycsXG4gICAgcGFyYW1ldGVyczogW10sXG4gICAgcmVtYXJrczogZ2V0UmVtYXJrcyhwcm9wZXJ0eSksXG4gICAgcmV0dXJuRGVzY3JpcHRpb246ICcnLFxuICAgIHJldHVyblR5cGU6ICcnLFxuICAgIHNpZ25hdHVyZTogYCR7bmFtZX0ke29wdGlvbmFsU3VmZml4fWAsXG4gICAgc2luY2U6IGdldFNpbmNlKHByb3BlcnR5KSxcbiAgICB0eXBlOiBnZXRQcm9wZXJ0eVR5cGUocHJvcGVydHkpXG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSB0eXBlIGFsaWFzJ3MgbW9kZWwuXG4gKlxuICogQHBhcmFtIGFsaWFzIC0gVGhlIHR5cGUgYWxpYXMgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBhbGlhcydzIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFR5cGVBbGlhc0luZm8oYWxpYXM6IFR5cGVBbGlhc0RlY2xhcmF0aW9uLCBuYW1lc3BhY2U6IHN0cmluZyk6IFR5cGVJbmZvIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVHlwZXM6IFtdLFxuICAgIGRlc2NyaXB0aW9uOiBnZXREZXNjcmlwdGlvbihhbGlhcyksXG4gICAgZW51bU1lbWJlcnM6IFtdLFxuICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcyhhbGlhcyksXG4gICAgaW1wbGVtZW50c1R5cGVzOiBbXSxcbiAgICBraW5kOiAndHlwZScsXG4gICAgbWV0aG9kczogW10sXG4gICAgbmFtZTogYWxpYXMuZ2V0TmFtZSgpLFxuICAgIG5hbWVzcGFjZSxcbiAgICBwcm9wZXJ0aWVzOiBbXSxcbiAgICByZW1hcmtzOiBnZXRSZW1hcmtzKGFsaWFzKSxcbiAgICB0eXBlQWxpYXNUZXh0OiBzaW1wbGlmeVR5cGUoYWxpYXMuZ2V0VHlwZU5vZGVPclRocm93KCkuZ2V0VGV4dCgpKSxcbiAgICB0eXBlUGFyYW1ldGVyczogYWxpYXMuZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAoKHRwKSA9PiB0cC5nZXRUZXh0KCkpXG4gIH07XG59XG5cbi8qKlxuICogR2V0IHRoZSByZXR1cm4gdHlwZSBhcyBkZWNsYXJlZCBpbiBzb3VyY2UgKHByZXNlcnZlcyB1bmlvbiBvcmRlciksIGZhbGxpbmcgYmFjayB0byByZXNvbHZlZCB0eXBlXG4gKlxuICogQHBhcmFtIG1ldGhvZCAtIFRoZSBtZXRob2Qgb3IgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNsYXJlZFJldHVyblR5cGUobWV0aG9kOiBSZXR1cm5UeXBlUHJvdmlkZXIpOiBzdHJpbmcge1xuICBjb25zdCBhbm5vdGF0aW9uID0gbWV0aG9kLmdldFJldHVyblR5cGVOb2RlPy4oKT8uZ2V0VGV4dCgpO1xuICByZXR1cm4gc2ltcGxpZnlUeXBlKGFubm90YXRpb24gPz8gbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRUZXh0KCkpO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBKU0RvYyBkZXNjcmlwdGlvbiBvZiBhIG5vZGUuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZS5cbiAqIEByZXR1cm5zIFRoZSBkZXNjcmlwdGlvbiwgb3IgYW4gZW1wdHkgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24obm9kZTogSlNEb2NhYmxlTm9kZSk6IHN0cmluZyB7XG4gIGNvbnN0IGxhc3REb2MgPSBub2RlLmdldEpzRG9jcygpLmF0KC0xKTtcbiAgcmV0dXJuIGxhc3REb2MgPyBmb2xkVHNEb2NQYXJhZ3JhcGhzKGxhc3REb2MuZ2V0RGVzY3JpcHRpb24oKS50cmltKCkpIDogJyc7XG59XG5cbi8qKlxuICogRXh0cmFjdFxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUuXG4gKiBAcmV0dXJucyBUaGUgZXhhbXBsZXMnIHRleHRzLlxuICogQGV4YW1wbGUgYmxvY2tzIGZyb20gSlNEb2NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4YW1wbGVzKG5vZGU6IEpTRG9jYWJsZU5vZGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4YW1wbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRvYyBvZiBub2RlLmdldEpzRG9jcygpKSB7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgZG9jLmdldFRhZ3MoKSkge1xuICAgICAgaWYgKHRhZy5nZXRUYWdOYW1lKCkgIT09ICdleGFtcGxlJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGV4dCA9IHRhZy5nZXRDb21tZW50VGV4dCgpPy50cmltKCkgPz8gJyc7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICBleGFtcGxlcy5wdXNoKHRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZXhhbXBsZXM7XG59XG5cbi8qKlxuICogRXh0cmFjdFxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUuXG4gKiBAcmV0dXJucyBFYWNoIHBhcmFtZXRlcidzIG5hbWUgbWFwcGVkIHRvIGl0cyBkZXNjcmlwdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucyhub2RlOiBKU0RvY2FibGVOb2RlKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGRvY3MgPSBub2RlLmdldEpzRG9jcygpO1xuICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgZG9jLmdldFRhZ3MoKSkge1xuICAgICAgaWYgKHRhZy5nZXRUYWdOYW1lKCkgIT09ICdwYXJhbScpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbW1lbnQgPSBmb2xkVHNEb2NQYXJhZ3JhcGhzKHRhZy5nZXRDb21tZW50VGV4dCgpPy50cmltKCkucmVwbGFjZUFsbCgvXFxzKlxcKlxccyokL2csICcnKS5yZXBsYWNlKC9eLVxccyovLCAnJykudHJpbSgpID8/ICcnKTtcbiAgICAgIGNvbnN0IHRhZ1RleHQgPSB0YWcuZ2V0VGV4dCgpO1xuICAgICAgY29uc3QgbmFtZU1hdGNoID0gL0BwYXJhbVxccysoPzpcXHtbXn1dKlxcfVxccyspPyg/PHBhcmFtTmFtZT5cXHcrKS8uZXhlYyh0YWdUZXh0KTtcbiAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgcmVzdWx0LnNldChnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG5hbWVNYXRjaCwgJ3BhcmFtTmFtZScpLCBjb21tZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpcCBgfCB1bmRlZmluZWRgIG9ubHkgd2hlbiBpdCB3YXMgaW1wbGljaXRseSBhZGRlZCBieSB0cy1tb3JwaCBmb3Igb3B0aW9uYWwgcHJvcGVydGllc1xuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIFRoZSB0eXBlIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wZXJ0eVR5cGUocHJvcGVydHk6IFByb3BlcnR5RGVjbGFyYXRpb24gfCBQcm9wZXJ0eVNpZ25hdHVyZSk6IHN0cmluZyB7XG4gIGNvbnN0IHR5cGVOb2RlID0gcHJvcGVydHkuZ2V0VHlwZU5vZGUoKTtcbiAgcmV0dXJuIHR5cGVOb2RlID8gcmVzb2x2ZVR5cGVvZkFsaWFzZXMoc2ltcGxpZnlUeXBlKHR5cGVOb2RlLmdldFRleHQoKSksIHByb3BlcnR5LmdldFNvdXJjZUZpbGUoKSkgOiBzaW1wbGlmeVR5cGUocHJvcGVydHkuZ2V0VHlwZSgpLmdldFRleHQoKSk7XG59XG5cbi8qKlxuICogRXh0cmFjdFxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUuXG4gKiBAcmV0dXJucyBUaGUgcmVtYXJrcywgb3IgYW4gZW1wdHkgc3RyaW5nLlxuICogQHJlbWFya3MgdGV4dCBmcm9tIEpTRG9jXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZW1hcmtzKG5vZGU6IEpTRG9jYWJsZU5vZGUpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IGRvYyBvZiBub2RlLmdldEpzRG9jcygpKSB7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgZG9jLmdldFRhZ3MoKSkge1xuICAgICAgaWYgKHRhZy5nZXRUYWdOYW1lKCkgPT09ICdyZW1hcmtzJyB8fCB0YWcuZ2V0VGFnTmFtZSgpID09PSAncmVtYXJrJykge1xuICAgICAgICByZXR1cm4gZm9sZFRzRG9jUGFyYWdyYXBocyh0YWcuZ2V0Q29tbWVudFRleHQoKT8udHJpbSgpLnJlcGxhY2VBbGwoL1xccypcXCpcXHMqJC9nLCAnJykudHJpbSgpID8/ICcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIEV4dHJhY3RcbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlLlxuICogQHJldHVybnMgZGVzY3JpcHRpb24gZnJvbSBKU0RvY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmV0dXJuRGVzY3JpcHRpb24obm9kZTogSlNEb2NhYmxlTm9kZSk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgZG9jIG9mIG5vZGUuZ2V0SnNEb2NzKCkpIHtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBkb2MuZ2V0VGFncygpKSB7XG4gICAgICBpZiAodGFnLmdldFRhZ05hbWUoKSA9PT0gJ3JldHVybnMnKSB7XG4gICAgICAgIHJldHVybiBmb2xkVHNEb2NQYXJhZ3JhcGhzKHRhZy5nZXRDb21tZW50VGV4dCgpPy50cmltKCkucmVwbGFjZSgvXi1cXHMqLywgJycpLnJlcGxhY2VBbGwoL1xccypcXCpcXHMqJC9nLCAnJykudHJpbSgpID8/ICcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdGhlIHZlcnNpb24gYSBKU0RvYyBgc2luY2VgIHRhZyBuYW1lcy5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlLlxuICogQHJldHVybnMgVGhlIHZlcnNpb24sIG9yIGFuIGVtcHR5IHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNpbmNlKG5vZGU6IEpTRG9jYWJsZU5vZGUpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IGRvYyBvZiBub2RlLmdldEpzRG9jcygpKSB7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgZG9jLmdldFRhZ3MoKSkge1xuICAgICAgaWYgKHRhZy5nZXRUYWdOYW1lKCkgPT09ICdzaW5jZScpIHtcbiAgICAgICAgcmV0dXJuIHRhZy5nZXRDb21tZW50VGV4dCgpPy50cmltKCkucmVwbGFjZUFsbCgvXFxzKlxcKlxccyokL2csICcnKS50cmltKCkgPz8gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGB0eXBlb2YgYWxpYXNOYW1lYCBwYXR0ZXJucyB3aGVyZSBhbGlhc05hbWUgaXMgYW4gaW1wb3J0IGFsaWFzLlxuICogRS5nLiwgYHR5cGVvZiBtb21lbnRJbnN0YW5jZWAg4oaSIGB0eXBlb2YgbW9tZW50YCB3aGVuIGBpbXBvcnQgeyBtb21lbnQgYXMgbW9tZW50SW5zdGFuY2UgfWAuXG4gKlxuICogQHBhcmFtIHR5cGVUZXh0IC0gVGhlIHR5cGUgdGV4dC5cbiAqIEBwYXJhbSBzb3VyY2VGaWxlIC0gVGhlIHNvdXJjZSBmaWxlIGhvbGRpbmcgdGhlIGltcG9ydHMuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSB0ZXh0IHdpdGggdGhlIG9yaWdpbmFsIG5hbWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVR5cGVvZkFsaWFzZXModHlwZVRleHQ6IHN0cmluZywgc291cmNlRmlsZTogU291cmNlRmlsZSk6IHN0cmluZyB7XG4gIHJldHVybiByZXBsYWNlUmVnRXhwTWF0Y2hlcyh0eXBlVGV4dCwgL1xcYnR5cGVvZiAoPzxhbGlhcz5bYS16QS1aXVthLXpBLVowLTldKilcXGIvZywgKG1hdGNoKSA9PiB7XG4gICAgY29uc3QgYWxpYXMgPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnYWxpYXMnKTtcbiAgICBmb3IgKGNvbnN0IGltcG9ydERlY2xhcmF0aW9uIG9mIHNvdXJjZUZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCkpIHtcbiAgICAgIGZvciAoY29uc3QgbmFtZWRJbXBvcnQgb2YgaW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZWRJbXBvcnRzKCkpIHtcbiAgICAgICAgaWYgKG5hbWVkSW1wb3J0LmdldEFsaWFzTm9kZSgpPy5nZXRUZXh0KCkgPT09IGFsaWFzKSB7XG4gICAgICAgICAgcmV0dXJuIGB0eXBlb2YgJHtuYW1lZEltcG9ydC5nZXROYW1lKCl9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hbMF07XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLGFBQWE7QUFTdEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQVNBLFNBQVMsaUJBQWlCLEtBQXVCLFdBQTZCO0FBQ25GLFFBQU0sT0FBTyxJQUFJLGVBQWU7QUFDaEMsUUFBTSxjQUFjLElBQUksZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxTQUFTLE1BQU0sTUFBTSxPQUFPO0FBQ3BGLFFBQU0sZ0JBQWdCLElBQUksV0FBVztBQUNyQyxTQUFPO0FBQUEsSUFDTCxXQUFXLGdCQUFnQixDQUFDLGNBQWMsUUFBUSxDQUFDLElBQUksQ0FBQztBQUFBLElBQ3hELGlCQUFpQixjQUFjLHVCQUF1QixXQUFXLElBQUk7QUFBQSxJQUNyRSxhQUFhLGVBQWUsR0FBRztBQUFBLElBQy9CLGFBQWEsQ0FBQztBQUFBLElBQ2QsVUFBVSxZQUFZLEdBQUc7QUFBQSxJQUN6QixpQkFBaUIsSUFBSSxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsTUFBTSxRQUFRLENBQUM7QUFBQSxJQUNuRSxNQUFNO0FBQUEsSUFDTixTQUFTLElBQUksV0FBVyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxNQUFNLE1BQU0sT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLGtCQUFrQixDQUFDLENBQUM7QUFBQSxJQUN2RztBQUFBLElBQ0E7QUFBQSxJQUNBLFlBQVksSUFBSSxjQUFjLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLE1BQU0sTUFBTSxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sb0JBQW9CLENBQUMsQ0FBQztBQUFBLElBQy9HLFNBQVMsV0FBVyxHQUFHO0FBQUEsSUFDdkIsZ0JBQWdCLElBQUksa0JBQWtCLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFBQSxFQUNsRTtBQUNGO0FBUU8sU0FBUyx1QkFBdUIsTUFBMEM7QUFDL0UsUUFBTSx3QkFBd0IseUJBQXlCLElBQUk7QUFDM0QsUUFBTSxTQUFTLEtBQUssY0FBYyxFQUFFLElBQUksQ0FBQyxNQUFNO0FBQzdDLFVBQU0sYUFBYSxFQUFFLFdBQVc7QUFDaEMsVUFBTSxpQkFBaUIsYUFBYSxNQUFNO0FBQzFDLFdBQU87QUFBQSxNQUNMLGFBQWEsc0JBQXNCLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxhQUFhLGlCQUFpQjtBQUFBLE1BQ3RGLE1BQU0sR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLGNBQWM7QUFBQSxNQUNyQyxNQUFNLGFBQWEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO0FBQUEsSUFDMUM7QUFBQSxFQUNGLENBQUM7QUFDRCxRQUFNLGtCQUFrQixPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxJQUFJLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUk7QUFDM0UsU0FBTztBQUFBLElBQ0wsYUFBYSxlQUFlLElBQUk7QUFBQSxJQUNoQyxVQUFVLFlBQVksSUFBSTtBQUFBLElBQzFCLGVBQWU7QUFBQSxJQUNmLFVBQVU7QUFBQSxJQUNWLE1BQU07QUFBQSxJQUNOLGFBQWE7QUFBQSxJQUNiLFlBQVk7QUFBQSxJQUNaLFNBQVMsV0FBVyxJQUFJO0FBQUEsSUFDeEIsbUJBQW1CO0FBQUEsSUFDbkIsWUFBWTtBQUFBLElBQ1osV0FBVyxJQUFJLGVBQWU7QUFBQSxJQUM5QixPQUFPLFNBQVMsSUFBSTtBQUFBLElBQ3BCLE1BQU07QUFBQSxFQUNSO0FBQ0Y7QUFTTyxTQUFTLGdCQUFnQixpQkFBa0MsV0FBNkI7QUFDN0YsUUFBTSxVQUE0QixnQkFBZ0IsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNO0FBQ3hFLFVBQU0sY0FBYyxFQUFFLGVBQWUsR0FBRyxRQUFRLEtBQUs7QUFDckQsV0FBTztBQUFBLE1BQ0wsYUFBYSxlQUFlLENBQUM7QUFBQSxNQUM3QixNQUFNLEVBQUUsUUFBUTtBQUFBLE1BQ2hCLE9BQU87QUFBQSxJQUNUO0FBQUEsRUFDRixDQUFDO0FBQ0QsU0FBTztBQUFBLElBQ0wsV0FBVyxDQUFDO0FBQUEsSUFDWixhQUFhLGVBQWUsZUFBZTtBQUFBLElBQzNDLGFBQWE7QUFBQSxJQUNiLFVBQVUsWUFBWSxlQUFlO0FBQUEsSUFDckMsaUJBQWlCLENBQUM7QUFBQSxJQUNsQixNQUFNO0FBQUEsSUFDTixTQUFTLENBQUM7QUFBQSxJQUNWLE1BQU0sZ0JBQWdCLFFBQVE7QUFBQSxJQUM5QjtBQUFBLElBQ0EsWUFBWSxDQUFDO0FBQUEsSUFDYixTQUFTLFdBQVcsZUFBZTtBQUFBLElBQ25DLGdCQUFnQixDQUFDO0FBQUEsRUFDbkI7QUFDRjtBQVFPLFNBQVMsb0JBQW9CLEtBQXlCO0FBQzNELFFBQU0sT0FBTyxJQUFJLFlBQVk7QUFDN0IsUUFBTSxhQUFhLDhCQUE4QixLQUFLLElBQUk7QUFDMUQsTUFBSSxDQUFDLFlBQVk7QUFDZixXQUFPO0FBQUEsRUFDVDtBQUNBLFFBQU0sT0FBTyx1QkFBdUIsWUFBWSxNQUFNO0FBQ3RELE1BQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxHQUFHO0FBQ3pCLFdBQU87QUFBQSxFQUNUO0FBQ0EsUUFBTSxXQUFXLEtBQ2QsTUFBTSxJQUFJLEVBQ1YsSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLGNBQWMsRUFBRSxDQUFDLEVBQzVDLEtBQUssSUFBSTtBQUNaLFFBQU0sZUFBZSxTQUFTLFFBQVEsNkJBQTZCLEVBQUU7QUFDckUsU0FBTyxvQkFBb0IsYUFBYSxLQUFLLENBQUM7QUFDaEQ7QUFTTyxTQUFTLHFCQUFxQixPQUE2QixXQUE2QjtBQUM3RixTQUFPO0FBQUEsSUFDTCxXQUFXLE1BQU0sV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLE1BQU0sUUFBUSxDQUFDO0FBQUEsSUFDNUQsYUFBYSxlQUFlLEtBQUs7QUFBQSxJQUNqQyxhQUFhLENBQUM7QUFBQSxJQUNkLFVBQVUsWUFBWSxLQUFLO0FBQUEsSUFDM0IsaUJBQWlCLENBQUM7QUFBQSxJQUNsQixNQUFNO0FBQUEsSUFDTixTQUFTLE1BQU0sV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLDJCQUEyQixDQUFDLENBQUM7QUFBQSxJQUNwRSxNQUFNLE1BQU0sUUFBUTtBQUFBLElBQ3BCO0FBQUEsSUFDQSxZQUFZLE1BQU0sY0FBYyxFQUFFLElBQUksQ0FBQyxNQUFNLDZCQUE2QixDQUFDLENBQUM7QUFBQSxJQUM1RSxTQUFTLFdBQVcsS0FBSztBQUFBLElBQ3pCLGdCQUFnQixNQUFNLGtCQUFrQixFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQUEsRUFDcEU7QUFDRjtBQVFPLFNBQVMsa0JBQWtCLFFBQXVDO0FBQ3ZFLFFBQU0sT0FBTyxPQUFPLFFBQVE7QUFDNUIsUUFBTSx3QkFBd0IseUJBQXlCLE1BQU07QUFDN0QsUUFBTSxTQUFTLE9BQU8sY0FBYyxFQUFFLElBQUksQ0FBQyxNQUFNO0FBQy9DLFVBQU0sYUFBYSxFQUFFLFdBQVc7QUFDaEMsVUFBTSxpQkFBaUIsYUFBYSxNQUFNO0FBQzFDLFdBQU87QUFBQSxNQUNMLGFBQWEsc0JBQXNCLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxhQUFhLGlCQUFpQjtBQUFBLE1BQ3RGLE1BQU0sR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLGNBQWM7QUFBQSxNQUNyQyxNQUFNLGFBQWEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO0FBQUEsSUFDMUM7QUFBQSxFQUNGLENBQUM7QUFDRCxRQUFNLGtCQUFrQixPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxJQUFJLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUk7QUFDM0UsUUFBTSxPQUFtQjtBQUFBLElBQ3ZCLGFBQWEsZUFBZSxNQUFNO0FBQUEsSUFDbEMsVUFBVSxZQUFZLE1BQU07QUFBQSxJQUM1QixlQUFlO0FBQUEsSUFDZixVQUFVLE9BQU8sU0FBUztBQUFBLElBQzFCO0FBQUEsSUFDQSxhQUFhO0FBQUEsSUFDYixZQUFZO0FBQUEsSUFDWixTQUFTLFdBQVcsTUFBTTtBQUFBLElBQzFCLG1CQUFtQixxQkFBcUIsTUFBTTtBQUFBLElBQzlDLFlBQVksc0JBQXNCLE1BQU07QUFBQSxJQUN4QyxXQUFXLEdBQUcsSUFBSSxJQUFJLGVBQWU7QUFBQSxJQUNyQyxPQUFPLFNBQVMsTUFBTTtBQUFBLElBQ3RCLE1BQU07QUFBQSxFQUNSO0FBQ0EsT0FBSyxjQUFjLG1CQUFtQixJQUFJO0FBQzFDLFNBQU87QUFDVDtBQVFPLFNBQVMsMkJBQTJCLFFBQXFDO0FBQzlFLFFBQU0sT0FBTyxPQUFPLFFBQVE7QUFDNUIsUUFBTSx3QkFBd0IseUJBQXlCLE1BQU07QUFDN0QsUUFBTSxTQUFTLE9BQU8sY0FBYyxFQUFFLElBQUksQ0FBQyxNQUFNO0FBQy9DLFVBQU0sYUFBYSxFQUFFLFdBQVc7QUFDaEMsVUFBTSxpQkFBaUIsYUFBYSxNQUFNO0FBQzFDLFdBQU87QUFBQSxNQUNMLGFBQWEsc0JBQXNCLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxhQUFhLGlCQUFpQjtBQUFBLE1BQ3RGLE1BQU0sR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLGNBQWM7QUFBQSxNQUNyQyxNQUFNLGFBQWEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO0FBQUEsSUFDMUM7QUFBQSxFQUNGLENBQUM7QUFDRCxRQUFNLGtCQUFrQixPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxJQUFJLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUk7QUFDM0UsUUFBTSxPQUFtQjtBQUFBLElBQ3ZCLGFBQWEsZUFBZSxNQUFNO0FBQUEsSUFDbEMsVUFBVSxZQUFZLE1BQU07QUFBQSxJQUM1QixlQUFlO0FBQUEsSUFDZixVQUFVO0FBQUEsSUFDVjtBQUFBLElBQ0EsYUFBYTtBQUFBLElBQ2IsWUFBWTtBQUFBLElBQ1osU0FBUyxXQUFXLE1BQU07QUFBQSxJQUMxQixtQkFBbUIscUJBQXFCLE1BQU07QUFBQSxJQUM5QyxZQUFZLHNCQUFzQixNQUFNO0FBQUEsSUFDeEMsV0FBVyxHQUFHLElBQUksSUFBSSxlQUFlO0FBQUEsSUFDckMsT0FBTyxTQUFTLE1BQU07QUFBQSxJQUN0QixNQUFNO0FBQUEsRUFDUjtBQUNBLE9BQUssY0FBYyxtQkFBbUIsSUFBSTtBQUMxQyxTQUFPO0FBQ1Q7QUFRTyxTQUFTLG9CQUFvQixVQUEyQztBQUM3RSxRQUFNLE9BQU8sU0FBUyxRQUFRO0FBQzlCLFFBQU0sYUFBYSxTQUFTLGlCQUFpQjtBQUM3QyxRQUFNLGlCQUFpQixhQUFhLE1BQU07QUFDMUMsU0FBTztBQUFBLElBQ0wsYUFBYSxlQUFlLFFBQVE7QUFBQSxJQUNwQyxVQUFVLFlBQVksUUFBUTtBQUFBLElBQzlCLGVBQWU7QUFBQSxJQUNmLFVBQVUsU0FBUyxTQUFTO0FBQUEsSUFDNUIsTUFBTSxHQUFHLElBQUksR0FBRyxjQUFjO0FBQUEsSUFDOUIsYUFBYTtBQUFBLElBQ2IsWUFBWSxDQUFDO0FBQUEsSUFDYixTQUFTLFdBQVcsUUFBUTtBQUFBLElBQzVCLG1CQUFtQjtBQUFBLElBQ25CLFlBQVk7QUFBQSxJQUNaLFdBQVcsR0FBRyxJQUFJLEdBQUcsY0FBYztBQUFBLElBQ25DLE9BQU8sU0FBUyxRQUFRO0FBQUEsSUFDeEIsTUFBTSxnQkFBZ0IsUUFBUTtBQUFBLEVBQ2hDO0FBQ0Y7QUFRTyxTQUFTLDZCQUE2QixVQUF5QztBQUNwRixRQUFNLE9BQU8sU0FBUyxRQUFRO0FBQzlCLFFBQU0sYUFBYSxTQUFTLGlCQUFpQjtBQUM3QyxRQUFNLGlCQUFpQixhQUFhLE1BQU07QUFDMUMsU0FBTztBQUFBLElBQ0wsYUFBYSxlQUFlLFFBQVE7QUFBQSxJQUNwQyxVQUFVLFlBQVksUUFBUTtBQUFBLElBQzlCLGVBQWU7QUFBQSxJQUNmLFVBQVU7QUFBQSxJQUNWLE1BQU0sR0FBRyxJQUFJLEdBQUcsY0FBYztBQUFBLElBQzlCLGFBQWE7QUFBQSxJQUNiLFlBQVksQ0FBQztBQUFBLElBQ2IsU0FBUyxXQUFXLFFBQVE7QUFBQSxJQUM1QixtQkFBbUI7QUFBQSxJQUNuQixZQUFZO0FBQUEsSUFDWixXQUFXLEdBQUcsSUFBSSxHQUFHLGNBQWM7QUFBQSxJQUNuQyxPQUFPLFNBQVMsUUFBUTtBQUFBLElBQ3hCLE1BQU0sZ0JBQWdCLFFBQVE7QUFBQSxFQUNoQztBQUNGO0FBU08sU0FBUyxxQkFBcUIsT0FBNkIsV0FBNkI7QUFDN0YsU0FBTztBQUFBLElBQ0wsV0FBVyxDQUFDO0FBQUEsSUFDWixhQUFhLGVBQWUsS0FBSztBQUFBLElBQ2pDLGFBQWEsQ0FBQztBQUFBLElBQ2QsVUFBVSxZQUFZLEtBQUs7QUFBQSxJQUMzQixpQkFBaUIsQ0FBQztBQUFBLElBQ2xCLE1BQU07QUFBQSxJQUNOLFNBQVMsQ0FBQztBQUFBLElBQ1YsTUFBTSxNQUFNLFFBQVE7QUFBQSxJQUNwQjtBQUFBLElBQ0EsWUFBWSxDQUFDO0FBQUEsSUFDYixTQUFTLFdBQVcsS0FBSztBQUFBLElBQ3pCLGVBQWUsYUFBYSxNQUFNLG1CQUFtQixFQUFFLFFBQVEsQ0FBQztBQUFBLElBQ2hFLGdCQUFnQixNQUFNLGtCQUFrQixFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQUEsRUFDcEU7QUFDRjtBQVFPLFNBQVMsc0JBQXNCLFFBQW9DO0FBQ3hFLFFBQU0sYUFBYSxPQUFPLG9CQUFvQixHQUFHLFFBQVE7QUFDekQsU0FBTyxhQUFhLGNBQWMsT0FBTyxjQUFjLEVBQUUsUUFBUSxDQUFDO0FBQ3BFO0FBUU8sU0FBUyxlQUFlLE1BQTZCO0FBQzFELFFBQU0sVUFBVSxLQUFLLFVBQVUsRUFBRSxHQUFHLEVBQUU7QUFDdEMsU0FBTyxVQUFVLG9CQUFvQixRQUFRLGVBQWUsRUFBRSxLQUFLLENBQUMsSUFBSTtBQUMxRTtBQVNPLFNBQVMsWUFBWSxNQUErQjtBQUN6RCxRQUFNLFdBQXFCLENBQUM7QUFDNUIsYUFBVyxPQUFPLEtBQUssVUFBVSxHQUFHO0FBQ2xDLGVBQVcsT0FBTyxJQUFJLFFBQVEsR0FBRztBQUMvQixVQUFJLElBQUksV0FBVyxNQUFNLFdBQVc7QUFDbEM7QUFBQSxNQUNGO0FBRUEsWUFBTSxPQUFPLElBQUksZUFBZSxHQUFHLEtBQUssS0FBSztBQUM3QyxVQUFJLE1BQU07QUFDUixpQkFBUyxLQUFLLElBQUk7QUFBQSxNQUNwQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBUU8sU0FBUyx5QkFBeUIsTUFBMEM7QUFDakYsUUFBTSxTQUFTLG9CQUFJLElBQW9CO0FBQ3ZDLFFBQU0sT0FBTyxLQUFLLFVBQVU7QUFDNUIsYUFBVyxPQUFPLE1BQU07QUFDdEIsZUFBVyxPQUFPLElBQUksUUFBUSxHQUFHO0FBQy9CLFVBQUksSUFBSSxXQUFXLE1BQU0sU0FBUztBQUNoQztBQUFBLE1BQ0Y7QUFFQSxZQUFNLFVBQVUsb0JBQW9CLElBQUksZUFBZSxHQUFHLEtBQUssRUFBRSxXQUFXLGNBQWMsRUFBRSxFQUFFLFFBQVEsU0FBUyxFQUFFLEVBQUUsS0FBSyxLQUFLLEVBQUU7QUFDL0gsWUFBTSxVQUFVLElBQUksUUFBUTtBQUM1QixZQUFNLFlBQVksOENBQThDLEtBQUssT0FBTztBQUM1RSxVQUFJLFdBQVc7QUFDYixlQUFPLElBQUksdUJBQXVCLFdBQVcsV0FBVyxHQUFHLE9BQU87QUFBQSxNQUNwRTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBUU8sU0FBUyxnQkFBZ0IsVUFBMkQ7QUFDekYsUUFBTSxXQUFXLFNBQVMsWUFBWTtBQUN0QyxTQUFPLFdBQVcscUJBQXFCLGFBQWEsU0FBUyxRQUFRLENBQUMsR0FBRyxTQUFTLGNBQWMsQ0FBQyxJQUFJLGFBQWEsU0FBUyxRQUFRLEVBQUUsUUFBUSxDQUFDO0FBQ2hKO0FBU08sU0FBUyxXQUFXLE1BQTZCO0FBQ3RELGFBQVcsT0FBTyxLQUFLLFVBQVUsR0FBRztBQUNsQyxlQUFXLE9BQU8sSUFBSSxRQUFRLEdBQUc7QUFDL0IsVUFBSSxJQUFJLFdBQVcsTUFBTSxhQUFhLElBQUksV0FBVyxNQUFNLFVBQVU7QUFDbkUsZUFBTyxvQkFBb0IsSUFBSSxlQUFlLEdBQUcsS0FBSyxFQUFFLFdBQVcsY0FBYyxFQUFFLEVBQUUsS0FBSyxLQUFLLEVBQUU7QUFBQSxNQUNuRztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBUU8sU0FBUyxxQkFBcUIsTUFBNkI7QUFDaEUsYUFBVyxPQUFPLEtBQUssVUFBVSxHQUFHO0FBQ2xDLGVBQVcsT0FBTyxJQUFJLFFBQVEsR0FBRztBQUMvQixVQUFJLElBQUksV0FBVyxNQUFNLFdBQVc7QUFDbEMsZUFBTyxvQkFBb0IsSUFBSSxlQUFlLEdBQUcsS0FBSyxFQUFFLFFBQVEsU0FBUyxFQUFFLEVBQUUsV0FBVyxjQUFjLEVBQUUsRUFBRSxLQUFLLEtBQUssRUFBRTtBQUFBLE1BQ3hIO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7QUFRTyxTQUFTLFNBQVMsTUFBNkI7QUFDcEQsYUFBVyxPQUFPLEtBQUssVUFBVSxHQUFHO0FBQ2xDLGVBQVcsT0FBTyxJQUFJLFFBQVEsR0FBRztBQUMvQixVQUFJLElBQUksV0FBVyxNQUFNLFNBQVM7QUFDaEMsZUFBTyxJQUFJLGVBQWUsR0FBRyxLQUFLLEVBQUUsV0FBVyxjQUFjLEVBQUUsRUFBRSxLQUFLLEtBQUs7QUFBQSxNQUM3RTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBVU8sU0FBUyxxQkFBcUIsVUFBa0IsWUFBZ0M7QUFDckYsU0FBTyxxQkFBcUIsVUFBVSw4Q0FBOEMsQ0FBQyxVQUFVO0FBQzdGLFVBQU0sUUFBUSx1QkFBdUIsT0FBTyxPQUFPO0FBQ25ELGVBQVcscUJBQXFCLFdBQVcsc0JBQXNCLEdBQUc7QUFDbEUsaUJBQVcsZUFBZSxrQkFBa0IsZ0JBQWdCLEdBQUc7QUFDN0QsWUFBSSxZQUFZLGFBQWEsR0FBRyxRQUFRLE1BQU0sT0FBTztBQUNuRCxpQkFBTyxVQUFVLFlBQVksUUFBUSxDQUFDO0FBQUEsUUFDeEM7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUNBLFdBQU8sTUFBTSxDQUFDO0FBQUEsRUFDaEIsQ0FBQztBQUNIOyIsIm5hbWVzIjpbXX0=