a2a-memory 0.11.4 → 0.11.6

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 (262) hide show
  1. package/LICENSE +7 -19
  2. package/README.md +1 -1
  3. package/dist/a2a/client.js +1 -252
  4. package/dist/a2a/discovery.js +1 -115
  5. package/dist/a2a/index.js +1 -8
  6. package/dist/a2a/types.js +1 -42
  7. package/dist/adapters/anthropic.js +1 -117
  8. package/dist/chunking/chunker.js +1 -163
  9. package/dist/claude/sync.js +1 -294
  10. package/dist/cli/commands/add.js +1 -80
  11. package/dist/cli/commands/claude-sync.js +1 -70
  12. package/dist/cli/commands/cleanup.js +1 -83
  13. package/dist/cli/commands/config.js +1 -73
  14. package/dist/cli/commands/edit.js +1 -69
  15. package/dist/cli/commands/embed.js +1 -92
  16. package/dist/cli/commands/extract.js +1 -103
  17. package/dist/cli/commands/health.js +1 -105
  18. package/dist/cli/commands/list.js +1 -49
  19. package/dist/cli/commands/migrate-chunks.js +1 -205
  20. package/dist/cli/commands/migrate-file-refs.js +1 -183
  21. package/dist/cli/commands/proficiency.js +1 -146
  22. package/dist/cli/commands/rm.js +1 -64
  23. package/dist/cli/commands/search.js +1 -89
  24. package/dist/cli/commands/setup-wizard.js +1 -387
  25. package/dist/cli/commands/setup.js +1 -170
  26. package/dist/cli/commands/skill.js +1 -151
  27. package/dist/cli/commands/status.js +1 -70
  28. package/dist/cli/commands/sync.js +1 -202
  29. package/dist/cli/commands/team.js +1 -142
  30. package/dist/cli/index.js +1 -87
  31. package/dist/config/manager.js +1 -372
  32. package/dist/db/database.d.ts +10 -1
  33. package/dist/db/database.js +1 -1367
  34. package/dist/embedding/e5-provider.js +1 -147
  35. package/dist/embedding/index.js +1 -34
  36. package/dist/embedding/local-provider.js +1 -157
  37. package/dist/embedding/openai-provider.js +1 -92
  38. package/dist/embedding/quantization.js +1 -89
  39. package/dist/extraction/dedup-manager.js +1 -161
  40. package/dist/extraction/emotion-filter.js +1 -33
  41. package/dist/extraction/extractor.js +1 -642
  42. package/dist/extraction/file-reference.js +1 -77
  43. package/dist/extraction/filter.js +1 -85
  44. package/dist/extraction/scorer.js +1 -142
  45. package/dist/extraction/similarity.js +1 -85
  46. package/dist/hooks/client-factory.js +1 -44
  47. package/dist/hooks/post-tool-use.js +1 -470
  48. package/dist/hooks/pre-compact.js +1 -209
  49. package/dist/hooks/session-end.d.ts +1 -0
  50. package/dist/hooks/session-end.js +1 -623
  51. package/dist/hooks/session-start.js +1 -549
  52. package/dist/hooks/shared.js +1 -110
  53. package/dist/hooks/user-prompt-submit.js +1 -316
  54. package/dist/i18n/index.js +1 -2
  55. package/dist/i18n/messages.js +1 -150
  56. package/dist/index.js +1 -43
  57. package/dist/lifecycle/cleanup-scheduler.js +1 -137
  58. package/dist/lifecycle/cleanup.js +1 -116
  59. package/dist/lifecycle/index.js +1 -13
  60. package/dist/lifecycle/quality-scorer.js +1 -46
  61. package/dist/lifecycle/tiering.js +1 -246
  62. package/dist/llm/client.js +1 -226
  63. package/dist/llm/index.js +1 -5
  64. package/dist/proficiency/actr-engine.js +1 -106
  65. package/dist/proficiency/detection.js +1 -77
  66. package/dist/proficiency/index.js +1 -9
  67. package/dist/proficiency/tracker.js +1 -173
  68. package/dist/proficiency/types.js +1 -8
  69. package/dist/providers/adapters.js +1 -140
  70. package/dist/providers/detector.js +1 -57
  71. package/dist/search/adaptive-router.js +1 -93
  72. package/dist/search/index.js +1 -9
  73. package/dist/search/ranker.js +1 -171
  74. package/dist/search/reranker.js +1 -155
  75. package/dist/session/parser.js +1 -130
  76. package/dist/skill/evaluator.js +1 -509
  77. package/dist/skill/index.js +1 -7
  78. package/dist/skill/types.js +1 -7
  79. package/dist/sync/client.d.ts +1 -0
  80. package/dist/sync/client.js +1 -597
  81. package/dist/sync/encryption.js +1 -203
  82. package/dist/sync/index.js +1 -12
  83. package/dist/sync/queue.js +1 -199
  84. package/dist/sync/scheduler.js +1 -140
  85. package/dist/sync/synchronizer.js +1 -241
  86. package/dist/sync/team-synchronizer.js +1 -204
  87. package/dist/sync/vector-clock.js +1 -70
  88. package/dist/types/index.d.ts +2 -1
  89. package/dist/types/index.js +1 -131
  90. package/dist/utils/keychain.js +1 -170
  91. package/dist/utils/logger.js +1 -128
  92. package/package.json +14 -10
  93. package/dist/a2a/client.d.ts.map +0 -1
  94. package/dist/a2a/client.js.map +0 -1
  95. package/dist/a2a/discovery.d.ts.map +0 -1
  96. package/dist/a2a/discovery.js.map +0 -1
  97. package/dist/a2a/index.d.ts.map +0 -1
  98. package/dist/a2a/index.js.map +0 -1
  99. package/dist/a2a/types.d.ts.map +0 -1
  100. package/dist/a2a/types.js.map +0 -1
  101. package/dist/adapters/anthropic.d.ts.map +0 -1
  102. package/dist/adapters/anthropic.js.map +0 -1
  103. package/dist/chunking/chunker.d.ts.map +0 -1
  104. package/dist/chunking/chunker.js.map +0 -1
  105. package/dist/claude/sync.d.ts.map +0 -1
  106. package/dist/claude/sync.js.map +0 -1
  107. package/dist/cli/commands/add.d.ts.map +0 -1
  108. package/dist/cli/commands/add.js.map +0 -1
  109. package/dist/cli/commands/claude-sync.d.ts.map +0 -1
  110. package/dist/cli/commands/claude-sync.js.map +0 -1
  111. package/dist/cli/commands/cleanup.d.ts.map +0 -1
  112. package/dist/cli/commands/cleanup.js.map +0 -1
  113. package/dist/cli/commands/config.d.ts.map +0 -1
  114. package/dist/cli/commands/config.js.map +0 -1
  115. package/dist/cli/commands/edit.d.ts.map +0 -1
  116. package/dist/cli/commands/edit.js.map +0 -1
  117. package/dist/cli/commands/embed.d.ts.map +0 -1
  118. package/dist/cli/commands/embed.js.map +0 -1
  119. package/dist/cli/commands/extract.d.ts.map +0 -1
  120. package/dist/cli/commands/extract.js.map +0 -1
  121. package/dist/cli/commands/health.d.ts.map +0 -1
  122. package/dist/cli/commands/health.js.map +0 -1
  123. package/dist/cli/commands/list.d.ts.map +0 -1
  124. package/dist/cli/commands/list.js.map +0 -1
  125. package/dist/cli/commands/migrate-chunks.d.ts.map +0 -1
  126. package/dist/cli/commands/migrate-chunks.js.map +0 -1
  127. package/dist/cli/commands/migrate-file-refs.d.ts.map +0 -1
  128. package/dist/cli/commands/migrate-file-refs.js.map +0 -1
  129. package/dist/cli/commands/proficiency.d.ts.map +0 -1
  130. package/dist/cli/commands/proficiency.js.map +0 -1
  131. package/dist/cli/commands/rm.d.ts.map +0 -1
  132. package/dist/cli/commands/rm.js.map +0 -1
  133. package/dist/cli/commands/search.d.ts.map +0 -1
  134. package/dist/cli/commands/search.js.map +0 -1
  135. package/dist/cli/commands/setup-wizard.d.ts.map +0 -1
  136. package/dist/cli/commands/setup-wizard.js.map +0 -1
  137. package/dist/cli/commands/setup.d.ts.map +0 -1
  138. package/dist/cli/commands/setup.js.map +0 -1
  139. package/dist/cli/commands/skill.d.ts.map +0 -1
  140. package/dist/cli/commands/skill.js.map +0 -1
  141. package/dist/cli/commands/status.d.ts.map +0 -1
  142. package/dist/cli/commands/status.js.map +0 -1
  143. package/dist/cli/commands/sync.d.ts.map +0 -1
  144. package/dist/cli/commands/sync.js.map +0 -1
  145. package/dist/cli/commands/team.d.ts.map +0 -1
  146. package/dist/cli/commands/team.js.map +0 -1
  147. package/dist/cli/index.d.ts.map +0 -1
  148. package/dist/cli/index.js.map +0 -1
  149. package/dist/config/manager.d.ts.map +0 -1
  150. package/dist/config/manager.js.map +0 -1
  151. package/dist/db/database.d.ts.map +0 -1
  152. package/dist/db/database.js.map +0 -1
  153. package/dist/embedding/e5-provider.d.ts.map +0 -1
  154. package/dist/embedding/e5-provider.js.map +0 -1
  155. package/dist/embedding/index.d.ts.map +0 -1
  156. package/dist/embedding/index.js.map +0 -1
  157. package/dist/embedding/local-provider.d.ts.map +0 -1
  158. package/dist/embedding/local-provider.js.map +0 -1
  159. package/dist/embedding/openai-provider.d.ts.map +0 -1
  160. package/dist/embedding/openai-provider.js.map +0 -1
  161. package/dist/embedding/quantization.d.ts.map +0 -1
  162. package/dist/embedding/quantization.js.map +0 -1
  163. package/dist/extraction/dedup-manager.d.ts.map +0 -1
  164. package/dist/extraction/dedup-manager.js.map +0 -1
  165. package/dist/extraction/emotion-filter.d.ts.map +0 -1
  166. package/dist/extraction/emotion-filter.js.map +0 -1
  167. package/dist/extraction/extractor.d.ts.map +0 -1
  168. package/dist/extraction/extractor.js.map +0 -1
  169. package/dist/extraction/file-reference.d.ts.map +0 -1
  170. package/dist/extraction/file-reference.js.map +0 -1
  171. package/dist/extraction/filter.d.ts.map +0 -1
  172. package/dist/extraction/filter.js.map +0 -1
  173. package/dist/extraction/scorer.d.ts.map +0 -1
  174. package/dist/extraction/scorer.js.map +0 -1
  175. package/dist/extraction/similarity.d.ts.map +0 -1
  176. package/dist/extraction/similarity.js.map +0 -1
  177. package/dist/hooks/client-factory.d.ts.map +0 -1
  178. package/dist/hooks/client-factory.js.map +0 -1
  179. package/dist/hooks/post-tool-use.d.ts.map +0 -1
  180. package/dist/hooks/post-tool-use.js.map +0 -1
  181. package/dist/hooks/pre-compact.d.ts.map +0 -1
  182. package/dist/hooks/pre-compact.js.map +0 -1
  183. package/dist/hooks/session-end.d.ts.map +0 -1
  184. package/dist/hooks/session-end.js.map +0 -1
  185. package/dist/hooks/session-start.d.ts.map +0 -1
  186. package/dist/hooks/session-start.js.map +0 -1
  187. package/dist/hooks/shared.d.ts.map +0 -1
  188. package/dist/hooks/shared.js.map +0 -1
  189. package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
  190. package/dist/hooks/user-prompt-submit.js.map +0 -1
  191. package/dist/i18n/index.d.ts.map +0 -1
  192. package/dist/i18n/index.js.map +0 -1
  193. package/dist/i18n/messages.d.ts.map +0 -1
  194. package/dist/i18n/messages.js.map +0 -1
  195. package/dist/index.d.ts.map +0 -1
  196. package/dist/index.js.map +0 -1
  197. package/dist/lifecycle/cleanup-scheduler.d.ts.map +0 -1
  198. package/dist/lifecycle/cleanup-scheduler.js.map +0 -1
  199. package/dist/lifecycle/cleanup.d.ts.map +0 -1
  200. package/dist/lifecycle/cleanup.js.map +0 -1
  201. package/dist/lifecycle/index.d.ts.map +0 -1
  202. package/dist/lifecycle/index.js.map +0 -1
  203. package/dist/lifecycle/quality-scorer.d.ts.map +0 -1
  204. package/dist/lifecycle/quality-scorer.js.map +0 -1
  205. package/dist/lifecycle/tiering.d.ts.map +0 -1
  206. package/dist/lifecycle/tiering.js.map +0 -1
  207. package/dist/llm/client.d.ts.map +0 -1
  208. package/dist/llm/client.js.map +0 -1
  209. package/dist/llm/index.d.ts.map +0 -1
  210. package/dist/llm/index.js.map +0 -1
  211. package/dist/proficiency/actr-engine.d.ts.map +0 -1
  212. package/dist/proficiency/actr-engine.js.map +0 -1
  213. package/dist/proficiency/detection.d.ts.map +0 -1
  214. package/dist/proficiency/detection.js.map +0 -1
  215. package/dist/proficiency/index.d.ts.map +0 -1
  216. package/dist/proficiency/index.js.map +0 -1
  217. package/dist/proficiency/tracker.d.ts.map +0 -1
  218. package/dist/proficiency/tracker.js.map +0 -1
  219. package/dist/proficiency/types.d.ts.map +0 -1
  220. package/dist/proficiency/types.js.map +0 -1
  221. package/dist/providers/adapters.d.ts.map +0 -1
  222. package/dist/providers/adapters.js.map +0 -1
  223. package/dist/providers/detector.d.ts.map +0 -1
  224. package/dist/providers/detector.js.map +0 -1
  225. package/dist/search/adaptive-router.d.ts.map +0 -1
  226. package/dist/search/adaptive-router.js.map +0 -1
  227. package/dist/search/index.d.ts.map +0 -1
  228. package/dist/search/index.js.map +0 -1
  229. package/dist/search/ranker.d.ts.map +0 -1
  230. package/dist/search/ranker.js.map +0 -1
  231. package/dist/search/reranker.d.ts.map +0 -1
  232. package/dist/search/reranker.js.map +0 -1
  233. package/dist/session/parser.d.ts.map +0 -1
  234. package/dist/session/parser.js.map +0 -1
  235. package/dist/skill/evaluator.d.ts.map +0 -1
  236. package/dist/skill/evaluator.js.map +0 -1
  237. package/dist/skill/index.d.ts.map +0 -1
  238. package/dist/skill/index.js.map +0 -1
  239. package/dist/skill/types.d.ts.map +0 -1
  240. package/dist/skill/types.js.map +0 -1
  241. package/dist/sync/client.d.ts.map +0 -1
  242. package/dist/sync/client.js.map +0 -1
  243. package/dist/sync/encryption.d.ts.map +0 -1
  244. package/dist/sync/encryption.js.map +0 -1
  245. package/dist/sync/index.d.ts.map +0 -1
  246. package/dist/sync/index.js.map +0 -1
  247. package/dist/sync/queue.d.ts.map +0 -1
  248. package/dist/sync/queue.js.map +0 -1
  249. package/dist/sync/scheduler.d.ts.map +0 -1
  250. package/dist/sync/scheduler.js.map +0 -1
  251. package/dist/sync/synchronizer.d.ts.map +0 -1
  252. package/dist/sync/synchronizer.js.map +0 -1
  253. package/dist/sync/team-synchronizer.d.ts.map +0 -1
  254. package/dist/sync/team-synchronizer.js.map +0 -1
  255. package/dist/sync/vector-clock.d.ts.map +0 -1
  256. package/dist/sync/vector-clock.js.map +0 -1
  257. package/dist/types/index.d.ts.map +0 -1
  258. package/dist/types/index.js.map +0 -1
  259. package/dist/utils/keychain.d.ts.map +0 -1
  260. package/dist/utils/keychain.js.map +0 -1
  261. package/dist/utils/logger.d.ts.map +0 -1
  262. package/dist/utils/logger.js.map +0 -1
