@hyperfrontend/versioning 0.1.0 → 0.3.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 (167) hide show
  1. package/ARCHITECTURE.md +50 -1
  2. package/CHANGELOG.md +37 -23
  3. package/README.md +19 -14
  4. package/changelog/index.cjs.js +38 -6
  5. package/changelog/index.cjs.js.map +1 -1
  6. package/changelog/index.esm.js +38 -6
  7. package/changelog/index.esm.js.map +1 -1
  8. package/changelog/models/entry.d.ts +5 -0
  9. package/changelog/models/entry.d.ts.map +1 -1
  10. package/changelog/models/index.cjs.js +2 -0
  11. package/changelog/models/index.cjs.js.map +1 -1
  12. package/changelog/models/index.esm.js +2 -0
  13. package/changelog/models/index.esm.js.map +1 -1
  14. package/changelog/operations/index.cjs.js.map +1 -1
  15. package/changelog/operations/index.esm.js.map +1 -1
  16. package/changelog/parse/index.cjs.js +85 -6
  17. package/changelog/parse/index.cjs.js.map +1 -1
  18. package/changelog/parse/index.esm.js +85 -6
  19. package/changelog/parse/index.esm.js.map +1 -1
  20. package/changelog/parse/line.d.ts.map +1 -1
  21. package/changelog/parse/parser.d.ts +0 -6
  22. package/changelog/parse/parser.d.ts.map +1 -1
  23. package/commits/classify/classifier.d.ts +73 -0
  24. package/commits/classify/classifier.d.ts.map +1 -0
  25. package/commits/classify/index.cjs.js +707 -0
  26. package/commits/classify/index.cjs.js.map +1 -0
  27. package/commits/classify/index.d.ts +8 -0
  28. package/commits/classify/index.d.ts.map +1 -0
  29. package/commits/classify/index.esm.js +679 -0
  30. package/commits/classify/index.esm.js.map +1 -0
  31. package/commits/classify/infrastructure.d.ts +205 -0
  32. package/commits/classify/infrastructure.d.ts.map +1 -0
  33. package/commits/classify/models.d.ts +108 -0
  34. package/commits/classify/models.d.ts.map +1 -0
  35. package/commits/classify/project-scopes.d.ts +69 -0
  36. package/commits/classify/project-scopes.d.ts.map +1 -0
  37. package/commits/index.cjs.js +704 -0
  38. package/commits/index.cjs.js.map +1 -1
  39. package/commits/index.d.ts +1 -0
  40. package/commits/index.d.ts.map +1 -1
  41. package/commits/index.esm.js +678 -1
  42. package/commits/index.esm.js.map +1 -1
  43. package/flow/executor/execute.d.ts +6 -0
  44. package/flow/executor/execute.d.ts.map +1 -1
  45. package/flow/executor/index.cjs.js +1617 -43
  46. package/flow/executor/index.cjs.js.map +1 -1
  47. package/flow/executor/index.esm.js +1623 -49
  48. package/flow/executor/index.esm.js.map +1 -1
  49. package/flow/index.cjs.js +6749 -2938
  50. package/flow/index.cjs.js.map +1 -1
  51. package/flow/index.esm.js +6751 -2944
  52. package/flow/index.esm.js.map +1 -1
  53. package/flow/models/index.cjs.js +138 -0
  54. package/flow/models/index.cjs.js.map +1 -1
  55. package/flow/models/index.d.ts +1 -1
  56. package/flow/models/index.d.ts.map +1 -1
  57. package/flow/models/index.esm.js +138 -1
  58. package/flow/models/index.esm.js.map +1 -1
  59. package/flow/models/types.d.ts +180 -3
  60. package/flow/models/types.d.ts.map +1 -1
  61. package/flow/presets/conventional.d.ts +9 -8
  62. package/flow/presets/conventional.d.ts.map +1 -1
  63. package/flow/presets/independent.d.ts.map +1 -1
  64. package/flow/presets/index.cjs.js +3641 -303
  65. package/flow/presets/index.cjs.js.map +1 -1
  66. package/flow/presets/index.esm.js +3641 -303
  67. package/flow/presets/index.esm.js.map +1 -1
  68. package/flow/presets/synced.d.ts.map +1 -1
  69. package/flow/steps/analyze-commits.d.ts +9 -6
  70. package/flow/steps/analyze-commits.d.ts.map +1 -1
  71. package/flow/steps/calculate-bump.d.ts.map +1 -1
  72. package/flow/steps/fetch-registry.d.ts.map +1 -1
  73. package/flow/steps/generate-changelog.d.ts +5 -0
  74. package/flow/steps/generate-changelog.d.ts.map +1 -1
  75. package/flow/steps/index.cjs.js +3663 -328
  76. package/flow/steps/index.cjs.js.map +1 -1
  77. package/flow/steps/index.d.ts +2 -1
  78. package/flow/steps/index.d.ts.map +1 -1
  79. package/flow/steps/index.esm.js +3661 -329
  80. package/flow/steps/index.esm.js.map +1 -1
  81. package/flow/steps/resolve-repository.d.ts +36 -0
  82. package/flow/steps/resolve-repository.d.ts.map +1 -0
  83. package/flow/steps/update-packages.d.ts.map +1 -1
  84. package/git/factory.d.ts +14 -0
  85. package/git/factory.d.ts.map +1 -1
  86. package/git/index.cjs.js +65 -0
  87. package/git/index.cjs.js.map +1 -1
  88. package/git/index.esm.js +66 -2
  89. package/git/index.esm.js.map +1 -1
  90. package/git/operations/index.cjs.js +40 -0
  91. package/git/operations/index.cjs.js.map +1 -1
  92. package/git/operations/index.d.ts +1 -1
  93. package/git/operations/index.d.ts.map +1 -1
  94. package/git/operations/index.esm.js +41 -2
  95. package/git/operations/index.esm.js.map +1 -1
  96. package/git/operations/log.d.ts +23 -0
  97. package/git/operations/log.d.ts.map +1 -1
  98. package/index.cjs.js +7547 -4947
  99. package/index.cjs.js.map +1 -1
  100. package/index.d.ts +3 -1
  101. package/index.d.ts.map +1 -1
  102. package/index.esm.js +7550 -4954
  103. package/index.esm.js.map +1 -1
  104. package/package.json +39 -1
  105. package/registry/index.cjs.js +3 -3
  106. package/registry/index.cjs.js.map +1 -1
  107. package/registry/index.esm.js +3 -3
  108. package/registry/index.esm.js.map +1 -1
  109. package/registry/models/index.cjs.js +2 -0
  110. package/registry/models/index.cjs.js.map +1 -1
  111. package/registry/models/index.esm.js +2 -0
  112. package/registry/models/index.esm.js.map +1 -1
  113. package/registry/models/version-info.d.ts +10 -0
  114. package/registry/models/version-info.d.ts.map +1 -1
  115. package/registry/npm/client.d.ts.map +1 -1
  116. package/registry/npm/index.cjs.js +1 -3
  117. package/registry/npm/index.cjs.js.map +1 -1
  118. package/registry/npm/index.esm.js +1 -3
  119. package/registry/npm/index.esm.js.map +1 -1
  120. package/repository/index.cjs.js +998 -0
  121. package/repository/index.cjs.js.map +1 -0
  122. package/repository/index.d.ts +4 -0
  123. package/repository/index.d.ts.map +1 -0
  124. package/repository/index.esm.js +981 -0
  125. package/repository/index.esm.js.map +1 -0
  126. package/repository/models/index.cjs.js +301 -0
  127. package/repository/models/index.cjs.js.map +1 -0
  128. package/repository/models/index.d.ts +7 -0
  129. package/repository/models/index.d.ts.map +1 -0
  130. package/repository/models/index.esm.js +290 -0
  131. package/repository/models/index.esm.js.map +1 -0
  132. package/repository/models/platform.d.ts +58 -0
  133. package/repository/models/platform.d.ts.map +1 -0
  134. package/repository/models/repository-config.d.ts +132 -0
  135. package/repository/models/repository-config.d.ts.map +1 -0
  136. package/repository/models/resolution.d.ts +121 -0
  137. package/repository/models/resolution.d.ts.map +1 -0
  138. package/repository/parse/index.cjs.js +755 -0
  139. package/repository/parse/index.cjs.js.map +1 -0
  140. package/repository/parse/index.d.ts +5 -0
  141. package/repository/parse/index.d.ts.map +1 -0
  142. package/repository/parse/index.esm.js +749 -0
  143. package/repository/parse/index.esm.js.map +1 -0
  144. package/repository/parse/package-json.d.ts +100 -0
  145. package/repository/parse/package-json.d.ts.map +1 -0
  146. package/repository/parse/url.d.ts +81 -0
  147. package/repository/parse/url.d.ts.map +1 -0
  148. package/repository/url/compare.d.ts +84 -0
  149. package/repository/url/compare.d.ts.map +1 -0
  150. package/repository/url/index.cjs.js +178 -0
  151. package/repository/url/index.cjs.js.map +1 -0
  152. package/repository/url/index.d.ts +3 -0
  153. package/repository/url/index.d.ts.map +1 -0
  154. package/repository/url/index.esm.js +176 -0
  155. package/repository/url/index.esm.js.map +1 -0
  156. package/workspace/discovery/changelog-path.d.ts +3 -7
  157. package/workspace/discovery/changelog-path.d.ts.map +1 -1
  158. package/workspace/discovery/index.cjs.js +408 -335
  159. package/workspace/discovery/index.cjs.js.map +1 -1
  160. package/workspace/discovery/index.esm.js +408 -335
  161. package/workspace/discovery/index.esm.js.map +1 -1
  162. package/workspace/discovery/packages.d.ts +0 -6
  163. package/workspace/discovery/packages.d.ts.map +1 -1
  164. package/workspace/index.cjs.js +84 -11
  165. package/workspace/index.cjs.js.map +1 -1
  166. package/workspace/index.esm.js +84 -11
  167. package/workspace/index.esm.js.map +1 -1
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Safe copies of Map built-in via factory function.
3
+ *
4
+ * Since constructors cannot be safely captured via Object.assign, this module
5
+ * provides a factory function that uses Reflect.construct internally.
6
+ *
7
+ * These references are captured at module initialization time to protect against
8
+ * prototype pollution attacks. Import only what you need for tree-shaking.
9
+ *
10
+ * @module @hyperfrontend/immutable-api-utils/built-in-copy/map
11
+ */
12
+ // Capture references at module initialization time
13
+ const _Map = globalThis.Map;
14
+ const _Reflect = globalThis.Reflect;
15
+ /**
16
+ * (Safe copy) Creates a new Map using the captured Map constructor.
17
+ * Use this instead of `new Map()`.
18
+ *
19
+ * @param iterable - Optional iterable of key-value pairs.
20
+ * @returns A new Map instance.
21
+ */
22
+ const createMap = (iterable) => _Reflect.construct(_Map, iterable ? [iterable] : []);
23
+
24
+ /**
25
+ * Checks if a platform identifier is a known platform with built-in support.
26
+ *
27
+ * @param platform - Platform identifier to check
28
+ * @returns True if the platform is a known platform
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * isKnownPlatform('github') // true
33
+ * isKnownPlatform('gitlab') // true
34
+ * isKnownPlatform('custom') // false
35
+ * isKnownPlatform('unknown') // false
36
+ * ```
37
+ */
38
+ function isKnownPlatform(platform) {
39
+ return platform === 'github' || platform === 'gitlab' || platform === 'bitbucket' || platform === 'azure-devops';
40
+ }
41
+ /**
42
+ * Known platform hostnames mapped to their platform type.
43
+ * Used for automatic platform detection from repository URLs.
44
+ *
45
+ * Includes both standard SaaS domains and common patterns for self-hosted instances.
46
+ */
47
+ createMap([
48
+ // GitHub
49
+ ['github.com', 'github'],
50
+ // GitLab
51
+ ['gitlab.com', 'gitlab'],
52
+ // Bitbucket
53
+ ['bitbucket.org', 'bitbucket'],
54
+ // Azure DevOps
55
+ ['dev.azure.com', 'azure-devops'],
56
+ ['visualstudio.com', 'azure-devops'],
57
+ ]);
58
+
59
+ /**
60
+ * Creates a platform-specific compare URL for viewing changes between two commits.
61
+ *
62
+ * Each platform has a different URL format:
63
+ * - **GitHub**: `{baseUrl}/compare/{fromCommit}...{toCommit}` (three dots)
64
+ * - **GitLab**: `{baseUrl}/-/compare/{fromCommit}...{toCommit}` (three dots, `/-/` prefix)
65
+ * - **Bitbucket**: `{baseUrl}/compare/{toCommit}..{fromCommit}` (two dots, reversed order)
66
+ * - **Azure DevOps**: `{baseUrl}/compare?version=GT{toCommit}&compareVersion=GT{fromCommit}` (query params)
67
+ *
68
+ * For `custom` platforms, a `formatCompareUrl` function must be provided in the repository config.
69
+ * For `unknown` platforms, returns `null`.
70
+ *
71
+ * @param options - Compare URL options including repository, fromCommit, and toCommit
72
+ * @returns The compare URL string, or null if URL cannot be generated
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * // GitHub
77
+ * createCompareUrl({
78
+ * repository: { platform: 'github', baseUrl: 'https://github.com/owner/repo' },
79
+ * fromCommit: 'abc1234',
80
+ * toCommit: 'def5678'
81
+ * })
82
+ * // → 'https://github.com/owner/repo/compare/abc1234...def5678'
83
+ *
84
+ * // GitLab
85
+ * createCompareUrl({
86
+ * repository: { platform: 'gitlab', baseUrl: 'https://gitlab.com/group/project' },
87
+ * fromCommit: 'abc1234',
88
+ * toCommit: 'def5678'
89
+ * })
90
+ * // → 'https://gitlab.com/group/project/-/compare/abc1234...def5678'
91
+ *
92
+ * // Bitbucket (reversed order)
93
+ * createCompareUrl({
94
+ * repository: { platform: 'bitbucket', baseUrl: 'https://bitbucket.org/owner/repo' },
95
+ * fromCommit: 'abc1234',
96
+ * toCommit: 'def5678'
97
+ * })
98
+ * // → 'https://bitbucket.org/owner/repo/compare/def5678..abc1234'
99
+ *
100
+ * // Azure DevOps
101
+ * createCompareUrl({
102
+ * repository: { platform: 'azure-devops', baseUrl: 'https://dev.azure.com/org/proj/_git/repo' },
103
+ * fromCommit: 'abc1234',
104
+ * toCommit: 'def5678'
105
+ * })
106
+ * // → 'https://dev.azure.com/org/proj/_git/repo/compare?version=GTdef5678&compareVersion=GTabc1234'
107
+ *
108
+ * // Custom formatter
109
+ * createCompareUrl({
110
+ * repository: {
111
+ * platform: 'custom',
112
+ * baseUrl: 'https://my-git.internal/repo',
113
+ * formatCompareUrl: (from, to) => `https://my-git.internal/diff/${from}/${to}`
114
+ * },
115
+ * fromCommit: 'abc1234',
116
+ * toCommit: 'def5678'
117
+ * })
118
+ * // → 'https://my-git.internal/diff/abc1234/def5678'
119
+ * ```
120
+ */
121
+ function createCompareUrl(options) {
122
+ const { repository, fromCommit, toCommit } = options;
123
+ // Validate inputs
124
+ if (!repository || !fromCommit || !toCommit) {
125
+ return null;
126
+ }
127
+ // If custom formatter is provided, use it (works for any platform including overrides)
128
+ if (repository.formatCompareUrl) {
129
+ return repository.formatCompareUrl(fromCommit, toCommit);
130
+ }
131
+ const { platform, baseUrl } = repository;
132
+ // Cannot generate URL for unknown platforms without a formatter
133
+ if (platform === 'unknown') {
134
+ return null;
135
+ }
136
+ // Custom platform requires a formatter
137
+ if (platform === 'custom') {
138
+ return null;
139
+ }
140
+ // Generate URL for known platforms
141
+ if (isKnownPlatform(platform)) {
142
+ return formatKnownPlatformCompareUrl(platform, baseUrl, fromCommit, toCommit);
143
+ }
144
+ return null;
145
+ }
146
+ /**
147
+ * Formats a compare URL for known platforms.
148
+ *
149
+ * @param platform - Known platform type
150
+ * @param baseUrl - Repository base URL
151
+ * @param fromCommit - Source commit hash (older version)
152
+ * @param toCommit - Target commit hash (newer version)
153
+ * @returns Formatted compare URL
154
+ *
155
+ * @internal
156
+ */
157
+ function formatKnownPlatformCompareUrl(platform, baseUrl, fromCommit, toCommit) {
158
+ switch (platform) {
159
+ case 'github':
160
+ // GitHub: {baseUrl}/compare/{fromCommit}...{toCommit}
161
+ return `${baseUrl}/compare/${fromCommit}...${toCommit}`;
162
+ case 'gitlab':
163
+ // GitLab: {baseUrl}/-/compare/{fromCommit}...{toCommit}
164
+ return `${baseUrl}/-/compare/${fromCommit}...${toCommit}`;
165
+ case 'bitbucket':
166
+ // Bitbucket: {baseUrl}/compare/{toCommit}..{fromCommit} (reversed order, two dots)
167
+ return `${baseUrl}/compare/${toCommit}..${fromCommit}`;
168
+ case 'azure-devops':
169
+ // Azure DevOps: {baseUrl}/compare?version=GT{toCommit}&compareVersion=GT{fromCommit}
170
+ // Use encodeURIComponent for query parameter values
171
+ return `${baseUrl}/compare?version=GT${encodeURIComponent(toCommit)}&compareVersion=GT${encodeURIComponent(fromCommit)}`;
172
+ }
173
+ }
174
+
175
+ export { createCompareUrl };
176
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../../../../../../../../../../libs/utils/immutable-api/src/built-in-copy/map/index.ts","../../../../../../../../../../libs/versioning/src/repository/models/platform.ts","../../../../../../../../../../libs/versioning/src/repository/url/compare.ts"],"sourcesContent":[null,null,null],"names":[],"mappings":"AAAA;;;;;;;;;;AAUG;AAEH;AACA,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG;AAC3B,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO;AAGnC;;;;;;AAMG;AACI,MAAM,SAAS,GAAG,CAAO,QAA2C,KAC9D,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;;ACHjE;;;;;;;;;;;;;AAaG;AACG,SAAU,eAAe,CAAC,QAA4B,EAAA;AAC1D,IAAA,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,cAAc;AAClH;AAEA;;;;;AAKG;AACmE,SAAS,CAAwB;;IAErG,CAAC,YAAY,EAAE,QAAQ,CAAC;;IAGxB,CAAC,YAAY,EAAE,QAAQ,CAAC;;IAGxB,CAAC,eAAe,EAAE,WAAW,CAAC;;IAG9B,CAAC,eAAe,EAAE,cAAc,CAAC;IACjC,CAAC,kBAAkB,EAAE,cAAc,CAAC;AACrC,CAAA;;ACjCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DG;AACG,SAAU,gBAAgB,CAAC,OAAgC,EAAA;IAC/D,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO;;IAGpD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE;AAC3C,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,IAAI,UAAU,CAAC,gBAAgB,EAAE;QAC/B,OAAO,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC1D;AAEA,IAAA,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,UAAU;;AAGxC,IAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC1B,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,IAAI,QAAQ,KAAK,QAAQ,EAAE;AACzB,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE;QAC7B,OAAO,6BAA6B,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC;IAC/E;AAEA,IAAA,OAAO,IAAI;AACb;AAEA;;;;;;;;;;AAUG;AACH,SAAS,6BAA6B,CAAC,QAAuB,EAAE,OAAe,EAAE,UAAkB,EAAE,QAAgB,EAAA;IACnH,QAAQ,QAAQ;AACd,QAAA,KAAK,QAAQ;;AAEX,YAAA,OAAO,GAAG,OAAO,CAAA,SAAA,EAAY,UAAU,CAAA,GAAA,EAAM,QAAQ,EAAE;AAEzD,QAAA,KAAK,QAAQ;;AAEX,YAAA,OAAO,GAAG,OAAO,CAAA,WAAA,EAAc,UAAU,CAAA,GAAA,EAAM,QAAQ,EAAE;AAE3D,QAAA,KAAK,WAAW;;AAEd,YAAA,OAAO,GAAG,OAAO,CAAA,SAAA,EAAY,QAAQ,CAAA,EAAA,EAAK,UAAU,EAAE;AAExD,QAAA,KAAK,cAAc;;;AAGjB,YAAA,OAAO,CAAA,EAAG,OAAO,CAAA,mBAAA,EAAsB,kBAAkB,CAAC,QAAQ,CAAC,CAAA,kBAAA,EAAqB,kBAAkB,CAAC,UAAU,CAAC,EAAE;;AAE9H;;;;"}
@@ -1,8 +1,3 @@
1
- /**
2
- * Changelog Path Utilities
3
- *
4
- * Functions for checking changelog existence and resolving expected paths.
5
- */
6
1
  /**
7
2
  * Checks if a project has a changelog file.
8
3
  *
@@ -15,7 +10,8 @@ export declare function hasChangelog(projectPath: string): boolean;
15
10
  * Returns the standard CHANGELOG.md path regardless of whether it exists.
16
11
  *
17
12
  * @param projectPath - Directory containing the project files
18
- * @returns Absolute path to CHANGELOG.md in the project directory
13
+ * @param fileName - Changelog filename to use (default: 'CHANGELOG.md')
14
+ * @returns Absolute path to changelog file in the project directory
19
15
  */
20
- export declare function getExpectedChangelogPath(projectPath: string): string;
16
+ export declare function getExpectedChangelogPath(projectPath: string, fileName?: string): string;
21
17
  //# sourceMappingURL=changelog-path.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"changelog-path.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/versioning/src/workspace/discovery/changelog-path.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEpE"}
1
+ {"version":3,"file":"changelog-path.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/versioning/src/workspace/discovery/changelog-path.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAmC,GAAG,MAAM,CAEnH"}