@@ -1,597 +1 @@
1
- /**
2
- * A2A API Client
3
- * Node.js 내장 fetch 사용 (외부 의존성 없음)
4
- */
5
- import { encryptContent, decryptContent, wrapEncryptedContent, unwrapEncryptedContent, } from './encryption.js';
6
- // Plugin 버전 (빌드 시점에 package.json에서 읽기)
7
- let _pluginVersion = '0.0.0';
8
- try {
9
- const { readFileSync } = await import('node:fs');
10
- const { fileURLToPath } = await import('node:url');
11
- const { dirname, join } = await import('node:path');
12
- const __dirname = dirname(fileURLToPath(import.meta.url));
13
- const pkg = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));
14
- _pluginVersion = pkg.version || '0.0.0';
15
- }
16
- catch {
17
- // dist 환경에서 경로가 다를 수 있음
18
- }
19
- export class A2AClient {
20
- config;
21
- timeout;
22
- encryptionKey = null;
23
- enabledFeatures = [];
24
- constructor(config) {
25
- this.config = config;
26
- this.timeout = config.timeout ?? 60000;
27
- }
28
- /**
29
- * 활성화된 Feature 목록 설정 (헤더 전송용)
30
- */
31
- setEnabledFeatures(features) {
32
- this.enabledFeatures = features;
33
- }
34
- /**
35
- * 암호화 키 설정
36
- */
37
- setEncryptionKey(key) {
38
- if (key.length !== 32) {
39
- throw new Error('암호화 키는 32 bytes여야 합니다');
40
- }
41
- this.encryptionKey = key;
42
- }
43
- /**
44
- * 암호화 키 해제
45
- */
46
- clearEncryptionKey() {
47
- this.encryptionKey = null;
48
- }
49
- /**
50
- * 암호화 활성화 여부
51
- */
52
- isEncryptionEnabled() {
53
- return this.encryptionKey !== null;
54
- }
55
- /**
56
- * 메모리 생성
57
- */
58
- async createMemory(input) {
59
- let contentToSend = input.content;
60
- // 암호화가 활성화된 경우
61
- if (this.encryptionKey) {
62
- const encrypted = encryptContent(input.content, this.encryptionKey);
63
- contentToSend = wrapEncryptedContent(encrypted);
64
- }
65
- const response = await this.request('POST', '/api/v1/memories', {
66
- content: contentToSend,
67
- category: input.category,
68
- tier: input.tier,
69
- tags: input.tags ?? [],
70
- });
71
- const memory = response;
72
- // 응답 복호화
73
- if (this.encryptionKey && memory.content) {
74
- const unwrapped = unwrapEncryptedContent(memory.content);
75
- if (unwrapped) {
76
- memory.content = decryptContent(unwrapped, this.encryptionKey);
77
- }
78
- }
79
- return memory;
80
- }
81
- /**
82
- * 메모리 검색
83
- */
84
- async searchMemories(query, options) {
85
- const response = await this.request('POST', '/api/v1/memories/search', {
86
- query,
87
- limit: options?.limit ?? 10,
88
- category: options?.category,
89
- });
90
- return response.items ?? [];
91
- }
92
- /**
93
- * 메모리 목록
94
- */
95
- async listMemories(options) {
96
- const params = new URLSearchParams();
97
- if (options?.limit)
98
- params.set('limit', options.limit.toString());
99
- if (options?.offset)
100
- params.set('offset', options.offset.toString());
101
- if (options?.includeEmbedding)
102
- params.set('include_embedding', 'true');
103
- const path = `/api/v1/memories${params.toString() ? `?${params.toString()}` : ''}`;
104
- const response = await this.request('GET', path);
105
- const memories = response.items ?? [];
106
- // 복호화
107
- if (this.encryptionKey) {
108
- return memories.map(memory => this.decryptMemory(memory));
109
- }
110
- return memories;
111
- }
112
- /**
113
- * 메모리 복호화 헬퍼
114
- */
115
- decryptMemory(memory) {
116
- if (!this.encryptionKey)
117
- return memory;
118
- const decrypted = { ...memory };
119
- // content 복호화
120
- if (decrypted.content) {
121
- const unwrapped = unwrapEncryptedContent(decrypted.content);
122
- if (unwrapped) {
123
- try {
124
- decrypted.content = decryptContent(unwrapped, this.encryptionKey);
125
- }
126
- catch {
127
- // 복호화 실패 시 원본 유지 (암호화되지 않은 데이터일 수 있음)
128
- }
129
- }
130
- }
131
- return decrypted;
132
- }
133
- /**
134
- * 메모리 업데이트
135
- */
136
- async updateMemory(id, updates) {
137
- const response = await this.request('PUT', `/api/v1/memories/${id}`, updates);
138
- return response;
139
- }
140
- /**
141
- * 메모리 삭제
142
- */
143
- async deleteMemory(id) {
144
- await this.request('DELETE', `/api/v1/memories/${id}`);
145
- }
146
- // ============================
147
- // Team API
148
- // ============================
149
- /**
150
- * 팀 목록 조회
151
- */
152
- async listTeams() {
153
- const response = await this.request('GET', '/api/v1/teams');
154
- // 서버는 직접 배열 반환 (items 래퍼 없음)
155
- if (Array.isArray(response))
156
- return response;
157
- return response.items ?? [];
158
- }
159
- /**
160
- * 팀 메모리 목록
161
- */
162
- async listTeamMemories(teamPath, options) {
163
- const params = new URLSearchParams();
164
- if (options?.limit)
165
- params.set('limit', options.limit.toString());
166
- if (options?.offset)
167
- params.set('offset', options.offset.toString());
168
- const qs = params.toString();
169
- const path = `/teams/${encodeURIComponent(teamPath)}/memories${qs ? `?${qs}` : ''}`;
170
- const response = await this.request('GET', path);
171
- return response.items ?? [];
172
- }
173
- /**
174
- * 팀 메모리 추가
175
- */
176
- async addTeamMemory(teamPath, input) {
177
- const response = await this.request('POST', `/teams/${encodeURIComponent(teamPath)}/memories`, input);
178
- return response;
179
- }
180
- /**
181
- * 팀 메모리 검색
182
- */
183
- async searchTeamMemories(teamPath, query, options) {
184
- const response = await this.request('POST', `/teams/${encodeURIComponent(teamPath)}/memories/search`, { query, limit: options?.limit ?? 10, category: options?.category });
185
- return response.items ?? [];
186
- }
187
- /**
188
- * Delta 생성
189
- */
190
- async generateDelta(teamPath, memoryId, vectorClock) {
191
- return this.request('POST', `/teams/${encodeURIComponent(teamPath)}/memories/sync/delta`, { memory_id: memoryId, vector_clock: vectorClock });
192
- }
193
- /**
194
- * Delta 적용
195
- */
196
- async applyDelta(teamPath, memoryId, delta) {
197
- return this.request('POST', `/teams/${encodeURIComponent(teamPath)}/memories/sync/apply`, { memory_id: memoryId, delta });
198
- }
199
- /**
200
- * 배치 메모리 생성 (최대 100개/요청)
201
- */
202
- async createMemoriesBatch(items) {
203
- const response = await this.request('POST', '/api/v1/memories/batch', { items });
204
- return response;
205
- }
206
- /**
207
- * 연결 테스트
208
- */
209
- async testConnection() {
210
- try {
211
- await this.request('GET', '/api/v1/memories?limit=1');
212
- return true;
213
- }
214
- catch {
215
- return false;
216
- }
217
- }
218
- // ============================
219
- // Advanced API
220
- // ============================
221
- /**
222
- * 컨텍스트 조합 (서버 고급 검색)
223
- */
224
- async assembleContext(query, options) {
225
- const response = await this.request('POST', '/api/v1/memories/assemble', {
226
- query,
227
- max_memories: options?.maxMemories ?? 5,
228
- max_tokens: options?.maxTokens ?? 2000,
229
- categories: options?.categories,
230
- tier: options?.tier,
231
- });
232
- return response;
233
- }
234
- /**
235
- * 메모리 강화 (access_count 증가)
236
- */
237
- async reinforceMemory(id) {
238
- const response = await this.request('POST', `/api/v1/memories/${id}/reinforce`);
239
- return response;
240
- }
241
- /**
242
- * 메모리 승격 (semantic tier로 고정)
243
- * NOTE: 서버는 target_tier 파라미터를 무시하고 항상 semantic으로 승격합니다.
244
- */
245
- async promoteMemory(id, _targetTier) {
246
- const response = await this.request('POST', `/api/v1/memories/${id}/promote`);
247
- return response;
248
- }
249
- /**
250
- * 통계 조회
251
- */
252
- async getStats() {
253
- const response = await this.request('GET', '/api/v1/memories/stats');
254
- return response;
255
- }
256
- /**
257
- * 인기 태그 조회
258
- */
259
- async getPopularTags(limit = 10) {
260
- const params = new URLSearchParams();
261
- params.set('limit', limit.toString());
262
- const path = `/api/v1/memories/tags/popular?${params.toString()}`;
263
- const response = await this.request('GET', path);
264
- return response.items ?? [];
265
- }
266
- /**
267
- * 팀 통계 조회
268
- */
269
- async getTeamStats(teamPath) {
270
- // team.py: GET /teams/{team_path}/memories/stats
271
- const response = await this.request('GET', `/teams/${encodeURIComponent(teamPath)}/memories/stats`);
272
- const data = response;
273
- const stats = data.stats ?? data;
274
- return {
275
- totalMemories: stats.total_memories ?? 0,
276
- totalNodes: stats.total_nodes ?? 0,
277
- lastSyncedAt: stats.last_synced_at ?? null,
278
- };
279
- }
280
- // ============================
281
- // Proficiency API
282
- // ============================
283
- /**
284
- * 숙련도 이벤트 전송
285
- */
286
- async postProficiencyEvent(event) {
287
- const response = await this.request('POST', '/api/v1/proficiency/event', {
288
- skill_memory_id: event.skill_memory_id,
289
- outcome: event.outcome,
290
- difficulty: event.difficulty,
291
- context_tags: event.context_tags,
292
- session_id: event.session_id,
293
- });
294
- return response;
295
- }
296
- /**
297
- * 배치 이벤트 전송 (오프라인 큐 flush용)
298
- */
299
- async postProficiencyEventBatch(events) {
300
- await this.request('POST', '/api/v1/proficiency/event/batch', { events });
301
- }
302
- /**
303
- * 숙련도 목록 조회 (캐시용)
304
- */
305
- async listProficiencies(projectPath) {
306
- const params = new URLSearchParams();
307
- params.set('page_size', '100');
308
- if (projectPath)
309
- params.set('project_path', projectPath);
310
- const path = `/api/v1/proficiency?${params.toString()}`;
311
- const response = await this.request('GET', path);
312
- return (response.items ?? []);
313
- }
314
- // ============================
315
- // Emotion API
316
- // ============================
317
- async analyzeEmotion(message) {
318
- return this.request('POST', '/api/v1/personalization/emotion/analyze', {
319
- message: message.slice(0, 500),
320
- });
321
- }
322
- // ============================
323
- // Transfer API
324
- // ============================
325
- /**
326
- * 숙련도 내보내기
327
- */
328
- async exportProficiencies(sourceProvider, skillIds) {
329
- const response = await this.request('POST', '/api/v1/transfer/export', {
330
- source_provider: sourceProvider,
331
- skill_ids: skillIds ?? null,
332
- });
333
- return response;
334
- }
335
- /**
336
- * 숙련도 가져오기
337
- */
338
- async importProficiencies(pkg, targetProvider) {
339
- const response = await this.request('POST', '/api/v1/transfer/import', {
340
- package: pkg,
341
- target_provider: targetProvider,
342
- });
343
- return response;
344
- }
345
- /**
346
- * 호환성 매트릭스 조회
347
- */
348
- async getCompatibilityMatrix() {
349
- const response = await this.request('GET', '/api/v1/transfer/compatibility');
350
- return (response.matrix ?? []);
351
- }
352
- /**
353
- * 이식 이력 조회
354
- */
355
- async getTransferHistory(page = 1) {
356
- const params = new URLSearchParams();
357
- params.set('page', page.toString());
358
- const path = `/api/v1/transfer/history?${params.toString()}`;
359
- const response = await this.request('GET', path);
360
- return response;
361
- }
362
- // ============================
363
- // File API
364
- // ============================
365
- /**
366
- * 파일 업로드 (multipart/form-data)
367
- * POST /api/v1/files/upload
368
- */
369
- /**
370
- * 파일 업로드 (multipart/form-data)
371
- * POST /api/v1/files/upload
372
- * 서버 응답: { file_id, filename, storage_path, content_hash, size }
373
- */
374
- async uploadFile(filePath, options) {
375
- const { readFileSync } = await import('node:fs');
376
- const { basename } = await import('node:path');
377
- const content = readFileSync(filePath);
378
- const filename = basename(filePath);
379
- const formData = new FormData();
380
- formData.append('file', new Blob([content]), filename);
381
- if (options.category) {
382
- formData.append('category', options.category);
383
- }
384
- if (options.tags && options.tags.length > 0) {
385
- formData.append('tags', options.tags.join(','));
386
- }
387
- const response = await this.requestMultipart('POST', '/api/v1/files/upload', formData);
388
- const data = response;
389
- return { id: data.file_id, filename: data.filename };
390
- }
391
- /**
392
- * 파일 중복 확인
393
- * POST /api/v1/files/check-duplicate { content_hash }
394
- * 서버 응답: { is_duplicate: bool, existing_file?: { id, ... } }
395
- */
396
- async checkFileDuplicate(contentHash) {
397
- const response = await this.request('POST', '/api/v1/files/check-duplicate', {
398
- content_hash: contentHash,
399
- });
400
- const data = response;
401
- return {
402
- exists: data.is_duplicate,
403
- file_id: data.existing_file?.id,
404
- };
405
- }
406
- /**
407
- * 메모리-파일 연결 생성
408
- * POST /api/v1/memory-files
409
- */
410
- async createMemoryFileLink(memoryId, fileId, options) {
411
- const response = await this.request('POST', '/api/v1/memory-files', {
412
- memory_id: memoryId,
413
- file_id: fileId,
414
- reference_type: options.reference_type,
415
- reference_path: options.reference_path,
416
- });
417
- return response;
418
- }
419
- // ============================
420
- // MCG API
421
- // ============================
422
- /**
423
- * MCG Context 생성
424
- * POST /api/v1/mcg/contexts
425
- */
426
- async createContext(data) {
427
- return this.request('POST', '/api/v1/mcg/contexts', data);
428
- }
429
- /**
430
- * MCG Context Member 추가
431
- * POST /api/v1/mcg/contexts/{contextId}/members
432
- */
433
- async addContextMember(contextId, data) {
434
- return this.request('POST', `/api/v1/mcg/contexts/${contextId}/members`, data);
435
- }
436
- /**
437
- * MCG Relation 생성
438
- * POST /api/v1/mcg/relations
439
- */
440
- async createRelation(data) {
441
- return this.request('POST', '/api/v1/mcg/relations', data);
442
- }
443
- // ============================
444
- // Taxonomy API
445
- // ============================
446
- /**
447
- * 콘텐츠를 Taxonomy로 분류
448
- * 서버가 없거나 실패 시 null 반환 (graceful degradation)
449
- */
450
- async classifyContent(input) {
451
- try {
452
- const response = await this.request('POST', '/api/v1/taxonomy/classify', {
453
- content: input.content.slice(0, 2000), // 길이 제한
454
- tags: input.tags ?? [],
455
- category: input.category,
456
- });
457
- const data = response;
458
- if (data.success && data.result) {
459
- return data.result;
460
- }
461
- return null;
462
- }
463
- catch {
464
- return null; // 서버 연결 실패 등 모든 에러 무시
465
- }
466
- }
467
- /** 재시도 가능한 상태 코드 (5xx, 429) */
468
- static RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);
469
- static MAX_RETRIES = 3;
470
- static BASE_DELAY_MS = 1000;
471
- /**
472
- * HTTP 요청 실행 (5xx/429/네트워크 오류 시 최대 3회 재시도, exponential backoff)
473
- */
474
- async request(method, path, body) {
475
- let lastError;
476
- for (let attempt = 0; attempt < A2AClient.MAX_RETRIES; attempt++) {
477
- const url = `${this.config.baseUrl}${path}`;
478
- const controller = new AbortController();
479
- const timeoutId = setTimeout(() => controller.abort(), this.timeout);
480
- try {
481
- const response = await fetch(url, {
482
- method,
483
- headers: {
484
- 'Content-Type': 'application/json',
485
- 'x-api-key': this.config.apiKey,
486
- 'X-Plugin-Version': _pluginVersion,
487
- ...(this.enabledFeatures.length > 0 && {
488
- 'X-Plugin-Features': this.enabledFeatures.join(','),
489
- }),
490
- },
491
- body: body ? JSON.stringify(body) : undefined,
492
- signal: controller.signal,
493
- });
494
- clearTimeout(timeoutId);
495
- // 재시도 가능한 상태 코드 (5xx, 429)
496
- if (A2AClient.RETRYABLE_STATUS.has(response.status) && attempt < A2AClient.MAX_RETRIES - 1) {
497
- const delay = A2AClient.BASE_DELAY_MS * Math.pow(2, attempt); // 1s → 2s → 4s
498
- await new Promise((resolve) => setTimeout(resolve, delay));
499
- continue;
500
- }
501
- if (!response.ok) {
502
- await this.handleErrorResponse(response);
503
- }
504
- // DELETE는 빈 응답일 수 있음
505
- if (method === 'DELETE' && response.status === 204) {
506
- return;
507
- }
508
- return await response.json();
509
- }
510
- catch (error) {
511
- clearTimeout(timeoutId);
512
- if (error instanceof Error) {
513
- // 401, 403, 404 등 클라이언트 에러는 즉시 throw (재시도 무의미)
514
- if (error.message.startsWith('인증 실패') ||
515
- error.message.startsWith('HTTP 403') ||
516
- error.message.startsWith('HTTP 404') ||
517
- error.message.startsWith('HTTP 422')) {
518
- throw error;
519
- }
520
- // 네트워크 에러 또는 타임아웃: 재시도 가능
521
- if (attempt < A2AClient.MAX_RETRIES - 1) {
522
- lastError = error;
523
- const delay = A2AClient.BASE_DELAY_MS * Math.pow(2, attempt);
524
- await new Promise((resolve) => setTimeout(resolve, delay));
525
- continue;
526
- }
527
- if (error.name === 'AbortError') {
528
- throw new Error(`요청 시간 초과: ${this.timeout}ms를 넘었습니다`);
529
- }
530
- throw new Error(`네트워크 오류: ${error.message}`);
531
- }
532
- throw error;
533
- }
534
- }
535
- // 모든 재시도 실패
536
- throw lastError ?? new Error(`요청 실패: ${A2AClient.MAX_RETRIES}회 재시도 후 실패`);
537
- }
538
- /**
539
- * multipart/form-data 요청 실행 (파일 업로드 전용)
540
- * Content-Type 헤더를 직접 설정하지 않아야 브라우저/Node가 boundary를 자동 설정합니다.
541
- */
542
- async requestMultipart(method, path, body) {
543
- const url = `${this.config.baseUrl}${path}`;
544
- const controller = new AbortController();
545
- const timeoutId = setTimeout(() => controller.abort(), this.timeout);
546
- try {
547
- const response = await fetch(url, {
548
- method,
549
- headers: {
550
- 'x-api-key': this.config.apiKey,
551
- 'X-Plugin-Version': _pluginVersion,
552
- },
553
- body,
554
- signal: controller.signal,
555
- });
556
- clearTimeout(timeoutId);
557
- if (!response.ok) {
558
- await this.handleErrorResponse(response);
559
- }
560
- return await response.json();
561
- }
562
- catch (error) {
563
- clearTimeout(timeoutId);
564
- if (error instanceof Error && error.name === 'AbortError') {
565
- throw new Error(`요청 시간 초과: ${this.timeout}ms를 넘었습니다`);
566
- }
567
- throw error;
568
- }
569
- }
570
- /**
571
- * 에러 응답 처리
572
- */
573
- async handleErrorResponse(response) {
574
- const status = response.status;
575
- if (status === 401) {
576
- throw new Error('인증 실패: API Key를 확인하세요');
577
- }
578
- if (status === 429) {
579
- throw new Error('요청 제한: 잠시 후 다시 시도하세요');
580
- }
581
- let message = `HTTP ${status}`;
582
- try {
583
- const errorBody = await response.json();
584
- if (errorBody.detail) {
585
- message += `: ${errorBody.detail}`;
586
- }
587
- else if (errorBody.message) {
588
- message += `: ${errorBody.message}`;
589
- }
590
- }
591
- catch {
592
- // JSON 파싱 실패 시 기본 메시지 사용
593
- }
594
- throw new Error(message);
595
- }
596
- }
597
- //# sourceMappingURL=client.js.map
1
+ (function(_0x4b6977,_0x334b20){function _0x5efd23(_0x1e5465,_0x3420ef){return _0x1e1d(_0x3420ef-0x149,_0x1e5465);}const _0x2e43a9=_0x4b6977();function _0x3cfe6a(_0x20fb24,_0x9d94cc){return _0x1e1d(_0x20fb24- -0x3d4,_0x9d94cc);}while(!![]){try{const _0x2d8e48=parseInt(_0x5efd23(0x3c2,0x3b2))/0x1*(-parseInt(_0x3cfe6a(-0x1c4,-0x21b))/0x2)+parseInt(_0x5efd23(0x3bc,0x37c))/0x3*(-parseInt(_0x5efd23(0x3aa,0x33e))/0x4)+-parseInt(_0x5efd23(0x32f,0x316))/0x5+parseInt(_0x3cfe6a(-0x24f,-0x2b1))/0x6*(parseInt(_0x5efd23(0x3a6,0x397))/0x7)+parseInt(_0x5efd23(0x341,0x2e2))/0x8+-parseInt(_0x3cfe6a(-0x232,-0x21b))/0x9+parseInt(_0x5efd23(0x27b,0x2d5))/0xa*(parseInt(_0x3cfe6a(-0x17d,-0x18a))/0xb);if(_0x2d8e48===_0x334b20)break;else _0x2e43a9['push'](_0x2e43a9['shift']());}catch(_0x4abc07){_0x2e43a9['push'](_0x2e43a9['shift']());}}}(_0x20c5,0x679a8));import{encryptContent,decryptContent,wrapEncryptedContent,unwrapEncryptedContent}from'./encryption.js';function _0x277c3d(_0x531c01,_0x48dca5){return _0x1e1d(_0x48dca5-0x1ed,_0x531c01);}let _pluginVersion=_0x277c3d(0x40d,0x436);function _0x127a1a(_0x5ea2c1,_0x2e6be8){return _0x1e1d(_0x5ea2c1- -0x3d5,_0x2e6be8);}function _0x1e1d(_0x5aef51,_0x466168){_0x5aef51=_0x5aef51-0x16d;const _0x20c596=_0x20c5();let _0x1e1dd1=_0x20c596[_0x5aef51];if(_0x1e1d['GwjIkS']===undefined){var _0x4af48f=function(_0x5deda3){const _0x338867='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1054fd='',_0x2467e0='';for(let _0x5ad976=0x0,_0x1f3244,_0x3c3025,_0x939ba7=0x0;_0x3c3025=_0x5deda3['charAt'](_0x939ba7++);~_0x3c3025&&(_0x1f3244=_0x5ad976%0x4?_0x1f3244*0x40+_0x3c3025:_0x3c3025,_0x5ad976++%0x4)?_0x1054fd+=String['fromCharCode'](0xff&_0x1f3244>>(-0x2*_0x5ad976&0x6)):0x0){_0x3c3025=_0x338867['indexOf'](_0x3c3025);}for(let _0x4a746b=0x0,_0x5162cb=_0x1054fd['length'];_0x4a746b<_0x5162cb;_0x4a746b++){_0x2467e0+='%'+('00'+_0x1054fd['charCodeAt'](_0x4a746b)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2467e0);};_0x1e1d['SWqsEz']=_0x4af48f,_0x1e1d['kasVsp']={},_0x1e1d['GwjIkS']=!![];}const _0x25eef4=_0x20c596[0x0],_0x41afbd=_0x5aef51+_0x25eef4,_0x2f0971=_0x1e1d['kasVsp'][_0x41afbd];return!_0x2f0971?(_0x1e1dd1=_0x1e1d['SWqsEz'](_0x1e1dd1),_0x1e1d['kasVsp'][_0x41afbd]=_0x1e1dd1):_0x1e1dd1=_0x2f0971,_0x1e1dd1;}try{const {readFileSync}=await import(_0x127a1a(-0x1cf,-0x1b4)),{fileURLToPath}=await import(_0x127a1a(-0x18b,-0x163)),{dirname,join}=await import('node:path'),__dirname=dirname(fileURLToPath(import.meta.url)),pkg=JSON[_0x277c3d(0x385,0x3f7)](readFileSync(join(__dirname,_0x127a1a(-0x25c,-0x20f)+_0x127a1a(-0x176,-0x16e)),'utf-8'));_pluginVersion=pkg[_0x277c3d(0x321,0x38b)]||'0.0.0';}catch{}export class A2AClient{[_0x127a1a(-0x24d,-0x2a8)];['timeout'];[_0x277c3d(0x3db,0x439)+_0x277c3d(0x2f2,0x36a)]=null;[_0x127a1a(-0x19a,-0x1c1)+_0x277c3d(0x3d0,0x3fa)]=[];constructor(_0xe320ce){this['config']=_0xe320ce;function _0x398c57(_0x1253f8,_0x354d16){return _0x127a1a(_0x354d16-0x213,_0x1253f8);}function _0x60af67(_0x5555d9,_0x47eb1b){return _0x127a1a(_0x5555d9-0x4,_0x47eb1b);}this[_0x60af67(-0x262,-0x2cc)]=_0xe320ce[_0x60af67(-0x262,-0x2b8)]??0xea60;}[_0x277c3d(0x318,0x38d)+_0x277c3d(0x301,0x35e)](_0x551e06){function _0x45990a(_0x47bb99,_0x2ded89){return _0x127a1a(_0x2ded89-0x3a,_0x47bb99);}function _0x3939c2(_0xf1f73d,_0x38d2e5){return _0x127a1a(_0xf1f73d-0x36b,_0x38d2e5);}this[_0x45990a(-0x117,-0x160)+_0x3939c2(0x1a3,0x17a)]=_0x551e06;}['setEncrypt'+_0x277c3d(0x3c9,0x3a0)](_0x12ce3a){function _0x4075df(_0x569d26,_0xb8c620){return _0x127a1a(_0xb8c620-0x608,_0x569d26);}const _0xc93008={'fbIzC':_0x4075df(0x37d,0x3dc)+_0x4075df(0x417,0x42a)+'다'};function _0x2e85fd(_0x559de1,_0x356d9e){return _0x127a1a(_0x356d9e-0xda,_0x559de1);}if(_0x12ce3a[_0x2e85fd(-0x7a,-0xb9)]!==0x20)throw new Error(_0xc93008[_0x2e85fd(-0x139,-0x121)]);this[_0x4075df(0x45e,0x47f)+_0x2e85fd(-0x17c,-0x17e)]=_0x12ce3a;}[_0x277c3d(0x452,0x3fc)+_0x127a1a(-0x1e2,-0x23e)](){function _0x3ba7d1(_0x471268,_0x5c0fe7){return _0x277c3d(_0x471268,_0x5c0fe7- -0x52f);}function _0x2acdd4(_0x564570,_0x16ac6e){return _0x277c3d(_0x16ac6e,_0x564570-0x19e);}this[_0x3ba7d1(-0x155,-0xf6)+_0x3ba7d1(-0x208,-0x1c5)]=null;}[_0x277c3d(0x36a,0x3b6)+'onEnabled'](){function _0x116279(_0x1c84dd,_0x5d7861){return _0x127a1a(_0x1c84dd-0x713,_0x5d7861);}function _0x4618df(_0x3ebde3,_0x33f9ba){return _0x127a1a(_0x3ebde3- -0xa,_0x33f9ba);}const _0x5a67ae={'mjoTP':function(_0x32ff6c,_0x18b842){return _0x32ff6c!==_0x18b842;}};return _0x5a67ae[_0x4618df(-0x22e,-0x1d9)](this[_0x116279(0x58a,0x5b4)+'Key'],null);}async[_0x277c3d(0x425,0x41f)+'ry'](_0x1148d7){const _0xb8cab1={'hXOkk':function(_0x38197e,_0x44c0f5,_0x1d5078){return _0x38197e(_0x44c0f5,_0x1d5078);},'wSpQt':function(_0xd5ba79,_0x3250f9){return _0xd5ba79(_0x3250f9);},'DeJrC':_0x12d219(0x2d,0x8a)+_0x12d219(-0x2e,-0x15),'bPMtQ':function(_0x4ea647,_0x520020){return _0x4ea647!==_0x520020;}};let _0x58badc=_0x1148d7[_0x51ce28(0x464,0x4e2)];function _0x51ce28(_0x567b2c,_0x4ff8c9){return _0x277c3d(_0x567b2c,_0x4ff8c9-0xb4);}if(this[_0x12d219(0x78,0xd3)+_0x51ce28(0x3f1,0x41e)]){const _0x496d87=_0xb8cab1[_0x12d219(0x49,0x2a)](encryptContent,_0x1148d7['content'],this[_0x51ce28(0x52a,0x4ed)+'Key']);_0x58badc=_0xb8cab1[_0x12d219(-0x16,0x45)](wrapEncryptedContent,_0x496d87);}function _0x12d219(_0x2d4807,_0x5a2306){return _0x277c3d(_0x5a2306,_0x2d4807- -0x3c1);}const _0x867aa2=await this[_0x12d219(0x50,0x55)](_0x51ce28(0x4af,0x43e),_0xb8cab1[_0x12d219(0x15,0x59)],{'content':_0x58badc,'category':_0x1148d7['category'],'tier':_0x1148d7[_0x51ce28(0x48d,0x49a)],'tags':_0x1148d7[_0x51ce28(0x557,0x4f9)]??[]}),_0x30ca6c=_0x867aa2;if(this[_0x12d219(0x78,0x10)+_0x12d219(-0x57,-0xa4)]&&_0x30ca6c[_0x12d219(0x6d,0xd4)]){const _0x2dbb68=_0xb8cab1[_0x51ce28(0x43b,0x45f)](unwrapEncryptedContent,_0x30ca6c[_0x12d219(0x6d,0xa3)]);if(_0x2dbb68){if(_0xb8cab1[_0x12d219(-0x28,-0x7b)](_0x51ce28(0x4be,0x458),_0x12d219(-0x1d,-0xc)))return this[_0x12d219(0x50,-0x2b)]('POST',_0x51ce28(0x3ef,0x46c)+_0x535fbd(_0x207bad)+(_0x12d219(0x1c,0x52)+_0x51ce28(0x3d3,0x42b)),{'memory_id':_0x196441,'delta':_0xf9213f});else _0x30ca6c['content']=decryptContent(_0x2dbb68,this[_0x51ce28(0x4c0,0x4ed)+_0x51ce28(0x47e,0x41e)]);}}return _0x30ca6c;}async[_0x127a1a(-0x1d9,-0x1f2)+'ries'](_0xfb420c,_0x2b59d5){const _0x2d2de0={'tMrcy':_0xd49d71(0x38a,0x32e)};function _0x55245f(_0x5856bf,_0x260f6c){return _0x277c3d(_0x260f6c,_0x5856bf- -0x6a);}function _0xd49d71(_0x3b3621,_0x4aca27){return _0x277c3d(_0x3b3621,_0x4aca27- -0x5c);}const _0x4ba805=await this['request'](_0x2d2de0[_0x55245f(0x35c,0x3c6)],_0xd49d71(0x337,0x392)+_0x55245f(0x3b2,0x3d5)+_0xd49d71(0x37b,0x3e6),{'query':_0xfb420c,'limit':_0x2b59d5?.[_0xd49d71(0x465,0x3f3)]??0xa,'category':_0x2b59d5?.[_0x55245f(0x2f5,0x28c)]});return _0x4ba805[_0xd49d71(0x32d,0x327)]??[];}async[_0x127a1a(-0x259,-0x240)+'es'](_0x4fb0be){const _0x35153c={'msmPF':_0x4e2bc6(0x65,0xbc)+_0x4e2bc6(0xb3,0x87)+'다','eENER':'limit','JqHFD':_0x16e17f(0x259,0x23d),'mTyXw':_0x16e17f(0x1fa,0x1ca)+_0x16e17f(0x1f9,0x1af),'ZJRjd':'true','TfcKU':_0x16e17f(0x1c1,0x1cd),'KYjKa':function(_0x540747,_0xbdb167){return _0x540747===_0xbdb167;},'ywPhe':_0x16e17f(0x289,0x217)},_0x3ed759=new URLSearchParams();function _0x16e17f(_0x56ab8d,_0x55f81b){return _0x127a1a(_0x56ab8d-0x416,_0x55f81b);}if(_0x4fb0be?.[_0x16e17f(0x2a3,0x24a)])_0x3ed759[_0x16e17f(0x1ce,0x1f4)](_0x35153c[_0x4e2bc6(0xe3,0x96)],_0x4fb0be[_0x16e17f(0x2a3,0x23b)][_0x4e2bc6(0x2a,0x26)]());if(_0x4fb0be?.[_0x16e17f(0x259,0x215)])_0x3ed759[_0x16e17f(0x1ce,0x1d7)](_0x35153c[_0x16e17f(0x230,0x210)],_0x4fb0be[_0x4e2bc6(0xd4,0xf3)][_0x16e17f(0x1af,0x1cd)]());if(_0x4fb0be?.['includeEmb'+_0x16e17f(0x28e,0x28c)])_0x3ed759['set'](_0x35153c['mTyXw'],_0x35153c['ZJRjd']);const _0x1c8827=_0x4e2bc6(0xbd,0x101)+_0x16e17f(0x1e7,0x234)+(_0x3ed759[_0x16e17f(0x1af,0x1a5)]()?'?'+_0x3ed759[_0x16e17f(0x1af,0x1fe)]():''),_0x4689df=await this[_0x16e17f(0x265,0x251)](_0x35153c[_0x16e17f(0x29b,0x2c8)],_0x1c8827);function _0x4e2bc6(_0xe9dde5,_0x47543e){return _0x127a1a(_0xe9dde5-0x291,_0x47543e);}const _0xe19e8f=_0x4689df['items']??[];if(this[_0x16e17f(0x28d,0x214)+_0x4e2bc6(0x39,-0x2a)]){if(_0x35153c[_0x16e17f(0x1e2,0x173)](_0x35153c['ywPhe'],_0x4e2bc6(0x6b,0xa4)))throw new _0x46cabd(iWqitk[_0x16e17f(0x276,0x2e8)]);else return _0xe19e8f['map'](_0x2741f3=>this[_0x16e17f(0x26f,0x1f7)+_0x16e17f(0x1ef,0x19c)](_0x2741f3));}return _0xe19e8f;}[_0x277c3d(0x461,0x41b)+_0x277c3d(0x3e2,0x39b)](_0x576df5){const _0x1bdb28={'tbYzL':function(_0x4df7e9,_0x3aad05,_0x4e6ed0){return _0x4df7e9(_0x3aad05,_0x4e6ed0);}};if(!this[_0x18485d(-0xd1,-0x13c)+_0x18485d(-0x22d,-0x20b)])return _0x576df5;function _0x18485d(_0x536bc8,_0x22a183){return _0x277c3d(_0x536bc8,_0x22a183- -0x575);}function _0x3609c2(_0x52f87b,_0x4c9a38){return _0x277c3d(_0x52f87b,_0x4c9a38- -0x1af);}const _0x29e968={..._0x576df5};if(_0x29e968[_0x3609c2(0x261,0x27f)]){const _0x2b482f=unwrapEncryptedContent(_0x29e968[_0x3609c2(0x269,0x27f)]);if(_0x2b482f)try{_0x29e968[_0x3609c2(0x222,0x27f)]=_0x1bdb28[_0x3609c2(0x291,0x23c)](decryptContent,_0x2b482f,this[_0x18485d(-0xd4,-0x13c)+_0x3609c2(0x185,0x1bb)]);}catch{}}return _0x29e968;}async['updateMemo'+'ry'](_0x127746,_0x26aa06){function _0x9f79bf(_0x55e574,_0x16038d){return _0x277c3d(_0x16038d,_0x55e574- -0x52a);}const _0x4dcaa3=await this[_0x9f79bf(-0x119,-0xc9)](_0x9f79bf(-0x160,-0x118),_0x9f79bf(-0x13c,-0x182)+_0x33ed01(0x275,0x260)+_0x127746,_0x26aa06);function _0x33ed01(_0x529852,_0x1a2ff4){return _0x277c3d(_0x1a2ff4,_0x529852- -0x19e);}return _0x4dcaa3;}async[_0x127a1a(-0x185,-0x1c9)+'ry'](_0x4c3db0){const _0x1ab30a={'zHwMt':'DELETE'};function _0x79685(_0x26077f,_0x52dd09){return _0x127a1a(_0x26077f-0x170,_0x52dd09);}function _0x249692(_0x2e7eb1,_0x4713b8){return _0x127a1a(_0x4713b8-0x4a6,_0x2e7eb1);}await this[_0x79685(-0x41,0x3e)](_0x1ab30a[_0x249692(0x375,0x308)],'/api/v1/me'+_0x249692(0x304,0x2f7)+_0x4c3db0);}async[_0x127a1a(-0x1f5,-0x1d2)](){function _0x3b9a69(_0x5f3c67,_0x3f3ea9){return _0x277c3d(_0x3f3ea9,_0x5f3c67- -0x2b5);}const _0x18d8fb={'YCmfp':_0x4d68ef(-0xe0,-0x98)+_0x3b9a69(0xee,0x7c)},_0x155e9e=await this['request'](_0x3b9a69(0xb8,0x72),_0x18d8fb['YCmfp']);if(Array['isArray'](_0x155e9e))return _0x155e9e;function _0x4d68ef(_0x72d0e9,_0x693633){return _0x277c3d(_0x72d0e9,_0x693633- -0x4de);}return _0x155e9e['items']??[];}async['listTeamMe'+_0x277c3d(0x405,0x393)](_0x7fea50,_0x61d0fb){const _0x1699b0={'kTYNc':'limit','htWFx':_0x57216a(0x504,0x4cf)},_0x383668=new URLSearchParams();function _0x57216a(_0x582139,_0x219d4a){return _0x127a1a(_0x582139-0x759,_0x219d4a);}if(_0x61d0fb?.['limit'])_0x383668[_0x57216a(0x511,0x4e4)](_0x1699b0['kTYNc'],_0x61d0fb['limit'][_0x57216a(0x4f2,0x54c)]());if(_0x61d0fb?.['offset'])_0x383668[_0x322aa6(0x170,0x188)](_0x57216a(0x59c,0x59b),_0x61d0fb[_0x322aa6(0x1fb,0x19e)][_0x57216a(0x4f2,0x4f4)]());function _0x322aa6(_0x2d32df,_0x3024c4){return _0x127a1a(_0x2d32df-0x3b8,_0x3024c4);}const _0x5e7480=_0x383668[_0x57216a(0x4f2,0x4f6)](),_0x155dfc=_0x57216a(0x54f,0x4d4)+encodeURIComponent(_0x7fea50)+_0x57216a(0x566,0x5ab)+(_0x5e7480?'?'+_0x5e7480:''),_0x35438f=await this[_0x57216a(0x5a8,0x536)](_0x1699b0[_0x57216a(0x507,0x48d)],_0x155dfc);return _0x35438f[_0x57216a(0x51a,0x4a4)]??[];}async[_0x127a1a(-0x1d2,-0x176)+_0x277c3d(0x36f,0x39b)](_0x4957e9,_0x3be03d){const _0x1cc973=await this[_0x5a257b(-0x80,-0xee)](_0x42c90d(-0x158,-0x16a),_0x42c90d(-0x158,-0x13c)+encodeURIComponent(_0x4957e9)+'/memories',_0x3be03d);function _0x5a257b(_0x5228,_0x252689){return _0x127a1a(_0x5228-0x131,_0x252689);}function _0x42c90d(_0x4fd2cb,_0x100219){return _0x127a1a(_0x100219-0xce,_0x4fd2cb);}return _0x1cc973;}async[_0x277c3d(0x33b,0x3a7)+_0x127a1a(-0x1b7,-0x1c1)](_0x814dd4,_0x12cf8a,_0x1e3164){function _0x3d82d8(_0x2fd704,_0xe2fd21){return _0x277c3d(_0x2fd704,_0xe2fd21-0x7f);}function _0x1f4d13(_0x3e9605,_0x13072a){return _0x277c3d(_0x3e9605,_0x13072a- -0x269);}const _0xf3e9fa={'yERvp':_0x1f4d13(0x179,0x121),'EBUDo':function(_0x34ffb5,_0x4bfc00){return _0x34ffb5(_0x4bfc00);}},_0x35ba24=await this['request'](_0xf3e9fa['yERvp'],_0x3d82d8(0x496,0x437)+_0xf3e9fa['EBUDo'](encodeURIComponent,_0x814dd4)+(_0x1f4d13(0x12e,0x174)+_0x3d82d8(0x3cf,0x431)),{'query':_0x12cf8a,'limit':_0x1e3164?.['limit']??0xa,'category':_0x1e3164?.[_0x1f4d13(0xad,0xf6)]});return _0x35ba24[_0x1f4d13(0x157,0x11a)]??[];}async['generateDe'+_0x277c3d(0x33c,0x3b5)](_0x462471,_0x278afe,_0x3b2797){function _0x4e26bc(_0x3ccae3,_0x5aa3c7){return _0x277c3d(_0x5aa3c7,_0x3ccae3- -0x277);}function _0x203e8d(_0x5c39e5,_0x33cf26){return _0x277c3d(_0x5c39e5,_0x33cf26-0x67);}return this['request'](_0x203e8d(0x3dd,0x3f1),_0x4e26bc(0x141,0x160)+encodeURIComponent(_0x462471)+(_0x4e26bc(0x166,0x19a)+_0x203e8d(0x3de,0x423)),{'memory_id':_0x278afe,'vector_clock':_0x3b2797});}async[_0x277c3d(0x400,0x40f)](_0x54cb3b,_0x5d3d54,_0x59a7e5){function _0x206815(_0x3979aa,_0x49aae9){return _0x277c3d(_0x3979aa,_0x49aae9-0xb1);}function _0x5d8a64(_0x22cfb1,_0x3d9d68){return _0x277c3d(_0x3d9d68,_0x22cfb1-0x1f1);}const _0x4b4aaa={'nyTXu':function(_0x160193,_0x43c7fb){return _0x160193(_0x43c7fb);}};return this[_0x206815(0x50e,0x4c2)](_0x206815(0x453,0x43b),_0x5d8a64(0x5a9,0x612)+_0x4b4aaa[_0x206815(0x4d8,0x47f)](encodeURIComponent,_0x54cb3b)+(_0x5d8a64(0x5ce,0x607)+_0x5d8a64(0x568,0x4f9)),{'memory_id':_0x5d3d54,'delta':_0x59a7e5});}async[_0x277c3d(0x415,0x41f)+_0x277c3d(0x41b,0x3b9)](_0x2c65bf){function _0x3ab0c1(_0x31cc3f,_0x47e256){return _0x127a1a(_0x31cc3f-0x6f4,_0x47e256);}const _0x499806=await this[_0x3ab0c1(0x543,0x4d1)]('POST','/api/v1/me'+_0x36a2a6(0xb9,0xae)+'ch',{'items':_0x2c65bf});function _0x36a2a6(_0x3ac1c9,_0xe3f8a5){return _0x127a1a(_0x3ac1c9-0x22e,_0xe3f8a5);}return _0x499806;}async['testConnec'+_0x127a1a(-0x1db,-0x1ab)](){const _0x48623d={'TWaCx':_0x5892c1(0x493,0x4bd),'jRCLC':_0x5892c1(0x4dd,0x53e)+_0xfbcbd4(0x4e4,0x4e4)+'it=1'};function _0xfbcbd4(_0x58e1e9,_0x354899){return _0x127a1a(_0x354899-0x6be,_0x58e1e9);}function _0x5892c1(_0x39a0a4,_0x4f7e54){return _0x127a1a(_0x4f7e54-0x712,_0x39a0a4);}try{return await this[_0x5892c1(0x5a1,0x561)](_0x48623d['TWaCx'],_0x48623d['jRCLC']),!![];}catch{return![];}}async['assembleCo'+_0x127a1a(-0x178,-0x185)](_0x310577,_0x2a0c44){function _0x3b7053(_0x25e287,_0x22f0d1){return _0x127a1a(_0x22f0d1-0x6cb,_0x25e287);}const _0x595b66={'bgrtk':'POST','NMhEm':'/api/v1/me'+_0x12b1d1(0x223,0x29f)+_0x12b1d1(0x166,0xeb)};function _0x12b1d1(_0x1119b4,_0x3c808e){return _0x127a1a(_0x1119b4-0x39c,_0x3c808e);}const _0x4baaec=await this[_0x3b7053(0x4c0,0x51a)](_0x595b66['bgrtk'],_0x595b66[_0x3b7053(0x452,0x491)],{'query':_0x310577,'max_memories':_0x2a0c44?.[_0x12b1d1(0x218,0x285)+'s']??0x5,'max_tokens':_0x2a0c44?.[_0x12b1d1(0x1ec,0x1e5)]??0x7d0,'categories':_0x2a0c44?.[_0x12b1d1(0x203,0x1a0)],'tier':_0x2a0c44?.['tier']});return _0x4baaec;}async[_0x277c3d(0x34f,0x390)+'emory'](_0x1652fc){function _0x47bc1c(_0x98b480,_0x3d002f){return _0x277c3d(_0x3d002f,_0x98b480- -0x262);}const _0x4ad1fa={'igJfE':_0x364623(0xe8,0x157)};function _0x364623(_0x545b03,_0x464201){return _0x277c3d(_0x545b03,_0x464201- -0x233);}const _0xd2af1f=await this[_0x364623(0x19c,0x1de)](_0x4ad1fa[_0x47bc1c(0x194,0x11c)],'/api/v1/me'+_0x47bc1c(0x1b1,0x145)+_0x1652fc+_0x364623(0x170,0x1a8));return _0xd2af1f;}async['promoteMem'+_0x127a1a(-0x227,-0x26d)](_0x5c529c,_0x1298c2){function _0x5210be(_0x2ff6b6,_0x5b0905){return _0x127a1a(_0x5b0905-0x1de,_0x2ff6b6);}function _0x2429d0(_0x441512,_0x4022cd){return _0x127a1a(_0x441512-0x4e1,_0x4022cd);}const _0x478a59=await this[_0x2429d0(0x330,0x342)](_0x5210be(-0xd1,-0x5a),_0x2429d0(0x30d,0x293)+_0x5210be(0x6e,0x2f)+_0x5c529c+_0x5210be(0xbf,0x73));return _0x478a59;}async['getStats'](){function _0x1efad5(_0xd6d1d5,_0x317b27){return _0x277c3d(_0x317b27,_0xd6d1d5-0x1d2);}const _0x877a85=await this[_0x367eb1(0x55d,0x53d)](_0x367eb1(0x4b9,0x4a1),_0x1efad5(0x5c0,0x5c6)+_0x367eb1(0x553,0x4fd)+'ts');function _0x367eb1(_0x338d7a,_0x10f781){return _0x277c3d(_0x10f781,_0x338d7a-0x14c);}return _0x877a85;}async[_0x127a1a(-0x1d8,-0x20a)+_0x127a1a(-0x1fe,-0x188)](_0x1868fc=0xa){function _0x1bba95(_0x4830b5,_0x42233e){return _0x277c3d(_0x42233e,_0x4830b5- -0x50d);}const _0x5b0b5a={'Limza':_0x1bba95(-0xbe,-0x10e)},_0x1c5398=new URLSearchParams();function _0x5e8409(_0x492493,_0x3a4017){return _0x277c3d(_0x492493,_0x3a4017-0x13c);}_0x1c5398[_0x1bba95(-0x193,-0x156)](_0x5b0b5a[_0x1bba95(-0x10f,-0x17e)],_0x1868fc[_0x1bba95(-0x1b2,-0x1c3)]());const _0x57beef=_0x5e8409(0x588,0x52a)+_0x1bba95(-0xe0,-0xe7)+_0x1bba95(-0x18f,-0x201)+_0x1c5398[_0x5e8409(0x4d8,0x497)](),_0x12ab00=await this['request'](_0x5e8409(0x484,0x4a9),_0x57beef);return _0x12ab00[_0x5e8409(0x46d,0x4bf)]??[];}async['getTeamSta'+'ts'](_0x39c9c7){const _0x4af5d3=await this[_0x4f02d0(-0x50,-0x4d)]('GET','/teams/'+encodeURIComponent(_0x39c9c7)+('/memories/'+_0x4f02d0(-0x6d,-0xa7)));function _0x4c5aa4(_0x3cbd90,_0x277e22){return _0x277c3d(_0x277e22,_0x3cbd90-0x172);}const _0x2799dd=_0x4af5d3;function _0x4f02d0(_0x33a583,_0x546d38){return _0x277c3d(_0x33a583,_0x546d38- -0x45e);}const _0x34c42c=_0x2799dd[_0x4c5aa4(0x529,0x4fb)]??_0x2799dd;return{'totalMemories':_0x34c42c[_0x4c5aa4(0x55e,0x574)+_0x4f02d0(-0xdc,-0x95)]??0x0,'totalNodes':_0x34c42c[_0x4c5aa4(0x546,0x529)+'s']??0x0,'lastSyncedAt':_0x34c42c[_0x4c5aa4(0x4e0,0x55e)+_0x4f02d0(-0x68,-0xaa)]??null};}async[_0x127a1a(-0x25d,-0x281)+_0x127a1a(-0x260,-0x2a0)](_0xbbb3b1){function _0x183e27(_0x2fba49,_0x4a6b85){return _0x127a1a(_0x4a6b85-0x12c,_0x2fba49);}function _0x5461e6(_0x50dcf7,_0x454bb0){return _0x127a1a(_0x454bb0-0x261,_0x50dcf7);}const _0x2ad322=await this['request'](_0x183e27(-0x180,-0x10c),'/api/v1/pr'+'oficiency/'+'event',{'skill_memory_id':_0xbbb3b1[_0x183e27(-0x148,-0x114)+'ry_id'],'outcome':_0xbbb3b1[_0x5461e6(0xd6,0x78)],'difficulty':_0xbbb3b1[_0x183e27(-0x27,-0x5e)],'context_tags':_0xbbb3b1['context_ta'+'gs'],'session_id':_0xbbb3b1[_0x183e27(-0x46,-0xc1)]});return _0x2ad322;}async[_0x127a1a(-0x25d,-0x2c6)+_0x277c3d(0x3a1,0x362)+_0x127a1a(-0x221,-0x29f)](_0x439dc3){function _0x3029b2(_0x3e3de5,_0x478e1a){return _0x277c3d(_0x478e1a,_0x3e3de5- -0x392);}function _0x17f20f(_0x336740,_0x324a57){return _0x277c3d(_0x336740,_0x324a57- -0x1c5);}const _0x146f23={'Gtfcs':_0x17f20f(0x1f9,0x1cc)+'oficiency/'+_0x3029b2(0x6f,0x95)+'h'};await this['request'](_0x17f20f(0x15a,0x1c5),_0x146f23[_0x17f20f(0x27b,0x20e)],{'events':_0x439dc3});}async[_0x277c3d(0x3b4,0x3f8)+_0x277c3d(0x490,0x430)](_0x198755){function _0x1f0cc4(_0x90ca76,_0x28373a){return _0x277c3d(_0x90ca76,_0x28373a- -0x274);}const _0x5d554c={'Asucd':_0x1f0cc4(0x214,0x199)},_0x5eee0d=new URLSearchParams();_0x5eee0d[_0x1f0cc4(0xc1,0x106)](_0x5d554c[_0x1f0cc4(0x1b0,0x13d)],_0x39119b(0x3d5,0x3eb));function _0x39119b(_0xc91611,_0x366137){return _0x277c3d(_0x366137,_0xc91611- -0x1c);}if(_0x198755)_0x5eee0d[_0x1f0cc4(0x138,0x106)](_0x39119b(0x3af,0x361)+'th',_0x198755);const _0x4baca8='/api/v1/pr'+_0x1f0cc4(0x168,0x16f)+_0x5eee0d[_0x1f0cc4(0x11a,0xe7)](),_0x59b292=await this['request'](_0x1f0cc4(0x133,0xf9),_0x4baca8);return _0x59b292[_0x1f0cc4(0x9f,0x10f)]??[];}async['analyzeEmo'+_0x127a1a(-0x1db,-0x201)](_0x154e35){const _0x93302b={'LrlAh':_0x44897f(0x355,0x31e)};function _0x44897f(_0x10ed43,_0x14bb87){return _0x127a1a(_0x14bb87-0x556,_0x10ed43);}function _0x17bf86(_0x24d4ac,_0x168d17){return _0x127a1a(_0x168d17-0x2dc,_0x24d4ac);}return this[_0x17bf86(0x17c,0x12b)](_0x93302b[_0x44897f(0x40b,0x3b7)],_0x17bf86(0x118,0xd8)+'rsonalizat'+_0x17bf86(0xd4,0xe2)+_0x44897f(0x38b,0x34f),{'message':_0x154e35[_0x44897f(0x3f5,0x38d)](0x0,0x1f4)});}async[_0x127a1a(-0x197,-0x19a)+_0x127a1a(-0x1b2,-0x177)](_0x1e4e93,_0x4eabce){const _0x219675={'NSiCK':_0x4ccd9d(0xea,0xec),'FRcSz':'/api/v1/tr'+_0x4ccd9d(0x169,0x107)+_0x49c493(0x1f6,0x1ed),'kfCnW':function(_0x5b94a9,_0x1762f0){return _0x5b94a9??_0x1762f0;}},_0x50d222=await this['request'](_0x219675[_0x4ccd9d(0x16c,0x150)],_0x219675[_0x4ccd9d(0x181,0x1d5)],{'source_provider':_0x1e4e93,'skill_ids':_0x219675[_0x49c493(0x1b4,0x1c4)](_0x4eabce,null)});function _0x49c493(_0x3b8ef6,_0x2531ac){return _0x277c3d(_0x2531ac,_0x3b8ef6- -0x1b3);}function _0x4ccd9d(_0x389833,_0x294b27){return _0x277c3d(_0x294b27,_0x389833- -0x2a0);}return _0x50d222;}async['importProf'+_0x277c3d(0x3df,0x410)](_0x3f3ed3,_0x3fc427){const _0x2cac4a={'laiPM':_0x21eb85(0x96,0xc9)},_0xedc36b=await this['request'](_0x2cac4a['laiPM'],_0x1f5166(0x48a,0x47e)+_0x21eb85(0x1b2,0x157)+_0x21eb85(0x119,0xe8),{'package':_0x3f3ed3,'target_provider':_0x3fc427});function _0x1f5166(_0x4eaae0,_0x429804){return _0x127a1a(_0x429804-0x6bf,_0x4eaae0);}function _0x21eb85(_0x23c810,_0x216c2e){return _0x127a1a(_0x216c2e-0x301,_0x23c810);}return _0xedc36b;}async[_0x277c3d(0x3cb,0x3ff)+'bilityMatr'+'ix'](){function _0x21b798(_0xe7f07c,_0x59c294){return _0x277c3d(_0xe7f07c,_0x59c294- -0x5bc);}const _0xa597c4={'cuxzd':_0xb1be60(0x1ee,0x196)+_0xb1be60(0x262,0x287)+_0xb1be60(0x24c,0x249)};function _0xb1be60(_0x54714b,_0x52af1e){return _0x277c3d(_0x52af1e,_0x54714b- -0x193);}const _0x5039a2=await this['request'](_0x21b798(-0x1fa,-0x24f),_0xa597c4[_0xb1be60(0x1d8,0x175)]);return _0x5039a2[_0x21b798(-0x24c,-0x227)]??[];}async[_0x127a1a(-0x200,-0x1de)+_0x277c3d(0x4b0,0x441)](_0x381da4=0x1){function _0xd1ec81(_0x38ea76,_0x5602eb){return _0x277c3d(_0x5602eb,_0x38ea76-0x11f);}const _0x4853fd={'UTMBJ':_0x338a01(0x1a9,0x1b7),'PEEAn':_0xd1ec81(0x48c,0x450)},_0x4f0b07=new URLSearchParams();_0x4f0b07['set'](_0x4853fd['UTMBJ'],_0x381da4[_0x338a01(0xc1,0x7f)]());function _0x338a01(_0x2ccd42,_0x18c603){return _0x277c3d(_0x18c603,_0x2ccd42- -0x29a);}const _0x1287a4='/api/v1/tr'+'ansfer/his'+_0xd1ec81(0x511,0x544)+_0x4f0b07[_0x338a01(0xc1,0x99)](),_0x282aaa=await this['request'](_0x4853fd[_0xd1ec81(0x522,0x594)],_0x1287a4);return _0x282aaa;}async[_0x127a1a(-0x1eb,-0x1e5)](_0x53cfa8,_0x2ceba3){const _0x1282aa={'ZlZru':_0x2f9de3(0x2a1,0x26b),'YWCCb':_0x2f9de3(0x248,0x27b),'FlPKr':function(_0x5dd5b3,_0x3e3946){return _0x5dd5b3(_0x3e3946);},'PoJer':_0x196df5(0x438,0x3f2),'wjyLz':function(_0x1ee4ee,_0x17dd32){return _0x1ee4ee===_0x17dd32;},'FDUut':'iiguM','XXjnh':function(_0x3daf24,_0xe6c4bd){return _0x3daf24!==_0xe6c4bd;},'CHBUB':'RELCJ','fxSTE':_0x196df5(0x32b,0x3a4),'RczNI':_0x2f9de3(0x22e,0x1dd)+_0x196df5(0x42d,0x3c6)},{readFileSync:_0x1ff2b3}=await import(_0x1282aa['ZlZru']),{basename:_0x2821da}=await import(_0x1282aa[_0x196df5(0x332,0x3a1)]),_0x27c12a=_0x1282aa[_0x196df5(0x402,0x433)](_0x1ff2b3,_0x53cfa8),_0x15a8ba=_0x1282aa['FlPKr'](_0x2821da,_0x53cfa8),_0xc81b07=new FormData();function _0x196df5(_0x2754c7,_0x3c4218){return _0x277c3d(_0x2754c7,_0x3c4218-0x1a);}_0xc81b07[_0x2f9de3(0x2c8,0x2c3)](_0x1282aa[_0x2f9de3(0x293,0x2ef)],new Blob([_0x27c12a]),_0x15a8ba);if(_0x2ceba3[_0x2f9de3(0x20d,0x200)]){if(_0x1282aa[_0x2f9de3(0x250,0x28d)](_0x1282aa[_0x196df5(0x434,0x44b)],_0x1282aa[_0x196df5(0x489,0x44b)]))_0xc81b07[_0x2f9de3(0x2c8,0x27d)](_0x2f9de3(0x20d,0x1c5),_0x2ceba3['category']);else throw new _0x4d5a33(_0x196df5(0x41d,0x44d)+'\x20Key를\x20확인하세'+'요');}if(_0x2ceba3['tags']&&_0x2ceba3[_0x2f9de3(0x2f3,0x2b1)][_0x196df5(0x480,0x449)]>0x0){if(_0x1282aa[_0x2f9de3(0x26f,0x2a5)](_0x196df5(0x495,0x420),_0x1282aa[_0x2f9de3(0x27f,0x27e)]))_0xc81b07['append'](_0x2f9de3(0x2f3,0x2a3),_0x2ceba3['tags'][_0x196df5(0x42b,0x3ca)](','));else return this[_0x196df5(0x497,0x453)+_0x196df5(0x31e,0x384)]!==null;}const _0x394a29=await this[_0x2f9de3(0x24b,0x27f)+_0x2f9de3(0x26b,0x23c)](_0x1282aa[_0x2f9de3(0x245,0x2b1)],_0x1282aa[_0x196df5(0x3d3,0x386)],_0xc81b07);function _0x2f9de3(_0x5745e1,_0x372fb4){return _0x277c3d(_0x372fb4,_0x5745e1- -0x152);}const _0x491fc8=_0x394a29;return{'id':_0x491fc8[_0x196df5(0x361,0x397)],'filename':_0x491fc8[_0x2f9de3(0x2ed,0x341)]};}async[_0x127a1a(-0x1a4,-0x172)+'uplicate'](_0x69e254){function _0x545c35(_0x4f8f38,_0x74e2af){return _0x127a1a(_0x74e2af-0x372,_0x4f8f38);}const _0x53fbd9=await this[_0x545c35(0x1a4,0x1c1)]('POST',_0x545c35(0x120,0x130)+_0x545c35(0x182,0x1b0)+'duplicate',{'content_hash':_0x69e254}),_0xfab9e6=_0x53fbd9;function _0x4e209e(_0x42a62f,_0x5c15a1){return _0x127a1a(_0x42a62f-0x501,_0x5c15a1);}return{'exists':_0xfab9e6['is_duplica'+'te'],'file_id':_0xfab9e6[_0x4e209e(0x2b0,0x30c)+'ile']?.['id']};}async[_0x127a1a(-0x1a3,-0x188)+_0x127a1a(-0x170,-0xf1)](_0x4b54f0,_0x41deac,_0x2017bb){function _0x47e8ec(_0x4d9e93,_0x5beb6f){return _0x277c3d(_0x5beb6f,_0x4d9e93-0x195);}const _0x49b5d8={'UWprw':_0x47e8ec(0x583,0x58d)+_0x47e8ec(0x5e5,0x5d2)};function _0x272543(_0x237410,_0x5db278){return _0x277c3d(_0x237410,_0x5db278- -0x12d);}const _0x2cd822=await this[_0x272543(0x337,0x2e4)](_0x47e8ec(0x51f,0x4d2),_0x49b5d8[_0x272543(0x207,0x247)],{'memory_id':_0x4b54f0,'file_id':_0x41deac,'reference_type':_0x2017bb[_0x272543(0x2ff,0x281)+'type'],'reference_path':_0x2017bb[_0x47e8ec(0x543,0x5b8)+_0x272543(0x288,0x26b)]});return _0x2cd822;}async[_0x127a1a(-0x261,-0x218)+_0x277c3d(0x3eb,0x3b3)](_0x126170){function _0x49826e(_0xbe322e,_0xecc91){return _0x127a1a(_0xbe322e-0x6f9,_0xecc91);}const _0x2c8f6e={'MZdLD':'/api/v1/mc'+'g/contexts'};function _0x1911ea(_0x45547c,_0x447ba6){return _0x127a1a(_0x447ba6-0x5d2,_0x45547c);}return this[_0x1911ea(0x418,0x421)](_0x49826e(0x4c1,0x4d9),_0x2c8f6e['MZdLD'],_0x126170);}async[_0x127a1a(-0x1a5,-0x21f)+'Member'](_0x560d19,_0x214e52){function _0x7d82c7(_0x334434,_0xe1f81d){return _0x127a1a(_0x334434-0x264,_0xe1f81d);}function _0x36909e(_0x29f5f0,_0x2dcac5){return _0x127a1a(_0x2dcac5-0x2f6,_0x29f5f0);}return this[_0x36909e(0x185,0x145)](_0x7d82c7(0x2c,0x24),'/api/v1/mc'+'g/contexts'+'/'+_0x560d19+_0x36909e(0x10d,0x14b),_0x214e52);}async['createRela'+_0x127a1a(-0x1db,-0x1bd)](_0x245bb6){function _0x195658(_0xd0cd58,_0x540ac1){return _0x127a1a(_0x540ac1-0x223,_0xd0cd58);}function _0x527a4c(_0x36c7eb,_0x1294bd){return _0x127a1a(_0x1294bd-0x6ea,_0x36c7eb);}return this[_0x527a4c(0x4bc,0x539)](_0x195658(-0x52,-0x15),'/api/v1/mc'+'g/relation'+'s',_0x245bb6);}async[_0x277c3d(0x426,0x453)+_0x127a1a(-0x223,-0x1eb)](_0x3fbc50){function _0x405060(_0x3f1944,_0x10ef39){return _0x127a1a(_0x3f1944-0x4f0,_0x10ef39);}const _0x300a04={'WmKvq':_0x195d4d(-0x90,-0x14)+_0x405060(0x2ed,0x301)+_0x195d4d(-0x95,-0x10c),'TtzRa':_0x405060(0x2c2,0x31b),'wXbpr':'FJKxb'};function _0x195d4d(_0x26c52a,_0x107431){return _0x127a1a(_0x26c52a-0x13e,_0x107431);}try{const _0x1a265d=await this[_0x195d4d(-0x73,-0x3f)](_0x195d4d(-0xfa,-0xaf),_0x300a04[_0x405060(0x288,0x2c5)],{'content':_0x3fbc50[_0x405060(0x35c,0x317)][_0x195d4d(-0x8b,-0x92)](0x0,0x7d0),'tags':_0x3fbc50[_0x405060(0x373,0x383)]??[],'category':_0x3fbc50[_0x195d4d(-0x125,-0x15d)]}),_0x2c29e9=_0x1a265d;if(_0x2c29e9[_0x195d4d(-0x52,-0x61)]&&_0x2c29e9[_0x195d4d(-0x120,-0xff)])return _0x300a04[_0x405060(0x2fa,0x308)]!==_0x300a04['wXbpr']?_0x2c29e9[_0x405060(0x292,0x2ae)]:this[_0x195d4d(-0x73,-0x69)]('POST','/api/v1/mc'+_0x405060(0x376,0x35a),_0xffad2c);return null;}catch{return null;}}static ['RETRYABLE_'+_0x277c3d(0x448,0x42c)]=new Set([0x1ad,0x1f4,0x1f6,0x1f7,0x1f8]);static [_0x277c3d(0x388,0x385)+'S']=0x3;static ['BASE_DELAY'+_0x127a1a(-0x1f0,-0x256)]=0x3e8;async[_0x127a1a(-0x1b1,-0x13e)](_0x2f86fc,_0x4cf73c,_0x34cb78){function _0xb6e1fb(_0x55ec4d,_0x1cb7ee){return _0x277c3d(_0x1cb7ee,_0x55ec4d- -0x477);}function _0x42c0bf(_0x4a1378,_0x2b8076){return _0x277c3d(_0x2b8076,_0x4a1378-0xf9);}const _0x95302a={'JvDKh':function(_0x6b14b5,_0x2ee11a,_0x458e5d){return _0x6b14b5(_0x2ee11a,_0x458e5d);},'Lmfbt':_0xb6e1fb(-0x69,-0x83)+_0x42c0bf(0x482,0x45f),'tMAqO':function(_0x3249da,_0x34d03e){return _0x3249da>_0x34d03e;},'XLjLT':function(_0x2f5a2b,_0x322886){return _0x2f5a2b<_0x322886;},'cxUPC':function(_0xe9bda0,_0x550117){return _0xe9bda0-_0x550117;},'bOQmh':function(_0x5c2e5f,_0x33b096){return _0x5c2e5f*_0x33b096;},'oaQjC':function(_0x28f0f5,_0x291478){return _0x28f0f5===_0x291478;},'QAQYe':_0x42c0bf(0x468,0x4c7),'TWkxA':_0xb6e1fb(-0xcf,-0xd2),'TQmFw':_0x42c0bf(0x4fd,0x550),'jPMZt':function(_0x496e94,_0x3b2e5b){return _0x496e94*_0x3b2e5b;},'AicgJ':_0x42c0bf(0x4a3,0x4de)};let _0x1d1f85;for(let _0x4da017=0x0;_0x4da017<A2AClient[_0xb6e1fb(-0xf2,-0xdb)+'S'];_0x4da017++){const _0x3c5c61=''+this[_0xb6e1fb(-0x102,-0x11c)][_0x42c0bf(0x478,0x4c2)]+_0x4cf73c,_0x3ceaf4=new AbortController(),_0x12dba1=_0x95302a[_0xb6e1fb(-0x3b,-0x4a)](setTimeout,()=>_0x3ceaf4[_0x42c0bf(0x459,0x4b9)](),this['timeout']);try{const _0x20d979=await fetch(_0x3c5c61,{'method':_0x2f86fc,'headers':{'Content-Type':_0x95302a['Lmfbt'],'x-api-key':this[_0xb6e1fb(-0x102,-0x166)][_0x42c0bf(0x4da,0x53e)],'X-Plugin-Version':_pluginVersion,..._0x95302a['tMAqO'](this[_0x42c0bf(0x521,0x505)+_0xb6e1fb(-0x7d,-0xed)][_0xb6e1fb(-0x48,0x2c)],0x0)&&{'X-Plugin-Features':this[_0x42c0bf(0x521,0x581)+_0xb6e1fb(-0x7d,-0x7c)][_0xb6e1fb(-0xc7,-0x108)](',')}},'body':_0x34cb78?JSON[_0xb6e1fb(-0xca,-0xd2)](_0x34cb78):undefined,'signal':_0x3ceaf4[_0x42c0bf(0x456,0x4b9)]});clearTimeout(_0x12dba1);if(A2AClient[_0xb6e1fb(-0x6f,-0x41)+_0xb6e1fb(-0x4b,-0xab)]['has'](_0x20d979['status'])&&_0x95302a[_0x42c0bf(0x51f,0x58f)](_0x4da017,_0x95302a[_0xb6e1fb(-0xe5,-0xeb)](A2AClient[_0xb6e1fb(-0xf2,-0xee)+'S'],0x1))){const _0x2dc0b0=_0x95302a[_0x42c0bf(0x4fb,0x4d9)](A2AClient[_0xb6e1fb(-0x26,-0xf)+_0xb6e1fb(-0xa5,-0x75)],Math[_0x42c0bf(0x539,0x598)](0x2,_0x4da017));await new Promise(_0x70fead=>setTimeout(_0x70fead,_0x2dc0b0));continue;}!_0x20d979['ok']&&await this[_0x42c0bf(0x47d,0x43c)+_0x42c0bf(0x474,0x495)](_0x20d979);if(_0x95302a[_0x42c0bf(0x547,0x5a5)](_0x2f86fc,_0x95302a[_0xb6e1fb(-0xff,-0xbe)])&&_0x20d979[_0xb6e1fb(-0x99,-0x115)]===0xcc)return;return await _0x20d979[_0xb6e1fb(-0x52,-0x43)]();}catch(_0x404aec){clearTimeout(_0x12dba1);if(_0x404aec instanceof Error){if(_0x404aec[_0x42c0bf(0x4e6,0x564)][_0x42c0bf(0x46c,0x419)](_0x95302a[_0xb6e1fb(-0x61,-0xd4)])||_0x404aec[_0xb6e1fb(-0x8a,-0x45)][_0xb6e1fb(-0x104,-0x14e)]('HTTP\x20403')||_0x404aec[_0x42c0bf(0x4e6,0x53d)][_0x42c0bf(0x46c,0x44c)](_0x42c0bf(0x475,0x449))||_0x404aec[_0x42c0bf(0x4e6,0x550)][_0xb6e1fb(-0x104,-0xf2)](_0x95302a['TQmFw']))throw _0x404aec;if(_0x4da017<A2AClient['MAX_RETRIE'+'S']-0x1){_0x1d1f85=_0x404aec;const _0x35dd7c=_0x95302a[_0xb6e1fb(-0x101,-0xa3)](A2AClient[_0xb6e1fb(-0x26,-0x60)+_0xb6e1fb(-0xa5,-0x10b)],Math[_0x42c0bf(0x539,0x595)](0x2,_0x4da017));await new Promise(_0x36f6bb=>setTimeout(_0x36f6bb,_0x35dd7c));continue;}if(_0x404aec[_0xb6e1fb(-0x43,-0x62)]===_0x95302a['AicgJ'])throw new Error(_0x42c0bf(0x45c,0x3fe)+this[_0xb6e1fb(-0x11b,-0x166)]+_0x42c0bf(0x4b9,0x477));throw new Error('네트워크\x20오류:\x20'+_0x404aec[_0x42c0bf(0x4e6,0x4ee)]);}throw _0x404aec;}}throw _0x1d1f85??new Error(_0xb6e1fb(-0x22,0xc)+A2AClient[_0x42c0bf(0x47e,0x48a)+'S']+'회\x20재시도\x20후\x20실패');}async[_0x127a1a(-0x225,-0x216)+_0x277c3d(0x418,0x3bd)](_0x542a44,_0x4ef135,_0x5e280b){function _0x43da00(_0x228e79,_0x4e3802){return _0x127a1a(_0x4e3802-0x3fa,_0x228e79);}const _0xe8627e={'FokHk':function(_0x3c8e13,_0x22aab9,_0x29599c){return _0x3c8e13(_0x22aab9,_0x29599c);},'MAHsy':function(_0x1db28e,_0x40f9cb){return _0x1db28e(_0x40f9cb);},'QLYzH':function(_0x5d7f73,_0x4e3325){return _0x5d7f73(_0x4e3325);},'mkscm':'AbortError'},_0x3c7b4d=''+this[_0x5dddae(0x5b,0xa9)][_0x5dddae(0x65,0x2c)]+_0x4ef135;function _0x5dddae(_0x256734,_0x5ab3f5){return _0x127a1a(_0x256734-0x2a8,_0x5ab3f5);}const _0x3f88ac=new AbortController(),_0x3df3a5=setTimeout(()=>_0x3f88ac[_0x5dddae(0x46,0xab)](),this[_0x5dddae(0x42,0xb8)]);try{const _0x169b2c=await _0xe8627e['FokHk'](fetch,_0x3c7b4d,{'method':_0x542a44,'headers':{'x-api-key':this[_0x43da00(0x18c,0x1ad)][_0x5dddae(0xc7,0xd3)],'X-Plugin-Version':_pluginVersion},'body':_0x5e280b,'signal':_0x3f88ac['signal']});return _0xe8627e['MAHsy'](clearTimeout,_0x3df3a5),!_0x169b2c['ok']&&await this[_0x43da00(0x1a8,0x1bc)+_0x5dddae(0x61,0x2e)](_0x169b2c),await _0x169b2c[_0x43da00(0x2a2,0x25d)]();}catch(_0x4647a8){_0xe8627e[_0x43da00(0x19a,0x1fb)](clearTimeout,_0x3df3a5);if(_0x4647a8 instanceof Error&&_0x4647a8['name']===_0xe8627e['mkscm'])throw new Error('요청\x20시간\x20초과:\x20'+this[_0x5dddae(0x42,-0x3c)]+'ms를\x20넘었습니다');throw _0x4647a8;}}async[_0x277c3d(0x315,0x384)+'rResponse'](_0x5567fa){const _0x4d98a8={'ZveHS':'TJSkm','JnQSL':_0x52fc32(0x4e,-0x4)+'후\x20다시\x20시도하세요','Ztlef':function(_0x2e3963,_0x5978cd){return _0x2e3963===_0x5978cd;},'PLMFe':_0x4e1ac2(0x2c1,0x2b7)},_0xeb773=_0x5567fa[_0x4e1ac2(0x275,0x29c)];if(_0xeb773===0x191)throw new Error(_0x4e1ac2(0x2ca,0x295)+_0x4e1ac2(0x1ff,0x182)+'요');if(_0xeb773===0x1ad){if(_0x52fc32(0x9e,0x35)!==_0x4d98a8[_0x52fc32(0x2d,0x61)])throw new _0x563207(_0x4e1ac2(0x1fa,0x246)+this[_0x4e1ac2(0x1f3,0x26b)]+_0x4e1ac2(0x257,0x25a));else throw new Error(_0x4d98a8[_0x4e1ac2(0x25c,0x217)]);}function _0x4e1ac2(_0x394226,_0x228f9b){return _0x127a1a(_0x394226-0x459,_0x228f9b);}function _0x52fc32(_0x2a07ef,_0x37f435){return _0x127a1a(_0x2a07ef-0x215,_0x37f435);}let _0x124dfe=_0x52fc32(0x23,0x81)+_0xeb773;try{const _0x516d85=await _0x5567fa[_0x4e1ac2(0x2bc,0x320)]();if(_0x516d85['detail']){if(_0x4d98a8[_0x52fc32(0x7a,0x35)]('rGqgh',_0x4e1ac2(0x246,0x1fc)))_0x124dfe+=':\x20'+_0x516d85[_0x52fc32(0x68,0x9f)];else return;}else _0x516d85[_0x52fc32(0x40,0x42)]&&(_0x4d98a8[_0x4e1ac2(0x2eb,0x356)]===_0x4e1ac2(0x2c1,0x2bd)?_0x124dfe+=':\x20'+_0x516d85[_0x52fc32(0x40,0x69)]:_0x12009b+=':\x20'+_0x17ebae[_0x52fc32(0x40,0x60)]);}catch{}throw new Error(_0x124dfe);}}function _0x20c5(){const _0x55d11e=['l21LBw9YAwvZlW','C3rHDhvZ','Cgf0AwjPBgL0Eq','ChrPB25lzxK','yxbPs2v5','nJi4q3n4EeDA','B2zPy2LLBMn5pW','yNL0zxpSL6ZSLBWG7zwP64Ui','ug9kzxi','DgLLCG','DgLVBG','Bw9YAwvZp2XPBq','C2vHCMnOtwvTBW','z2v0ug9WDwXHCG','DgjzEKW','Dg90ywXFBwvTBW','BwvZC2fNzq','l2fWAs92ms9Tzq','C3nPzNK','ywrKvgvHBu1LBq','mtaW','Dg9YEt8','BM9KztPMCW','l2fWAs92ms90yq','yw5ZzMvYl2nVBq','AwDkzKu','CgfYC2u','BgLZDfbYB2zPyW','C2XPy2u','DhvYzxm','7jQu7lkTioYGNo2vNdOG7j6G7iUCia','y2XLyxjfBMnYEq','mMf0zeftEG','tgLTEMe','z2v0q29TCgf0Aq','BgvZl2nOzwnRlq','zxzLBNqVyMf0yW','yK9rBwG','uevfqw4','sfruuca0mJi','B2zMC2v0','txfiuK4','Bw9YAwvZl3n0yq','uKvuuLLbqKXfxW','yw5ZzMvYl2v4Ca','AfHpA2S','twvTB3jPzxm','tLnPq0S','CgfNzv9ZAxPL','yxbWBgLJyxrPBW','yxbWBhLezwX0yq','AwnPzw5JAwvZ','CMvXDwvZDa','Bwf4vg9Rzw5Z','Bw9YAwvZlW','zuvorvi','zgv0ywLS','vfDREee','l21LBwjLCNm','yw5ZzMvYl2LTCa','rMXqs3i','yxbWzw5K','zgvJCNLWDe1LBq','Bw9YAwvZl3nLyq','ywrKq29UDgv4Da','y2HLy2TgAwXLra','y3jLyxrLtwvTBW','mte1otvoCxj1zKm','rLjJu3O','BxnTuey','thjSqwG','EKH3txq','ANnVBG','weXQtfq','wNrSzwy','zw5HyMXLzezLyq','y2f0zwDVCMLLCW','Egjxwwi','zxHWB3j0uhjVzG','u1rbvfvt','Bw9YAwvZl3rHzW','y29UDgvUDa','BgvUz3rO','AwvUy2LLCW','rKrvDxq','C3vJy2vZCW','7j247kADioYlPo2mQdOGqvbj','BMfTzq','yND4Ae8','mc4WlJa','BM9KztP1CMW','zgLMzMLJDwX0Eq','zw5JCNLWDgLVBG','zwrKAw5N','ntmYnteXt3Pivuf2','sNzes2G','zgvSzxrLtwvTBW','Bwf4twvTB3jPzq','zMLSzw5HBwu','Cg93','CKHPC3rVCNK','CMnO','CgfNzq','odCZndm1mML2ufLPvG','DgfNCW','l2fWAs92ms90zq','vgzJs1u','zY9JB250zxH0CW','Bw9YAwvZl2fZCW','BNrLEhq','vePtA20','ywDLlMPZB24','Bw9YAwvZl2jHDa','B2frAKm','BgLTAxq','Bw9YEs1MAwXLCW','qKftrv9eruXbwq','CNLgAwXLtgLUAW','y2XHC3nPzNLdBW','ueXnrMu','7jQu7lkTioYlPo2mQdOG','mJm5nJGYqLP2qu90','l3bYB21VDgu','v21lDNe','Dg9tDhjPBMC','DgLTzw91Da','C2LNBMfS','rMvHDhvYzxm','y2f0zwDVCNK','ywjVCNq','y3jLyxrLq29UDa','AwvUy3LfDMvUDa','7jQu7lkTioYlNoQWHcdSTiJQS7W6ia','CMvZDwX0','Cg9ZDfbYB2zPyW','lI4VlI4VCgfJAW','A2zdBLC','ieTLEEULVcdTMzxSNBJTLzJSHlG','BgLZDe1LBw9YAq','s2v5','y3v4EMq','uMn6tKK','r0vu','BgfZDf9ZEw5Jzq','revmrvrf','AhrxrNG','zxHPC3rPBMDFzG','mZz3CfD5uMy','C3rHCNrZv2L0Aa','vvDWCNC','y29UzMLN','ALbnwNq','C3LUyY9HChbSEq','uufrwwu','mtbkBMXluM4','C2v0','CLjLC3bVBNnL','sfruuca0mdq','zMLSzv9Pza','CY9WB3b1BgfYpW','yMfZzvvYBa','l2fWAs92ms9MAq','l2fWAs92ms90CG','C2TPBgXFBwvTBW','AxrLBxm','AgfUzgXLrxjYBW','tufyx1jfvfjjrq','nta0nJa5nM92C2XzuG','wvDdq2i','tK1Orw0','BI9QC29U','ue9tva','DMvYC2LVBG','zw1IBgu','C2v0rw5HyMXLza','s1LQs2e','mZK0nda0m0j4EfrUvW','CMvPBMzVCMnLtq','l2fWAs92ms9WCG','y3Hvuem','Bw9YAwvZ','rwTyDKG','Bwf0CML4','7jwu7zI47zMuio2cPoUkLcaZmIa','zNHtveu','Cgf0Aa','yLbnDfe','BM9KztPWyxrO','B3j5','y1bMt3a','CMvXDwvZDe11Ba','BwPVvfa','BNrLBNq','Aw9Us2v5','qMf0y2G','D2P5thO','yw1Z','uM56DxG','yMvKzgLUzW','Aw5JBhvKzv9LBq','C2vHCMnOvgvHBq','7j247kADioYlPo2mQa','B3j0','qwjVCNrfCNjVCG','D1nWuxq','BgvZl3vWBg9Hza','C3rYAw5NAwz5','CMvMzxjLBMnLxW','CKDXz2G','AM9PBG','qxn1y2q','C2vHCMnO','zxH0','zf9HDa','BhrH','AxnfBMnYExb0Aq','C3rHDhm','l3rLyw1ZlW','CMLLC0jHDgnO','odyWnZKWuuLZDLD4','BI9HBMfSExPL','C3LUyY9KzwX0yq','DgLWyxj0','l2fWAs92ms9Wzq','Eg9UB215l2nSyq','BxpRPBWG64sy7jEi7iQ164Ui64UK','wfHQBMG','z2v0vhjHBNnMzq','uuXzEKG','vgfNCW','sM5ru0W','De1Yy3K','zMjjEKm','Aw9Ul2vTB3rPBW','CMLLCW','ufvu','ChjVAMvJDf9Wyq','vhr6uMe','BgLZDfrLyw1Z','BNLuwhu','l21LBw9YAwvZ','sfruuca','q0Hcvui','x01t','r3rMy3m','Dg90ywXFBM9Kzq','C2vZC2LVBL9Pza','rgvkCKm','DxbSB2fKrMLSzq','zMLSzq','B3v0y29Tzq','wNzLsfm','l3jLAw5MB3jJzq','sNfirKq'];_0x20c5=function(){return _0x55d11e;};return _0x20c5();}