@nlabs/reaktor 1.11.0 → 1.12.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.
- package/docs/GENERATION.md +49 -0
- package/lib/actions/contentGeneration.d.ts +9 -1
- package/lib/actions/contentGeneration.js +22 -3
- package/lib/actions/index.d.ts +1 -0
- package/lib/actions/index.js +2 -1
- package/lib/actions/openaiResponseSession.d.ts +60 -0
- package/lib/actions/openaiResponseSession.js +248 -0
- package/package.json +1 -1
package/docs/GENERATION.md
CHANGED
|
@@ -147,3 +147,52 @@ application-owned.
|
|
|
147
147
|
|
|
148
148
|
The OpenAI mapping follows the [Responses API](https://developers.openai.com/api/reference/cli/resources/responses/methods/create)
|
|
149
149
|
and [structured output contract](https://developers.openai.com/api/docs/guides/structured-outputs).
|
|
150
|
+
|
|
151
|
+
## Interactive OpenAI sessions (1.12.0)
|
|
152
|
+
|
|
153
|
+
`createOpenAIResponseSession(options, onEvent, config)` manages one Responses
|
|
154
|
+
WebSocket conversation. The caller supplies `model`, `max_output_tokens`, `input`,
|
|
155
|
+
optional instructions/reasoning/tool definitions, and explicit `apiKey`,
|
|
156
|
+
`timeoutMs`, and `maxToolCalls` in config. It does not read environment variables,
|
|
157
|
+
choose application prompts, authenticate end users, execute tools, or save results.
|
|
158
|
+
Applications own those policies and must authorize every tool they expose.
|
|
159
|
+
|
|
160
|
+
The returned handle offers `continue(text)`, `steer(text)`, `reasoning(effort)`,
|
|
161
|
+
`toolResult(callId, output)`, and idempotent `close()`. Pass an optional AbortSignal
|
|
162
|
+
as `config.signal` for local cancellation. Closing/aborting releases the timer,
|
|
163
|
+
discards queued tool results, and closes the connection; it does not roll back
|
|
164
|
+
external tools or guarantee that provider billing stops immediately. No requests
|
|
165
|
+
are automatically retried or replayed after errors or disconnection.
|
|
166
|
+
|
|
167
|
+
Provider events are forwarded to `onEvent`. Application-facing events are
|
|
168
|
+
`session.tool_call`, `session.tools_pending`, `session.reasoning.queued`,
|
|
169
|
+
`session.turn.completed`, and `session.error`. Only `session.turn.completed`
|
|
170
|
+
contains validated final text. Tool results are buffered while generating;
|
|
171
|
+
synchronous tools must all finish before a continuation. Steering waits for its
|
|
172
|
+
successor response and retains connection-local state. Storage and truncation are
|
|
173
|
+
disabled. `timeoutMs` bounds each turn and the following idle/tool-wait period.
|
|
174
|
+
An optional `config.connect` factory supports test sockets.
|
|
175
|
+
|
|
176
|
+
The TypeScript `generateContent` action also accepts multipart OpenAI messages:
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
const result = await generateContent({
|
|
180
|
+
messages: [{
|
|
181
|
+
content: [
|
|
182
|
+
{text: 'Describe the visible colors.', type: 'text'},
|
|
183
|
+
{detail: 'auto', type: 'image', url: imageUrl}
|
|
184
|
+
],
|
|
185
|
+
role: 'user'
|
|
186
|
+
}],
|
|
187
|
+
model,
|
|
188
|
+
provider: 'openai'
|
|
189
|
+
}, {openaiKey});
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Image URLs may be HTTP(S) URLs or base64 PNG/JPEG/WebP/GIF data URLs. Image parts
|
|
193
|
+
are accepted only in user messages. Other providers and the existing GraphQL
|
|
194
|
+
message input remain text-only for `messages`; Gemini's separate byte-image
|
|
195
|
+
input remains supported by the TypeScript action.
|
|
196
|
+
|
|
197
|
+
Protocol references: [WebSocket mode](https://developers.openai.com/api/docs/guides/websocket-mode)
|
|
198
|
+
and [mid-turn steering](https://developers.openai.com/api/docs/guides/steering).
|
|
@@ -7,8 +7,16 @@ export interface ContentGenerationConfig {
|
|
|
7
7
|
openaiKey?: string;
|
|
8
8
|
openaiModel?: string;
|
|
9
9
|
}
|
|
10
|
+
export type ContentGenerationPart = {
|
|
11
|
+
text: string;
|
|
12
|
+
type: 'text';
|
|
13
|
+
} | {
|
|
14
|
+
detail?: 'auto' | 'high' | 'low';
|
|
15
|
+
type: 'image';
|
|
16
|
+
url: string;
|
|
17
|
+
};
|
|
10
18
|
export interface ContentGenerationMessage {
|
|
11
|
-
content: string;
|
|
19
|
+
content: string | ContentGenerationPart[];
|
|
12
20
|
role: 'assistant' | 'developer' | 'system' | 'user';
|
|
13
21
|
}
|
|
14
22
|
export type ContentGenerationResponseFormat = {
|
|
@@ -4,6 +4,18 @@ import { Config } from '../config.js';
|
|
|
4
4
|
}
|
|
5
5
|
/** An accepted generation did not produce usable output; do not automatically resubmit it. */ export class ContentGenerationResponseError extends Error {
|
|
6
6
|
}
|
|
7
|
+
const validMessageContent = (message)=>{
|
|
8
|
+
if (typeof message.content === 'string') return !!message.content.trim();
|
|
9
|
+
return Array.isArray(message.content) && message.content.length > 0 && message.content.every((part)=>{
|
|
10
|
+
if (!part) return false;
|
|
11
|
+
if (part.type === 'text') return typeof part.text === 'string' && !!part.text.trim();
|
|
12
|
+
return part.type === 'image' && message.role === 'user' && typeof part.url === 'string' && /^(https?:\/\/[^\s]+|data:image\/(png|jpeg|webp|gif);base64,[A-Za-z0-9+/]+={0,2})$/.test(part.url) && (part.detail === undefined || [
|
|
13
|
+
'auto',
|
|
14
|
+
'high',
|
|
15
|
+
'low'
|
|
16
|
+
].includes(part.detail));
|
|
17
|
+
});
|
|
18
|
+
};
|
|
7
19
|
/** Single submission through Rip-Hunter; callers own durable jobs and reconciliation. */ export const generateContent = async (input, config = Config.get('contentGeneration') || {})=>{
|
|
8
20
|
if (![
|
|
9
21
|
'claude',
|
|
@@ -18,7 +30,7 @@ import { Config } from '../config.js';
|
|
|
18
30
|
'developer',
|
|
19
31
|
'system',
|
|
20
32
|
'user'
|
|
21
|
-
].includes(message.role) ||
|
|
33
|
+
].includes(message.role) || !validMessageContent(message))) {
|
|
22
34
|
throw new ContentGenerationRejectedError('Supply either a non-empty prompt or non-empty text messages with supported roles.');
|
|
23
35
|
}
|
|
24
36
|
} else if (typeof input.prompt !== 'string' || !input.prompt.trim()) {
|
|
@@ -101,7 +113,14 @@ import { Config } from '../config.js';
|
|
|
101
113
|
}
|
|
102
114
|
const response = await post('https://api.openai.com/v1/responses', {
|
|
103
115
|
input: input.messages?.map((message)=>({
|
|
104
|
-
content: message.content
|
|
116
|
+
content: typeof message.content === 'string' ? message.content : message.content.map((part)=>part.type === 'text' ? {
|
|
117
|
+
text: part.text,
|
|
118
|
+
type: 'input_text'
|
|
119
|
+
} : {
|
|
120
|
+
detail: part.detail ?? 'auto',
|
|
121
|
+
image_url: part.url,
|
|
122
|
+
type: 'input_image'
|
|
123
|
+
}),
|
|
105
124
|
role: message.role === 'system' ? 'developer' : message.role
|
|
106
125
|
})) ?? prompt,
|
|
107
126
|
instructions: input.system,
|
|
@@ -271,4 +290,4 @@ import { Config } from '../config.js';
|
|
|
271
290
|
};
|
|
272
291
|
};
|
|
273
292
|
|
|
274
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb250ZW50R2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3Bvc3R9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25Db25maWcge1xuICBjbGF1ZGVLZXk/OiBzdHJpbmc7XG4gIGNsYXVkZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlJbWFnZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlLZXk/OiBzdHJpbmc7XG4gIGdlbWluaU1vZGVsPzogc3RyaW5nO1xuICBvcGVuYWlLZXk/OiBzdHJpbmc7XG4gIG9wZW5haU1vZGVsPzogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50R2VuZXJhdGlvbk1lc3NhZ2Uge1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHJvbGU6ICdhc3Npc3RhbnQnIHwgJ2RldmVsb3BlcicgfCAnc3lzdGVtJyB8ICd1c2VyJztcbn1cbmV4cG9ydCB0eXBlIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQgPSB7dHlwZTogJ2pzb25fb2JqZWN0JyB8ICd0ZXh0J30gfCB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmljdD86IGJvb2xlYW47XG4gIHR5cGU6ICdqc29uX3NjaGVtYSc7XG59O1xuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25SZWFzb25pbmdFZmZvcnQgPSAnbm9uZScgfCAnbWluaW1hbCcgfCAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ3hoaWdoJyB8ICdtYXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0aW9uSW5wdXQge1xuICBhc3BlY3RSYXRpbz86IHN0cmluZztcbiAgaW1hZ2VzPzoge2J5dGVzOiBCdWZmZXI7IG1pbWU6IHN0cmluZ31bXTtcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICBtZXNzYWdlcz86IENvbnRlbnRHZW5lcmF0aW9uTWVzc2FnZVtdO1xuICBtb2RhbGl0eT86ICdpbWFnZScgfCAndGV4dCc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBwcm9tcHQ/OiBzdHJpbmc7XG4gIHByb3ZpZGVyOiAnY2xhdWRlJyB8ICdnZW1pbmknIHwgJ29wZW5haSc7XG4gIHJlYXNvbmluZ0VmZm9ydD86IENvbnRlbnRHZW5lcmF0aW9uUmVhc29uaW5nRWZmb3J0O1xuICByZXNwb25zZUZvcm1hdD86IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQ7XG4gIHNlYXJjaD86IGJvb2xlYW47XG4gIHN5c3RlbT86IHN0cmluZztcbiAgdGltZW91dE1zPzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZWRDb250ZW50IHtcbiAgaW1hZ2U/OiB7Ynl0ZXM6IEJ1ZmZlcjsgbWltZTogJ2ltYWdlL2pwZWcnIHwgJ2ltYWdlL3BuZyd9O1xuICBzZWFyY2hTdWdnZXN0aW9uc0h0bWw/OiBzdHJpbmc7XG4gIHNvdXJjZXM6IHt0aXRsZTogc3RyaW5nOyB1cmw6IHN0cmluZ31bXTtcbiAgdGV4dDogc3RyaW5nO1xufVxuLyoqIEEgY29uZmlybWVkIHJlamVjdGlvbiBpcyBkaXN0aW5jdCBmcm9tIGFuIHVua25vd24gcGFpZCBzdWJtaXNzaW9uIG91dGNvbWUuICovXG5leHBvcnQgY2xhc3MgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yIGV4dGVuZHMgRXJyb3Ige31cbi8qKiBBbiBhY2NlcHRlZCBnZW5lcmF0aW9uIGRpZCBub3QgcHJvZHVjZSB1c2FibGUgb3V0cHV0OyBkbyBub3QgYXV0b21hdGljYWxseSByZXN1Ym1pdCBpdC4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG5pbnRlcmZhY2UgR2VtaW5pUGFydCB7aW5saW5lRGF0YT86IHtkYXRhOiBzdHJpbmc7IG1pbWVUeXBlOiBzdHJpbmd9OyB0ZXh0Pzogc3RyaW5nOyB0aG91Z2h0PzogYm9vbGVhbn1cbmludGVyZmFjZSBHZW1pbmlSZXNwb25zZSB7XG4gIGNhbmRpZGF0ZXM/OiB7XG4gICAgY29udGVudD86IHtwYXJ0cz86IEdlbWluaVBhcnRbXX07XG4gICAgZmluaXNoUmVhc29uPzogc3RyaW5nO1xuICAgIGdyb3VuZGluZ01ldGFkYXRhPzoge1xuICAgICAgZ3JvdW5kaW5nQ2h1bmtzPzoge3dlYj86IHt0aXRsZT86IHN0cmluZzsgdXJpPzogc3RyaW5nfX1bXTtcbiAgICAgIHNlYXJjaEVudHJ5UG9pbnQ/OiB7cmVuZGVyZWRDb250ZW50Pzogc3RyaW5nfTtcbiAgICB9O1xuICB9W107XG4gIGVycm9yPzoge2NvZGU/OiBudW1iZXJ9O1xuICBwcm9tcHRGZWVkYmFjaz86IHtibG9ja1JlYXNvbj86IHN0cmluZ307XG59XG5cbi8qKiBTaW5nbGUgc3VibWlzc2lvbiB0aHJvdWdoIFJpcC1IdW50ZXI7IGNhbGxlcnMgb3duIGR1cmFibGUgam9icyBhbmQgcmVjb25jaWxpYXRpb24uICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVDb250ZW50ID0gYXN5bmMgKFxuICBpbnB1dDogQ29udGVudEdlbmVyYXRpb25JbnB1dCxcbiAgY29uZmlnOiBDb250ZW50R2VuZXJhdGlvbkNvbmZpZyA9IENvbmZpZy5nZXQ8Q29udGVudEdlbmVyYXRpb25Db25maWc+KCdjb250ZW50R2VuZXJhdGlvbicpIHx8IHt9XG4pOiBQcm9taXNlPEdlbmVyYXRlZENvbnRlbnQ+ID0+IHtcbiAgaWYoIVsnY2xhdWRlJywgJ2dlbWluaScsICdvcGVuYWknXS5pbmNsdWRlcyhpbnB1dC5wcm92aWRlcikpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdBIHN1cHBvcnRlZCBwcm92aWRlciBpcyByZXF1aXJlZC4nKTtcbiAgfVxuICBpZihpbnB1dC5tZXNzYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYoaW5wdXQucHJvbXB0ICE9PSB1bmRlZmluZWQgfHwgIUFycmF5LmlzQXJyYXkoaW5wdXQubWVzc2FnZXMpIHx8ICFpbnB1dC5tZXNzYWdlcy5sZW5ndGggfHwgaW5wdXQubWVzc2FnZXMuc29tZSgobWVzc2FnZSkgPT5cbiAgICAgICFtZXNzYWdlIHx8ICFbJ2Fzc2lzdGFudCcsICdkZXZlbG9wZXInLCAnc3lzdGVtJywgJ3VzZXInXS5pbmNsdWRlcyhtZXNzYWdlLnJvbGUpIHx8IHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgIT09ICdzdHJpbmcnIHx8ICFtZXNzYWdlLmNvbnRlbnQudHJpbSgpKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignU3VwcGx5IGVpdGhlciBhIG5vbi1lbXB0eSBwcm9tcHQgb3Igbm9uLWVtcHR5IHRleHQgbWVzc2FnZXMgd2l0aCBzdXBwb3J0ZWQgcm9sZXMuJyk7XG4gICAgfVxuICB9IGVsc2UgaWYodHlwZW9mIGlucHV0LnByb21wdCAhPT0gJ3N0cmluZycgfHwgIWlucHV0LnByb21wdC50cmltKCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdBIG5vbi1lbXB0eSBwcm9tcHQgaXMgcmVxdWlyZWQuJyk7XG4gIH1cbiAgaWYoaW5wdXQucHJvdmlkZXIgIT09ICdvcGVuYWknICYmIChpbnB1dC5tZXNzYWdlcyAhPT0gdW5kZWZpbmVkIHx8IGlucHV0LnJlYXNvbmluZ0VmZm9ydCAhPT0gdW5kZWZpbmVkIHx8IGlucHV0LnJlc3BvbnNlRm9ybWF0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignTWVzc2FnZXMsIHJlYXNvbmluZyBlZmZvcnQsIGFuZCByZXNwb25zZSBmb3JtYXQgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBieSBPcGVuQUkuJyk7XG4gIH1cbiAgaWYoaW5wdXQudGltZW91dE1zICE9PSB1bmRlZmluZWQgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlucHV0LnRpbWVvdXRNcykgfHwgaW5wdXQudGltZW91dE1zIDwgMSB8fCBpbnB1dC50aW1lb3V0TXMgPiAyXzE0N180ODNfNjQ3KSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ3RpbWVvdXRNcyBtdXN0IGJlIGEgcG9zaXRpdmUgMzItYml0IGludGVnZXIuJyk7XG4gIH1cbiAgaWYoaW5wdXQucmVhc29uaW5nRWZmb3J0ICE9PSB1bmRlZmluZWQgJiYgIVsnbm9uZScsICdtaW5pbWFsJywgJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcsICd4aGlnaCcsICdtYXgnXS5pbmNsdWRlcyhpbnB1dC5yZWFzb25pbmdFZmZvcnQpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVW5zdXBwb3J0ZWQgcmVhc29uaW5nIGVmZm9ydC4nKTtcbiAgfVxuICBjb25zdCBmb3JtYXQgPSBpbnB1dC5yZXNwb25zZUZvcm1hdDtcbiAgaWYoZm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgKCFmb3JtYXQgfHwgIVsndGV4dCcsICdqc29uX29iamVjdCcsICdqc29uX3NjaGVtYSddLmluY2x1ZGVzKGZvcm1hdC50eXBlKSB8fCAoZm9ybWF0LnR5cGUgPT09ICdqc29uX3NjaGVtYScgJiYgKFxuICAgIHR5cGVvZiBmb3JtYXQubmFtZSAhPT0gJ3N0cmluZycgfHwgIS9eW2EtekEtWjAtOV8tXXsxLDY0fSQvLnRlc3QoZm9ybWF0Lm5hbWUpIHx8ICFmb3JtYXQuc2NoZW1hIHx8IHR5cGVvZiBmb3JtYXQuc2NoZW1hICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGZvcm1hdC5zY2hlbWEpXG4gICAgfHwgKGZvcm1hdC5zdHJpY3QgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZm9ybWF0LnN0cmljdCAhPT0gJ2Jvb2xlYW4nKVxuICApKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIGZvcm1hdC4gSlNPTiBzY2hlbWFzIHJlcXVpcmUgYSBuYW1lIGFuZCBzY2hlbWEgb2JqZWN0LicpO1xuICB9XG4gIGlmKGlucHV0Lm1heFRva2VucyAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzSW50ZWdlcihpbnB1dC5tYXhUb2tlbnMpIHx8IGlucHV0Lm1heFRva2VucyA8IDEpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignbWF4VG9rZW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLicpO1xuICB9XG4gIGlmKGlucHV0LnByb3ZpZGVyICE9PSAnZ2VtaW5pJyAmJiAoaW5wdXQuaW1hZ2VzPy5sZW5ndGggfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgfHwgaW5wdXQuc2VhcmNoKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ1RoaXMgcHJvdmlkZXIgb3BlcmF0aW9uIHN1cHBvcnRzIHRleHQgaW5wdXQgYW5kIG91dHB1dCBvbmx5LicpO1xuICB9XG4gIGNvbnN0IHtwcm9tcHQsIGltYWdlcyA9IFtdfSA9IGlucHV0O1xuICBpZihpbnB1dC5wcm92aWRlciA9PT0gJ2NsYXVkZScpIHtcbiAgICBpZighY29uZmlnLmNsYXVkZUtleSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignQ2xhdWRlIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgc2VydmVyLicpO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3QoJ2h0dHBzOi8vYXBpLmFudGhyb3BpYy5jb20vdjEvbWVzc2FnZXMnLCB7XG4gICAgICBtYXhfdG9rZW5zOiBpbnB1dC5tYXhUb2tlbnMgPz8gNDA5NixcbiAgICAgIG1lc3NhZ2VzOiBbe2NvbnRlbnQ6IHByb21wdCwgcm9sZTogJ3VzZXInfV0sXG4gICAgICBtb2RlbDogaW5wdXQubW9kZWwgfHwgY29uZmlnLmNsYXVkZU1vZGVsIHx8ICdjbGF1ZGUtc29ubmV0LTUnLFxuICAgICAgc3lzdGVtOiBpbnB1dC5zeXN0ZW1cbiAgICB9LCB7Y2FjaGU6IGZhbHNlLCBoZWFkZXJzOiBuZXcgSGVhZGVycyh7J2FudGhyb3BpYy12ZXJzaW9uJzogJzIwMjMtMDYtMDEnLCAneC1hcGkta2V5JzogY29uZmlnLmNsYXVkZUtleX0pLCB0aW1lb3V0OiBpbnB1dC50aW1lb3V0TXMgPz8gMTIwXzAwMH0pIGFzIHtcbiAgICAgIGNvbnRlbnQ/OiB7dGV4dD86IHN0cmluZzsgdHlwZT86IHN0cmluZ31bXTtcbiAgICAgIGVycm9yPzoge3R5cGU/OiBzdHJpbmd9O1xuICAgICAgc3RvcF9yZWFzb24/OiBzdHJpbmc7XG4gICAgICB0eXBlPzogc3RyaW5nO1xuICAgIH07XG4gICAgaWYocmVzcG9uc2UuZXJyb3IgJiYgWydhdXRoZW50aWNhdGlvbl9lcnJvcicsICdpbnZhbGlkX3JlcXVlc3RfZXJyb3InLCAnbm90X2ZvdW5kX2Vycm9yJywgJ3Blcm1pc3Npb25fZXJyb3InXS5pbmNsdWRlcyhyZXNwb25zZS5lcnJvci50eXBlIHx8ICcnKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignQ2xhdWRlIHJlamVjdGVkIHRoZSByZXF1ZXN0LiBDaGVjayB0aGUgbW9kZWwgYW5kIGFjY291bnQgYWNjZXNzLicpO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcmVzcG9uc2UuY29udGVudD8uZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICd0ZXh0JykubWFwKChwYXJ0KSA9PiBwYXJ0LnRleHQgfHwgJycpLmpvaW4oJ1xcbicpLnRyaW0oKTtcbiAgICBpZihyZXNwb25zZS5lcnJvciB8fCByZXNwb25zZS50eXBlICE9PSAnbWVzc2FnZScgfHwgcmVzcG9uc2Uuc3RvcF9yZWFzb24gIT09ICdlbmRfdHVybicgfHwgIXRleHQpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ0NsYXVkZSByZXNwb25zZSBjb3VsZCBub3QgYmUgY29uZmlybWVkLicpO1xuICAgIH1cbiAgICByZXR1cm4ge3NvdXJjZXM6IFtdLCB0ZXh0fTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciA9PT0gJ29wZW5haScpIHtcbiAgICBpZighY29uZmlnLm9wZW5haUtleSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignT3BlbkFJIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgc2VydmVyLicpO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3QoJ2h0dHBzOi8vYXBpLm9wZW5haS5jb20vdjEvcmVzcG9uc2VzJywge1xuICAgICAgaW5wdXQ6IGlucHV0Lm1lc3NhZ2VzPy5tYXAoKG1lc3NhZ2UpID0+ICh7Y29udGVudDogbWVzc2FnZS5jb250ZW50LCByb2xlOiBtZXNzYWdlLnJvbGUgPT09ICdzeXN0ZW0nID8gJ2RldmVsb3BlcicgOiBtZXNzYWdlLnJvbGV9KSkgPz8gcHJvbXB0LFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBpbnB1dC5zeXN0ZW0sXG4gICAgICBtYXhfb3V0cHV0X3Rva2VuczogaW5wdXQubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICBtb2RlbDogaW5wdXQubW9kZWwgfHwgY29uZmlnLm9wZW5haU1vZGVsIHx8ICdncHQtNi1hc3RyYScsXG4gICAgICAuLi4oaW5wdXQucmVhc29uaW5nRWZmb3J0ID8ge3JlYXNvbmluZzoge2VmZm9ydDogaW5wdXQucmVhc29uaW5nRWZmb3J0fX0gOiB7fSksXG4gICAgICBzdG9yZTogZmFsc2UsXG4gICAgICAuLi4oZm9ybWF0ID8ge3RleHQ6IHtmb3JtYXR9fSA6IHt9KSxcbiAgICAgIHRydW5jYXRpb246ICdkaXNhYmxlZCdcbiAgICB9LCB7Y2FjaGU6IGZhbHNlLCBoZWFkZXJzOiBuZXcgSGVhZGVycyh7QXV0aG9yaXphdGlvbjogYEJlYXJlciAke2NvbmZpZy5vcGVuYWlLZXl9YH0pLCB0aW1lb3V0OiBpbnB1dC50aW1lb3V0TXMgPz8gMTIwXzAwMH0pIGFzIHtcbiAgICAgIGVycm9yPzoge2NvZGU/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9O1xuICAgICAgb3V0cHV0Pzoge2NvbnRlbnQ/OiB7dGV4dD86IHN0cmluZzsgdHlwZT86IHN0cmluZ31bXTsgc3RhdHVzPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfVtdO1xuICAgICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIH07XG4gICAgaWYocmVzcG9uc2UuZXJyb3IgJiYgWydpbnZhbGlkX3JlcXVlc3RfZXJyb3InLCAnYXV0aGVudGljYXRpb25fZXJyb3InLCAncGVybWlzc2lvbl9lcnJvciddLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLnR5cGUgfHwgJycpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdPcGVuQUkgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSBtb2RlbCBhbmQgYWNjb3VudCBhY2Nlc3MuJyk7XG4gICAgfVxuICAgIGlmKHJlc3BvbnNlLmVycm9yIHx8IHJlc3BvbnNlLnN0YXR1cyAhPT0gJ2NvbXBsZXRlZCcgfHwgcmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2luY29tcGxldGUnKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignT3BlbkFJIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQ6IGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZS4nKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQ/LnNvbWUoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3JlZnVzYWwnKSkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09wZW5BSSBkZWNsaW5lZCB0aGUgcmVxdWVzdC4nKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnR5cGUgJiYgIVsnbWVzc2FnZScsICdyZWFzb25pbmcnXS5pbmNsdWRlcyhpdGVtLnR5cGUpKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignT3BlbkFJIHJldHVybmVkIGFuIHVuc3VwcG9ydGVkIG91dHB1dCBpdGVtLicpO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcmVzcG9uc2Uub3V0cHV0Py5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ21lc3NhZ2UnKS5mbGF0TWFwKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQgfHwgW10pXG4gICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdvdXRwdXRfdGV4dCcpLm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKS5qb2luKCcnKS50cmltKCk7XG4gICAgaWYoIXRleHQpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09wZW5BSSByZXR1cm5lZCBlbXB0eSBvdXRwdXQuJyk7XG4gICAgfVxuICAgIHJldHVybiB7c291cmNlczogW10sIHRleHR9O1xuICB9XG4gIGlmKCFjb25maWcuZ2VtaW5pS2V5KSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignR2VtaW5pIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgc2VydmVyLicpO1xuICB9XG4gIGNvbnN0IHBhcnRzOiB1bmtub3duW10gPSBbe3RleHQ6IHByb21wdH0sIC4uLmltYWdlcy5tYXAoKGltYWdlKSA9PiAoe2lubGluZURhdGE6IHtkYXRhOiBpbWFnZS5ieXRlcy50b1N0cmluZygnYmFzZTY0JyksIG1pbWVUeXBlOiBpbWFnZS5taW1lfX0pKV07XG4gIGNvbnN0IG1vZGVsID0gaW5wdXQubW9kZWwgfHwgKGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnID8gY29uZmlnLmdlbWluaUltYWdlTW9kZWwgfHwgJ2dlbWluaS0zLjEtZmxhc2gtaW1hZ2UnIDogY29uZmlnLmdlbWluaU1vZGVsIHx8ICdnZW1pbmktMy44LWZsYXNoJyk7XG4gIGlmKCEvXlthLXpBLVowLTkuXy1dKyQvLnRlc3QobW9kZWwpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignSW52YWxpZCBHZW1pbmkgbW9kZWwgY29uZmlndXJhdGlvbi4nKTtcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3QoYGh0dHBzOi8vZ2VuZXJhdGl2ZWxhbmd1YWdlLmdvb2dsZWFwaXMuY29tL3YxYmV0YS9tb2RlbHMvJHttb2RlbH06Z2VuZXJhdGVDb250ZW50YCwge1xuICAgIGNvbnRlbnRzOiBbe3BhcnRzLCByb2xlOiAndXNlcid9XSxcbiAgICAuLi4oaW5wdXQuc3lzdGVtID8ge3N5c3RlbUluc3RydWN0aW9uOiB7cGFydHM6IFt7dGV4dDogaW5wdXQuc3lzdGVtfV19fSA6IHt9KSxcbiAgICBnZW5lcmF0aW9uQ29uZmlnOiBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyA/IHsuLi4oaW5wdXQuYXNwZWN0UmF0aW8gPyB7aW1hZ2VDb25maWc6IHthc3BlY3RSYXRpbzogaW5wdXQuYXNwZWN0UmF0aW99fSA6IHt9KSwgcmVzcG9uc2VNb2RhbGl0aWVzOiBbJ1RFWFQnLCAnSU1BR0UnXX0gOiB7bWF4T3V0cHV0VG9rZW5zOiBpbnB1dC5tYXhUb2tlbnMgPz8gNDA5Nn0sXG4gICAgLi4uKGlucHV0LnNlYXJjaCA/IHt0b29sczogW3tnb29nbGVTZWFyY2g6IHt9fV19IDoge30pXG4gIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHsneC1nb29nLWFwaS1rZXknOiBjb25maWcuZ2VtaW5pS2V5fSksIHRpbWVvdXQ6IGlucHV0LnRpbWVvdXRNcyA/PyAxMjBfMDAwfSkgYXMgR2VtaW5pUmVzcG9uc2U7XG4gIGlmKHJlc3BvbnNlLmVycm9yICYmIFs0MDAsIDQwMSwgNDAzLCA0MDRdLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLmNvZGUgfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdHZW1pbmkgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSByZWZlcmVuY2UgZm9ybWF0IGFuZCBtb2RlbCBhY2Nlc3MuJyk7XG4gIH1cbiAgaWYocmVzcG9uc2UucHJvbXB0RmVlZGJhY2s/LmJsb2NrUmVhc29uIHx8IHJlc3BvbnNlLmVycm9yIHx8ICFyZXNwb25zZS5jYW5kaWRhdGVzPy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdHZW1pbmkgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZC4nKTtcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSByZXNwb25zZS5jYW5kaWRhdGVzWzBdITtcbiAgaWYoY2FuZGlkYXRlLmZpbmlzaFJlYXNvbiAhPT0gJ1NUT1AnKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignR2VtaW5pIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQ6IGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZS4nKTtcbiAgfVxuICBjb25zdCBvdXRwdXQgPSAoY2FuZGlkYXRlLmNvbnRlbnQ/LnBhcnRzIHx8IFtdKS5maWx0ZXIoKHBhcnQpID0+ICFwYXJ0LnRob3VnaHQpO1xuICBjb25zdCBpbmxpbmUgPSBvdXRwdXQuZmluZCgocGFydCkgPT4gcGFydC5pbmxpbmVEYXRhKT8uaW5saW5lRGF0YTtcbiAgbGV0IGltYWdlOiBHZW5lcmF0ZWRDb250ZW50WydpbWFnZSddO1xuICBpZihpbmxpbmUgJiYgWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZyddLmluY2x1ZGVzKGlubGluZS5taW1lVHlwZSkpIHtcbiAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKGlubGluZS5kYXRhLCAnYmFzZTY0Jyk7XG4gICAgaWYoIWJ5dGVzLmxlbmd0aCB8fCBieXRlcy5sZW5ndGggPiAyMCAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdJbnZhbGlkIGltYWdlIG91dHB1dC4nKTtcbiAgICB9XG4gICAgaW1hZ2UgPSB7Ynl0ZXMsIG1pbWU6IGlubGluZS5taW1lVHlwZSBhcyAnaW1hZ2UvcG5nJyB8ICdpbWFnZS9qcGVnJ307XG4gIH1cbiAgY29uc3QgdGV4dCA9IG91dHB1dC5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCB8fCAnJykuam9pbignXFxuJykudHJpbSgpO1xuICBpZihpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyA/ICFpbWFnZSA6ICF0ZXh0KSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignVGhlIHJlcXVlc3RlZCBvdXRwdXQgd2FzIG5vdCByZXR1cm5lZC4nKTtcbiAgfVxuICBjb25zdCBzb3VyY2VzID0gKGNhbmRpZGF0ZS5ncm91bmRpbmdNZXRhZGF0YT8uZ3JvdW5kaW5nQ2h1bmtzIHx8IFtdKS5mbGF0TWFwKCh7d2VifSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdlYj8udXJpIHx8ICcnKTtcbiAgICAgIHJldHVybiB1cmwucHJvdG9jb2wgPT09ICdodHRwczonID8gW3t0aXRsZTogd2ViPy50aXRsZSB8fCB1cmwuaG9zdG5hbWUsIHVybDogdXJsLmhyZWZ9XSA6IFtdO1xuICAgIH0gY2F0Y2h7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBpbWFnZSwgc2VhcmNoU3VnZ2VzdGlvbnNIdG1sOiBjYW5kaWRhdGUuZ3JvdW5kaW5nTWV0YWRhdGE/LnNlYXJjaEVudHJ5UG9pbnQ/LnJlbmRlcmVkQ29udGVudCwgc291cmNlcywgdGV4dFxuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJwb3N0IiwiQ29uZmlnIiwiQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yIiwiRXJyb3IiLCJDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IiLCJnZW5lcmF0ZUNvbnRlbnQiLCJpbnB1dCIsImNvbmZpZyIsImdldCIsImluY2x1ZGVzIiwicHJvdmlkZXIiLCJtZXNzYWdlcyIsInVuZGVmaW5lZCIsInByb21wdCIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsInNvbWUiLCJtZXNzYWdlIiwicm9sZSIsImNvbnRlbnQiLCJ0cmltIiwicmVhc29uaW5nRWZmb3J0IiwicmVzcG9uc2VGb3JtYXQiLCJ0aW1lb3V0TXMiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJmb3JtYXQiLCJ0eXBlIiwibmFtZSIsInRlc3QiLCJzY2hlbWEiLCJzdHJpY3QiLCJtYXhUb2tlbnMiLCJpbWFnZXMiLCJtb2RhbGl0eSIsInNlYXJjaCIsImNsYXVkZUtleSIsInJlc3BvbnNlIiwibWF4X3Rva2VucyIsIm1vZGVsIiwiY2xhdWRlTW9kZWwiLCJzeXN0ZW0iLCJjYWNoZSIsImhlYWRlcnMiLCJIZWFkZXJzIiwidGltZW91dCIsImVycm9yIiwidGV4dCIsImZpbHRlciIsInBhcnQiLCJtYXAiLCJqb2luIiwic3RvcF9yZWFzb24iLCJzb3VyY2VzIiwib3BlbmFpS2V5IiwiaW5zdHJ1Y3Rpb25zIiwibWF4X291dHB1dF90b2tlbnMiLCJvcGVuYWlNb2RlbCIsInJlYXNvbmluZyIsImVmZm9ydCIsInN0b3JlIiwidHJ1bmNhdGlvbiIsIkF1dGhvcml6YXRpb24iLCJzdGF0dXMiLCJvdXRwdXQiLCJpdGVtIiwiZmxhdE1hcCIsImdlbWluaUtleSIsInBhcnRzIiwiaW1hZ2UiLCJpbmxpbmVEYXRhIiwiZGF0YSIsImJ5dGVzIiwidG9TdHJpbmciLCJtaW1lVHlwZSIsIm1pbWUiLCJnZW1pbmlJbWFnZU1vZGVsIiwiZ2VtaW5pTW9kZWwiLCJjb250ZW50cyIsInN5c3RlbUluc3RydWN0aW9uIiwiZ2VuZXJhdGlvbkNvbmZpZyIsImFzcGVjdFJhdGlvIiwiaW1hZ2VDb25maWciLCJyZXNwb25zZU1vZGFsaXRpZXMiLCJtYXhPdXRwdXRUb2tlbnMiLCJ0b29scyIsImdvb2dsZVNlYXJjaCIsImNvZGUiLCJwcm9tcHRGZWVkYmFjayIsImJsb2NrUmVhc29uIiwiY2FuZGlkYXRlcyIsImNhbmRpZGF0ZSIsImZpbmlzaFJlYXNvbiIsInRob3VnaHQiLCJpbmxpbmUiLCJmaW5kIiwiQnVmZmVyIiwiZnJvbSIsImdyb3VuZGluZ01ldGFkYXRhIiwiZ3JvdW5kaW5nQ2h1bmtzIiwid2ViIiwidXJsIiwiVVJMIiwidXJpIiwicHJvdG9jb2wiLCJ0aXRsZSIsImhvc3RuYW1lIiwiaHJlZiIsInNlYXJjaFN1Z2dlc3Rpb25zSHRtbCIsInNlYXJjaEVudHJ5UG9pbnQiLCJyZW5kZXJlZENvbnRlbnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLElBQUksUUFBTyxvQkFBb0I7QUFFdkMsU0FBUUMsTUFBTSxRQUFPLGVBQWU7QUE2Q3BDLCtFQUErRSxHQUMvRSxPQUFPLE1BQU1DLHVDQUF1Q0M7QUFBTztBQUMzRCw0RkFBNEYsR0FDNUYsT0FBTyxNQUFNQyx1Q0FBdUNEO0FBQU87QUFnQjNELHVGQUF1RixHQUN2RixPQUFPLE1BQU1FLGtCQUFrQixPQUM3QkMsT0FDQUMsU0FBa0NOLE9BQU9PLEdBQUcsQ0FBMEIsd0JBQXdCLENBQUMsQ0FBQztJQUVoRyxJQUFHLENBQUM7UUFBQztRQUFVO1FBQVU7S0FBUyxDQUFDQyxRQUFRLENBQUNILE1BQU1JLFFBQVEsR0FBRztRQUMzRCxN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
|
|
293
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb250ZW50R2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3Bvc3R9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25Db25maWcge1xuICBjbGF1ZGVLZXk/OiBzdHJpbmc7XG4gIGNsYXVkZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlJbWFnZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlLZXk/OiBzdHJpbmc7XG4gIGdlbWluaU1vZGVsPzogc3RyaW5nO1xuICBvcGVuYWlLZXk/OiBzdHJpbmc7XG4gIG9wZW5haU1vZGVsPzogc3RyaW5nO1xufVxuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25QYXJ0ID0ge3RleHQ6IHN0cmluZzsgdHlwZTogJ3RleHQnfSB8IHtcbiAgZGV0YWlsPzogJ2F1dG8nIHwgJ2hpZ2gnIHwgJ2xvdyc7XG4gIHR5cGU6ICdpbWFnZSc7XG4gIHVybDogc3RyaW5nO1xufTtcbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25NZXNzYWdlIHtcbiAgY29udGVudDogc3RyaW5nIHwgQ29udGVudEdlbmVyYXRpb25QYXJ0W107XG4gIHJvbGU6ICdhc3Npc3RhbnQnIHwgJ2RldmVsb3BlcicgfCAnc3lzdGVtJyB8ICd1c2VyJztcbn1cbmV4cG9ydCB0eXBlIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQgPSB7dHlwZTogJ2pzb25fb2JqZWN0JyB8ICd0ZXh0J30gfCB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmljdD86IGJvb2xlYW47XG4gIHR5cGU6ICdqc29uX3NjaGVtYSc7XG59O1xuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25SZWFzb25pbmdFZmZvcnQgPSAnbm9uZScgfCAnbWluaW1hbCcgfCAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ3hoaWdoJyB8ICdtYXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0aW9uSW5wdXQge1xuICBhc3BlY3RSYXRpbz86IHN0cmluZztcbiAgaW1hZ2VzPzoge2J5dGVzOiBCdWZmZXI7IG1pbWU6IHN0cmluZ31bXTtcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICBtZXNzYWdlcz86IENvbnRlbnRHZW5lcmF0aW9uTWVzc2FnZVtdO1xuICBtb2RhbGl0eT86ICdpbWFnZScgfCAndGV4dCc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBwcm9tcHQ/OiBzdHJpbmc7XG4gIHByb3ZpZGVyOiAnY2xhdWRlJyB8ICdnZW1pbmknIHwgJ29wZW5haSc7XG4gIHJlYXNvbmluZ0VmZm9ydD86IENvbnRlbnRHZW5lcmF0aW9uUmVhc29uaW5nRWZmb3J0O1xuICByZXNwb25zZUZvcm1hdD86IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQ7XG4gIHNlYXJjaD86IGJvb2xlYW47XG4gIHN5c3RlbT86IHN0cmluZztcbiAgdGltZW91dE1zPzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZWRDb250ZW50IHtcbiAgaW1hZ2U/OiB7Ynl0ZXM6IEJ1ZmZlcjsgbWltZTogJ2ltYWdlL2pwZWcnIHwgJ2ltYWdlL3BuZyd9O1xuICBzZWFyY2hTdWdnZXN0aW9uc0h0bWw/OiBzdHJpbmc7XG4gIHNvdXJjZXM6IHt0aXRsZTogc3RyaW5nOyB1cmw6IHN0cmluZ31bXTtcbiAgdGV4dDogc3RyaW5nO1xufVxuLyoqIEEgY29uZmlybWVkIHJlamVjdGlvbiBpcyBkaXN0aW5jdCBmcm9tIGFuIHVua25vd24gcGFpZCBzdWJtaXNzaW9uIG91dGNvbWUuICovXG5leHBvcnQgY2xhc3MgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yIGV4dGVuZHMgRXJyb3Ige31cbi8qKiBBbiBhY2NlcHRlZCBnZW5lcmF0aW9uIGRpZCBub3QgcHJvZHVjZSB1c2FibGUgb3V0cHV0OyBkbyBub3QgYXV0b21hdGljYWxseSByZXN1Ym1pdCBpdC4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG5pbnRlcmZhY2UgR2VtaW5pUGFydCB7aW5saW5lRGF0YT86IHtkYXRhOiBzdHJpbmc7IG1pbWVUeXBlOiBzdHJpbmd9OyB0ZXh0Pzogc3RyaW5nOyB0aG91Z2h0PzogYm9vbGVhbn1cbmludGVyZmFjZSBHZW1pbmlSZXNwb25zZSB7XG4gIGNhbmRpZGF0ZXM/OiB7XG4gICAgY29udGVudD86IHtwYXJ0cz86IEdlbWluaVBhcnRbXX07XG4gICAgZmluaXNoUmVhc29uPzogc3RyaW5nO1xuICAgIGdyb3VuZGluZ01ldGFkYXRhPzoge1xuICAgICAgZ3JvdW5kaW5nQ2h1bmtzPzoge3dlYj86IHt0aXRsZT86IHN0cmluZzsgdXJpPzogc3RyaW5nfX1bXTtcbiAgICAgIHNlYXJjaEVudHJ5UG9pbnQ/OiB7cmVuZGVyZWRDb250ZW50Pzogc3RyaW5nfTtcbiAgICB9O1xuICB9W107XG4gIGVycm9yPzoge2NvZGU/OiBudW1iZXJ9O1xuICBwcm9tcHRGZWVkYmFjaz86IHtibG9ja1JlYXNvbj86IHN0cmluZ307XG59XG5cbmNvbnN0IHZhbGlkTWVzc2FnZUNvbnRlbnQgPSAobWVzc2FnZTogQ29udGVudEdlbmVyYXRpb25NZXNzYWdlKTogYm9vbGVhbiA9PiB7XG4gIGlmKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09ICdzdHJpbmcnKSByZXR1cm4gISFtZXNzYWdlLmNvbnRlbnQudHJpbSgpO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpICYmIG1lc3NhZ2UuY29udGVudC5sZW5ndGggPiAwICYmIG1lc3NhZ2UuY29udGVudC5ldmVyeSgocGFydCkgPT4ge1xuICAgIGlmKCFwYXJ0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYocGFydC50eXBlID09PSAndGV4dCcpIHJldHVybiB0eXBlb2YgcGFydC50ZXh0ID09PSAnc3RyaW5nJyAmJiAhIXBhcnQudGV4dC50cmltKCk7XG4gICAgcmV0dXJuIHBhcnQudHlwZSA9PT0gJ2ltYWdlJyAmJiBtZXNzYWdlLnJvbGUgPT09ICd1c2VyJyAmJiB0eXBlb2YgcGFydC51cmwgPT09ICdzdHJpbmcnXG4gICAgICAmJiAvXihodHRwcz86XFwvXFwvW15cXHNdK3xkYXRhOmltYWdlXFwvKHBuZ3xqcGVnfHdlYnB8Z2lmKTtiYXNlNjQsW0EtWmEtejAtOSsvXSs9ezAsMn0pJC8udGVzdChwYXJ0LnVybClcbiAgICAgICYmIChwYXJ0LmRldGFpbCA9PT0gdW5kZWZpbmVkIHx8IFsnYXV0bycsICdoaWdoJywgJ2xvdyddLmluY2x1ZGVzKHBhcnQuZGV0YWlsKSk7XG4gIH0pO1xufTtcblxuLyoqIFNpbmdsZSBzdWJtaXNzaW9uIHRocm91Z2ggUmlwLUh1bnRlcjsgY2FsbGVycyBvd24gZHVyYWJsZSBqb2JzIGFuZCByZWNvbmNpbGlhdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUNvbnRlbnQgPSBhc3luYyAoXG4gIGlucHV0OiBDb250ZW50R2VuZXJhdGlvbklucHV0LFxuICBjb25maWc6IENvbnRlbnRHZW5lcmF0aW9uQ29uZmlnID0gQ29uZmlnLmdldDxDb250ZW50R2VuZXJhdGlvbkNvbmZpZz4oJ2NvbnRlbnRHZW5lcmF0aW9uJykgfHwge31cbik6IFByb21pc2U8R2VuZXJhdGVkQ29udGVudD4gPT4ge1xuICBpZighWydjbGF1ZGUnLCAnZ2VtaW5pJywgJ29wZW5haSddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0Egc3VwcG9ydGVkIHByb3ZpZGVyIGlzIHJlcXVpcmVkLicpO1xuICB9XG4gIGlmKGlucHV0Lm1lc3NhZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZihpbnB1dC5wcm9tcHQgIT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheShpbnB1dC5tZXNzYWdlcykgfHwgIWlucHV0Lm1lc3NhZ2VzLmxlbmd0aCB8fCBpbnB1dC5tZXNzYWdlcy5zb21lKChtZXNzYWdlKSA9PlxuICAgICAgIW1lc3NhZ2UgfHwgIVsnYXNzaXN0YW50JywgJ2RldmVsb3BlcicsICdzeXN0ZW0nLCAndXNlciddLmluY2x1ZGVzKG1lc3NhZ2Uucm9sZSkgfHwgIXZhbGlkTWVzc2FnZUNvbnRlbnQobWVzc2FnZSkpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdTdXBwbHkgZWl0aGVyIGEgbm9uLWVtcHR5IHByb21wdCBvciBub24tZW1wdHkgdGV4dCBtZXNzYWdlcyB3aXRoIHN1cHBvcnRlZCByb2xlcy4nKTtcbiAgICB9XG4gIH0gZWxzZSBpZih0eXBlb2YgaW5wdXQucHJvbXB0ICE9PSAnc3RyaW5nJyB8fCAhaW5wdXQucHJvbXB0LnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0Egbm9uLWVtcHR5IHByb21wdCBpcyByZXF1aXJlZC4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciAhPT0gJ29wZW5haScgJiYgKGlucHV0Lm1lc3NhZ2VzICE9PSB1bmRlZmluZWQgfHwgaW5wdXQucmVhc29uaW5nRWZmb3J0ICE9PSB1bmRlZmluZWQgfHwgaW5wdXQucmVzcG9uc2VGb3JtYXQgIT09IHVuZGVmaW5lZCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdNZXNzYWdlcywgcmVhc29uaW5nIGVmZm9ydCwgYW5kIHJlc3BvbnNlIGZvcm1hdCBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IGJ5IE9wZW5BSS4nKTtcbiAgfVxuICBpZihpbnB1dC50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0ludGVnZXIoaW5wdXQudGltZW91dE1zKSB8fCBpbnB1dC50aW1lb3V0TXMgPCAxIHx8IGlucHV0LnRpbWVvdXRNcyA+IDJfMTQ3XzQ4M182NDcpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcigndGltZW91dE1zIG11c3QgYmUgYSBwb3NpdGl2ZSAzMi1iaXQgaW50ZWdlci4nKTtcbiAgfVxuICBpZihpbnB1dC5yZWFzb25pbmdFZmZvcnQgIT09IHVuZGVmaW5lZCAmJiAhWydub25lJywgJ21pbmltYWwnLCAnbG93JywgJ21lZGl1bScsICdoaWdoJywgJ3hoaWdoJywgJ21heCddLmluY2x1ZGVzKGlucHV0LnJlYXNvbmluZ0VmZm9ydCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdVbnN1cHBvcnRlZCByZWFzb25pbmcgZWZmb3J0LicpO1xuICB9XG4gIGNvbnN0IGZvcm1hdCA9IGlucHV0LnJlc3BvbnNlRm9ybWF0O1xuICBpZihmb3JtYXQgIT09IHVuZGVmaW5lZCAmJiAoIWZvcm1hdCB8fCAhWyd0ZXh0JywgJ2pzb25fb2JqZWN0JywgJ2pzb25fc2NoZW1hJ10uaW5jbHVkZXMoZm9ybWF0LnR5cGUpIHx8IChmb3JtYXQudHlwZSA9PT0gJ2pzb25fc2NoZW1hJyAmJiAoXG4gICAgdHlwZW9mIGZvcm1hdC5uYW1lICE9PSAnc3RyaW5nJyB8fCAhL15bYS16QS1aMC05Xy1dezEsNjR9JC8udGVzdChmb3JtYXQubmFtZSkgfHwgIWZvcm1hdC5zY2hlbWEgfHwgdHlwZW9mIGZvcm1hdC5zY2hlbWEgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZm9ybWF0LnNjaGVtYSlcbiAgICB8fCAoZm9ybWF0LnN0cmljdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBmb3JtYXQuc3RyaWN0ICE9PSAnYm9vbGVhbicpXG4gICkpKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0ludmFsaWQgcmVzcG9uc2UgZm9ybWF0LiBKU09OIHNjaGVtYXMgcmVxdWlyZSBhIG5hbWUgYW5kIHNjaGVtYSBvYmplY3QuJyk7XG4gIH1cbiAgaWYoaW5wdXQubWF4VG9rZW5zICE9PSB1bmRlZmluZWQgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlucHV0Lm1heFRva2VucykgfHwgaW5wdXQubWF4VG9rZW5zIDwgMSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdtYXhUb2tlbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuJyk7XG4gIH1cbiAgaWYoaW5wdXQucHJvdmlkZXIgIT09ICdnZW1pbmknICYmIChpbnB1dC5pbWFnZXM/Lmxlbmd0aCB8fCBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyB8fCBpbnB1dC5zZWFyY2gpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVGhpcyBwcm92aWRlciBvcGVyYXRpb24gc3VwcG9ydHMgdGV4dCBpbnB1dCBhbmQgb3V0cHV0IG9ubHkuJyk7XG4gIH1cbiAgY29uc3Qge3Byb21wdCwgaW1hZ2VzID0gW119ID0gaW5wdXQ7XG4gIGlmKGlucHV0LnByb3ZpZGVyID09PSAnY2xhdWRlJykge1xuICAgIGlmKCFjb25maWcuY2xhdWRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdDbGF1ZGUgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2ZXIuJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdCgnaHR0cHM6Ly9hcGkuYW50aHJvcGljLmNvbS92MS9tZXNzYWdlcycsIHtcbiAgICAgIG1heF90b2tlbnM6IGlucHV0Lm1heFRva2VucyA/PyA0MDk2LFxuICAgICAgbWVzc2FnZXM6IFt7Y29udGVudDogcHJvbXB0LCByb2xlOiAndXNlcid9XSxcbiAgICAgIG1vZGVsOiBpbnB1dC5tb2RlbCB8fCBjb25maWcuY2xhdWRlTW9kZWwgfHwgJ2NsYXVkZS1zb25uZXQtNScsXG4gICAgICBzeXN0ZW06IGlucHV0LnN5c3RlbVxuICAgIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHsnYW50aHJvcGljLXZlcnNpb24nOiAnMjAyMy0wNi0wMScsICd4LWFwaS1rZXknOiBjb25maWcuY2xhdWRlS2V5fSksIHRpbWVvdXQ6IGlucHV0LnRpbWVvdXRNcyA/PyAxMjBfMDAwfSkgYXMge1xuICAgICAgY29udGVudD86IHt0ZXh0Pzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfVtdO1xuICAgICAgZXJyb3I/OiB7dHlwZT86IHN0cmluZ307XG4gICAgICBzdG9wX3JlYXNvbj86IHN0cmluZztcbiAgICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBpZihyZXNwb25zZS5lcnJvciAmJiBbJ2F1dGhlbnRpY2F0aW9uX2Vycm9yJywgJ2ludmFsaWRfcmVxdWVzdF9lcnJvcicsICdub3RfZm91bmRfZXJyb3InLCAncGVybWlzc2lvbl9lcnJvciddLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLnR5cGUgfHwgJycpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdDbGF1ZGUgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSBtb2RlbCBhbmQgYWNjb3VudCBhY2Nlc3MuJyk7XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSByZXNwb25zZS5jb250ZW50Py5maWx0ZXIoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3RleHQnKS5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCB8fCAnJykuam9pbignXFxuJykudHJpbSgpO1xuICAgIGlmKHJlc3BvbnNlLmVycm9yIHx8IHJlc3BvbnNlLnR5cGUgIT09ICdtZXNzYWdlJyB8fCByZXNwb25zZS5zdG9wX3JlYXNvbiAhPT0gJ2VuZF90dXJuJyB8fCAhdGV4dCkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignQ2xhdWRlIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB7c291cmNlczogW10sIHRleHR9O1xuICB9XG4gIGlmKGlucHV0LnByb3ZpZGVyID09PSAnb3BlbmFpJykge1xuICAgIGlmKCFjb25maWcub3BlbmFpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdPcGVuQUkgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2ZXIuJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdCgnaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MS9yZXNwb25zZXMnLCB7XG4gICAgICBpbnB1dDogaW5wdXQubWVzc2FnZXM/Lm1hcCgobWVzc2FnZSkgPT4gKHtjb250ZW50OiB0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSAnc3RyaW5nJyA/IG1lc3NhZ2UuY29udGVudCA6IG1lc3NhZ2UuY29udGVudC5tYXAoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3RleHQnXG4gICAgICAgID8ge3RleHQ6IHBhcnQudGV4dCwgdHlwZTogJ2lucHV0X3RleHQnfSA6IHtkZXRhaWw6IHBhcnQuZGV0YWlsID8/ICdhdXRvJywgaW1hZ2VfdXJsOiBwYXJ0LnVybCwgdHlwZTogJ2lucHV0X2ltYWdlJ30pLCByb2xlOiBtZXNzYWdlLnJvbGUgPT09ICdzeXN0ZW0nID8gJ2RldmVsb3BlcicgOiBtZXNzYWdlLnJvbGV9KSkgPz8gcHJvbXB0LFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBpbnB1dC5zeXN0ZW0sXG4gICAgICBtYXhfb3V0cHV0X3Rva2VuczogaW5wdXQubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICBtb2RlbDogaW5wdXQubW9kZWwgfHwgY29uZmlnLm9wZW5haU1vZGVsIHx8ICdncHQtNi1hc3RyYScsXG4gICAgICAuLi4oaW5wdXQucmVhc29uaW5nRWZmb3J0ID8ge3JlYXNvbmluZzoge2VmZm9ydDogaW5wdXQucmVhc29uaW5nRWZmb3J0fX0gOiB7fSksXG4gICAgICBzdG9yZTogZmFsc2UsXG4gICAgICAuLi4oZm9ybWF0ID8ge3RleHQ6IHtmb3JtYXR9fSA6IHt9KSxcbiAgICAgIHRydW5jYXRpb246ICdkaXNhYmxlZCdcbiAgICB9LCB7Y2FjaGU6IGZhbHNlLCBoZWFkZXJzOiBuZXcgSGVhZGVycyh7QXV0aG9yaXphdGlvbjogYEJlYXJlciAke2NvbmZpZy5vcGVuYWlLZXl9YH0pLCB0aW1lb3V0OiBpbnB1dC50aW1lb3V0TXMgPz8gMTIwXzAwMH0pIGFzIHtcbiAgICAgIGVycm9yPzoge2NvZGU/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9O1xuICAgICAgb3V0cHV0Pzoge2NvbnRlbnQ/OiB7dGV4dD86IHN0cmluZzsgdHlwZT86IHN0cmluZ31bXTsgc3RhdHVzPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfVtdO1xuICAgICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIH07XG4gICAgaWYocmVzcG9uc2UuZXJyb3IgJiYgWydpbnZhbGlkX3JlcXVlc3RfZXJyb3InLCAnYXV0aGVudGljYXRpb25fZXJyb3InLCAncGVybWlzc2lvbl9lcnJvciddLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLnR5cGUgfHwgJycpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdPcGVuQUkgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSBtb2RlbCBhbmQgYWNjb3VudCBhY2Nlc3MuJyk7XG4gICAgfVxuICAgIGlmKHJlc3BvbnNlLmVycm9yIHx8IHJlc3BvbnNlLnN0YXR1cyAhPT0gJ2NvbXBsZXRlZCcgfHwgcmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2luY29tcGxldGUnKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignT3BlbkFJIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQ6IGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZS4nKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQ/LnNvbWUoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3JlZnVzYWwnKSkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09wZW5BSSBkZWNsaW5lZCB0aGUgcmVxdWVzdC4nKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnR5cGUgJiYgIVsnbWVzc2FnZScsICdyZWFzb25pbmcnXS5pbmNsdWRlcyhpdGVtLnR5cGUpKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignT3BlbkFJIHJldHVybmVkIGFuIHVuc3VwcG9ydGVkIG91dHB1dCBpdGVtLicpO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcmVzcG9uc2Uub3V0cHV0Py5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ21lc3NhZ2UnKS5mbGF0TWFwKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQgfHwgW10pXG4gICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdvdXRwdXRfdGV4dCcpLm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKS5qb2luKCcnKS50cmltKCk7XG4gICAgaWYoIXRleHQpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09wZW5BSSByZXR1cm5lZCBlbXB0eSBvdXRwdXQuJyk7XG4gICAgfVxuICAgIHJldHVybiB7c291cmNlczogW10sIHRleHR9O1xuICB9XG4gIGlmKCFjb25maWcuZ2VtaW5pS2V5KSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignR2VtaW5pIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgc2VydmVyLicpO1xuICB9XG4gIGNvbnN0IHBhcnRzOiB1bmtub3duW10gPSBbe3RleHQ6IHByb21wdH0sIC4uLmltYWdlcy5tYXAoKGltYWdlKSA9PiAoe2lubGluZURhdGE6IHtkYXRhOiBpbWFnZS5ieXRlcy50b1N0cmluZygnYmFzZTY0JyksIG1pbWVUeXBlOiBpbWFnZS5taW1lfX0pKV07XG4gIGNvbnN0IG1vZGVsID0gaW5wdXQubW9kZWwgfHwgKGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnID8gY29uZmlnLmdlbWluaUltYWdlTW9kZWwgfHwgJ2dlbWluaS0zLjEtZmxhc2gtaW1hZ2UnIDogY29uZmlnLmdlbWluaU1vZGVsIHx8ICdnZW1pbmktMy44LWZsYXNoJyk7XG4gIGlmKCEvXlthLXpBLVowLTkuXy1dKyQvLnRlc3QobW9kZWwpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignSW52YWxpZCBHZW1pbmkgbW9kZWwgY29uZmlndXJhdGlvbi4nKTtcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3QoYGh0dHBzOi8vZ2VuZXJhdGl2ZWxhbmd1YWdlLmdvb2dsZWFwaXMuY29tL3YxYmV0YS9tb2RlbHMvJHttb2RlbH06Z2VuZXJhdGVDb250ZW50YCwge1xuICAgIGNvbnRlbnRzOiBbe3BhcnRzLCByb2xlOiAndXNlcid9XSxcbiAgICAuLi4oaW5wdXQuc3lzdGVtID8ge3N5c3RlbUluc3RydWN0aW9uOiB7cGFydHM6IFt7dGV4dDogaW5wdXQuc3lzdGVtfV19fSA6IHt9KSxcbiAgICBnZW5lcmF0aW9uQ29uZmlnOiBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyA/IHsuLi4oaW5wdXQuYXNwZWN0UmF0aW8gPyB7aW1hZ2VDb25maWc6IHthc3BlY3RSYXRpbzogaW5wdXQuYXNwZWN0UmF0aW99fSA6IHt9KSwgcmVzcG9uc2VNb2RhbGl0aWVzOiBbJ1RFWFQnLCAnSU1BR0UnXX0gOiB7bWF4T3V0cHV0VG9rZW5zOiBpbnB1dC5tYXhUb2tlbnMgPz8gNDA5Nn0sXG4gICAgLi4uKGlucHV0LnNlYXJjaCA/IHt0b29sczogW3tnb29nbGVTZWFyY2g6IHt9fV19IDoge30pXG4gIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHsneC1nb29nLWFwaS1rZXknOiBjb25maWcuZ2VtaW5pS2V5fSksIHRpbWVvdXQ6IGlucHV0LnRpbWVvdXRNcyA/PyAxMjBfMDAwfSkgYXMgR2VtaW5pUmVzcG9uc2U7XG4gIGlmKHJlc3BvbnNlLmVycm9yICYmIFs0MDAsIDQwMSwgNDAzLCA0MDRdLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLmNvZGUgfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdHZW1pbmkgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSByZWZlcmVuY2UgZm9ybWF0IGFuZCBtb2RlbCBhY2Nlc3MuJyk7XG4gIH1cbiAgaWYocmVzcG9uc2UucHJvbXB0RmVlZGJhY2s/LmJsb2NrUmVhc29uIHx8IHJlc3BvbnNlLmVycm9yIHx8ICFyZXNwb25zZS5jYW5kaWRhdGVzPy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdHZW1pbmkgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZC4nKTtcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSByZXNwb25zZS5jYW5kaWRhdGVzWzBdITtcbiAgaWYoY2FuZGlkYXRlLmZpbmlzaFJlYXNvbiAhPT0gJ1NUT1AnKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignR2VtaW5pIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQ6IGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZS4nKTtcbiAgfVxuICBjb25zdCBvdXRwdXQgPSAoY2FuZGlkYXRlLmNvbnRlbnQ/LnBhcnRzIHx8IFtdKS5maWx0ZXIoKHBhcnQpID0+ICFwYXJ0LnRob3VnaHQpO1xuICBjb25zdCBpbmxpbmUgPSBvdXRwdXQuZmluZCgocGFydCkgPT4gcGFydC5pbmxpbmVEYXRhKT8uaW5saW5lRGF0YTtcbiAgbGV0IGltYWdlOiBHZW5lcmF0ZWRDb250ZW50WydpbWFnZSddO1xuICBpZihpbmxpbmUgJiYgWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZyddLmluY2x1ZGVzKGlubGluZS5taW1lVHlwZSkpIHtcbiAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKGlubGluZS5kYXRhLCAnYmFzZTY0Jyk7XG4gICAgaWYoIWJ5dGVzLmxlbmd0aCB8fCBieXRlcy5sZW5ndGggPiAyMCAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdJbnZhbGlkIGltYWdlIG91dHB1dC4nKTtcbiAgICB9XG4gICAgaW1hZ2UgPSB7Ynl0ZXMsIG1pbWU6IGlubGluZS5taW1lVHlwZSBhcyAnaW1hZ2UvcG5nJyB8ICdpbWFnZS9qcGVnJ307XG4gIH1cbiAgY29uc3QgdGV4dCA9IG91dHB1dC5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCB8fCAnJykuam9pbignXFxuJykudHJpbSgpO1xuICBpZihpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyA/ICFpbWFnZSA6ICF0ZXh0KSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignVGhlIHJlcXVlc3RlZCBvdXRwdXQgd2FzIG5vdCByZXR1cm5lZC4nKTtcbiAgfVxuICBjb25zdCBzb3VyY2VzID0gKGNhbmRpZGF0ZS5ncm91bmRpbmdNZXRhZGF0YT8uZ3JvdW5kaW5nQ2h1bmtzIHx8IFtdKS5mbGF0TWFwKCh7d2VifSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdlYj8udXJpIHx8ICcnKTtcbiAgICAgIHJldHVybiB1cmwucHJvdG9jb2wgPT09ICdodHRwczonID8gW3t0aXRsZTogd2ViPy50aXRsZSB8fCB1cmwuaG9zdG5hbWUsIHVybDogdXJsLmhyZWZ9XSA6IFtdO1xuICAgIH0gY2F0Y2h7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBpbWFnZSwgc2VhcmNoU3VnZ2VzdGlvbnNIdG1sOiBjYW5kaWRhdGUuZ3JvdW5kaW5nTWV0YWRhdGE/LnNlYXJjaEVudHJ5UG9pbnQ/LnJlbmRlcmVkQ29udGVudCwgc291cmNlcywgdGV4dFxuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJwb3N0IiwiQ29uZmlnIiwiQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yIiwiRXJyb3IiLCJDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IiLCJ2YWxpZE1lc3NhZ2VDb250ZW50IiwibWVzc2FnZSIsImNvbnRlbnQiLCJ0cmltIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiZXZlcnkiLCJwYXJ0IiwidHlwZSIsInRleHQiLCJyb2xlIiwidXJsIiwidGVzdCIsImRldGFpbCIsInVuZGVmaW5lZCIsImluY2x1ZGVzIiwiZ2VuZXJhdGVDb250ZW50IiwiaW5wdXQiLCJjb25maWciLCJnZXQiLCJwcm92aWRlciIsIm1lc3NhZ2VzIiwicHJvbXB0Iiwic29tZSIsInJlYXNvbmluZ0VmZm9ydCIsInJlc3BvbnNlRm9ybWF0IiwidGltZW91dE1zIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiZm9ybWF0IiwibmFtZSIsInNjaGVtYSIsInN0cmljdCIsIm1heFRva2VucyIsImltYWdlcyIsIm1vZGFsaXR5Iiwic2VhcmNoIiwiY2xhdWRlS2V5IiwicmVzcG9uc2UiLCJtYXhfdG9rZW5zIiwibW9kZWwiLCJjbGF1ZGVNb2RlbCIsInN5c3RlbSIsImNhY2hlIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJ0aW1lb3V0IiwiZXJyb3IiLCJmaWx0ZXIiLCJtYXAiLCJqb2luIiwic3RvcF9yZWFzb24iLCJzb3VyY2VzIiwib3BlbmFpS2V5IiwiaW1hZ2VfdXJsIiwiaW5zdHJ1Y3Rpb25zIiwibWF4X291dHB1dF90b2tlbnMiLCJvcGVuYWlNb2RlbCIsInJlYXNvbmluZyIsImVmZm9ydCIsInN0b3JlIiwidHJ1bmNhdGlvbiIsIkF1dGhvcml6YXRpb24iLCJzdGF0dXMiLCJvdXRwdXQiLCJpdGVtIiwiZmxhdE1hcCIsImdlbWluaUtleSIsInBhcnRzIiwiaW1hZ2UiLCJpbmxpbmVEYXRhIiwiZGF0YSIsImJ5dGVzIiwidG9TdHJpbmciLCJtaW1lVHlwZSIsIm1pbWUiLCJnZW1pbmlJbWFnZU1vZGVsIiwiZ2VtaW5pTW9kZWwiLCJjb250ZW50cyIsInN5c3RlbUluc3RydWN0aW9uIiwiZ2VuZXJhdGlvbkNvbmZpZyIsImFzcGVjdFJhdGlvIiwiaW1hZ2VDb25maWciLCJyZXNwb25zZU1vZGFsaXRpZXMiLCJtYXhPdXRwdXRUb2tlbnMiLCJ0b29scyIsImdvb2dsZVNlYXJjaCIsImNvZGUiLCJwcm9tcHRGZWVkYmFjayIsImJsb2NrUmVhc29uIiwiY2FuZGlkYXRlcyIsImNhbmRpZGF0ZSIsImZpbmlzaFJlYXNvbiIsInRob3VnaHQiLCJpbmxpbmUiLCJmaW5kIiwiQnVmZmVyIiwiZnJvbSIsImdyb3VuZGluZ01ldGFkYXRhIiwiZ3JvdW5kaW5nQ2h1bmtzIiwid2ViIiwiVVJMIiwidXJpIiwicHJvdG9jb2wiLCJ0aXRsZSIsImhvc3RuYW1lIiwiaHJlZiIsInNlYXJjaFN1Z2dlc3Rpb25zSHRtbCIsInNlYXJjaEVudHJ5UG9pbnQiLCJyZW5kZXJlZENvbnRlbnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLElBQUksUUFBTyxvQkFBb0I7QUFFdkMsU0FBUUMsTUFBTSxRQUFPLGVBQWU7QUFrRHBDLCtFQUErRSxHQUMvRSxPQUFPLE1BQU1DLHVDQUF1Q0M7QUFBTztBQUMzRCw0RkFBNEYsR0FD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
|
package/lib/actions/index.d.ts
CHANGED
package/lib/actions/index.js
CHANGED
|
@@ -36,5 +36,6 @@ export * from './imageGeneration.js';
|
|
|
36
36
|
export * from './contentGeneration.js';
|
|
37
37
|
export * from './videoGeneration.js';
|
|
38
38
|
export * from './geminiVideo.js';
|
|
39
|
+
export * from './openaiResponseSession.js';
|
|
39
40
|
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2UgaXMgc3ViamVjdCB0byB0aGUgYWNjb21wYW55aW5nIGNvbW1lcmNpYWwgTElDRU5TRS5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9hcHBzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYW5hbHl0aWNzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29ubmVjdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhYmFzZVByb3Zpc2lvbmluZ0xlYXNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YWJhc2VBY2NvdW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnNhdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jcm0uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9keW5hbW9kYi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2VtYWlsLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZmlsZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9mbGFncy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2dyb3Vwcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2hpZ2dzZmllbGQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbWFnZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9pb3MuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9sb2NhdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdlcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL25vdGlmaWNhdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wYXltZW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3Bvc3RzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGVyc29uYXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZWFjdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ydW0uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zMy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NlYXJjaC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3Ntcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3N0YXRpc3RpY3MuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdWJzY3JpcHRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdGFncy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3VzZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdmlkZW9zLmpzJztcblxuZXhwb3J0ICogZnJvbSAnLi9pbWFnZUdlbmVyYXRpb24uanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRlbnRHZW5lcmF0aW9uLmpzJztcblxuZXhwb3J0ICogZnJvbSAnLi92aWRlb0dlbmVyYXRpb24uanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2dlbWluaVZpZGVvLmpzJztcblxuZXhwb3J0ICogZnJvbSAnLi9vcGVuYWlSZXNwb25zZVNlc3Npb24uanMnO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELGNBQWMsWUFBWTtBQUMxQixjQUFjLGlCQUFpQjtBQUMvQixjQUFjLG1CQUFtQjtBQUNqQyxjQUFjLGlDQUFpQztBQUMvQyxjQUFjLHdCQUF3QjtBQUN0QyxjQUFjLHFCQUFxQjtBQUNuQyxjQUFjLFdBQVc7QUFDekIsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsYUFBYTtBQUMzQixjQUFjLGFBQWE7QUFDM0IsY0FBYyxjQUFjO0FBQzVCLGNBQWMsa0JBQWtCO0FBQ2hDLGNBQWMsY0FBYztBQUM1QixjQUFjLFdBQVc7QUFDekIsY0FBYyxpQkFBaUI7QUFDL0IsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxxQkFBcUI7QUFDbkMsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsZ0JBQWdCO0FBQzlCLGNBQWMsaUJBQWlCO0FBQy9CLGNBQWMsV0FBVztBQUN6QixjQUFjLFVBQVU7QUFDeEIsY0FBYyxjQUFjO0FBQzVCLGNBQWMsV0FBVztBQUN6QixjQUFjLGtCQUFrQjtBQUNoQyxjQUFjLHFCQUFxQjtBQUNuQyxjQUFjLFlBQVk7QUFDMUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsY0FBYztBQUU1QixjQUFjLHVCQUF1QjtBQUVyQyxjQUFjLHlCQUF5QjtBQUV2QyxjQUFjLHVCQUF1QjtBQUVyQyxjQUFjLG1CQUFtQjtBQUVqQyxjQUFjLDZCQUE2QiJ9
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import WebSocket from 'ws';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
declare const reasoningEffort: z.ZodEnum<{
|
|
4
|
+
high: "high";
|
|
5
|
+
low: "low";
|
|
6
|
+
max: "max";
|
|
7
|
+
medium: "medium";
|
|
8
|
+
minimal: "minimal";
|
|
9
|
+
none: "none";
|
|
10
|
+
xhigh: "xhigh";
|
|
11
|
+
}>;
|
|
12
|
+
export type OpenAIResponseReasoningEffort = z.infer<typeof reasoningEffort>;
|
|
13
|
+
type Item = Record<string, unknown>;
|
|
14
|
+
export type OpenAIResponseEvent = {
|
|
15
|
+
type: string;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
};
|
|
18
|
+
export type OpenAIResponseSessionOptions = {
|
|
19
|
+
input: Item[];
|
|
20
|
+
instructions?: string;
|
|
21
|
+
max_output_tokens: number;
|
|
22
|
+
model: string;
|
|
23
|
+
reasoning?: {
|
|
24
|
+
effort: OpenAIResponseReasoningEffort;
|
|
25
|
+
};
|
|
26
|
+
text?: {
|
|
27
|
+
format: Item;
|
|
28
|
+
};
|
|
29
|
+
tools?: Item[];
|
|
30
|
+
};
|
|
31
|
+
export type OpenAIResponseOutput = {
|
|
32
|
+
id: string;
|
|
33
|
+
incomplete_details?: {
|
|
34
|
+
reason?: string;
|
|
35
|
+
};
|
|
36
|
+
output?: Array<{
|
|
37
|
+
content?: Array<{
|
|
38
|
+
text?: string;
|
|
39
|
+
type: string;
|
|
40
|
+
}>;
|
|
41
|
+
status?: string;
|
|
42
|
+
type: string;
|
|
43
|
+
}>;
|
|
44
|
+
status: string;
|
|
45
|
+
};
|
|
46
|
+
export declare const readOpenAIResponseText: (response: OpenAIResponseOutput) => string;
|
|
47
|
+
export declare const createOpenAIResponseSession: (options: OpenAIResponseSessionOptions, onEvent: (event: OpenAIResponseEvent) => void, config: {
|
|
48
|
+
apiKey: string;
|
|
49
|
+
connect?: () => WebSocket;
|
|
50
|
+
maxToolCalls: number;
|
|
51
|
+
signal?: AbortSignal;
|
|
52
|
+
timeoutMs: number;
|
|
53
|
+
}) => {
|
|
54
|
+
close: () => void;
|
|
55
|
+
continue: (text: string) => void;
|
|
56
|
+
reasoning: (effort: OpenAIResponseReasoningEffort) => void;
|
|
57
|
+
steer: (text: string) => void;
|
|
58
|
+
toolResult: (callId: string, output: string) => void;
|
|
59
|
+
};
|
|
60
|
+
export {};
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import WebSocket from 'ws';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
const reasoningEffort = z.enum([
|
|
4
|
+
'none',
|
|
5
|
+
'minimal',
|
|
6
|
+
'low',
|
|
7
|
+
'medium',
|
|
8
|
+
'high',
|
|
9
|
+
'xhigh',
|
|
10
|
+
'max'
|
|
11
|
+
]);
|
|
12
|
+
export const readOpenAIResponseText = (response)=>{
|
|
13
|
+
if (response.status !== 'completed' || response.output?.some((item)=>item.status === 'incomplete')) {
|
|
14
|
+
throw new Error(`OpenAI response did not complete: ${response.incomplete_details?.reason || response.status}`);
|
|
15
|
+
}
|
|
16
|
+
if (response.output?.some((item)=>item.content?.some((part)=>part.type === 'refusal'))) {
|
|
17
|
+
throw new Error('OpenAI declined the request.');
|
|
18
|
+
}
|
|
19
|
+
const text = (response.output || []).flatMap((item)=>item.type === 'message' ? item.content || [] : []).filter((part)=>part.type === 'output_text').map((part)=>part.text || '').join('');
|
|
20
|
+
if (!text.trim()) {
|
|
21
|
+
throw new Error('OpenAI returned empty output.');
|
|
22
|
+
}
|
|
23
|
+
return text;
|
|
24
|
+
};
|
|
25
|
+
// One owner and one conversation per socket. Never replay requests after a disconnect:
|
|
26
|
+
// tools may already have run, and accepted steering is connection-local.
|
|
27
|
+
export const createOpenAIResponseSession = (options, onEvent, config)=>{
|
|
28
|
+
if (!config.apiKey.trim()) throw new Error('OpenAI API key is not configured.');
|
|
29
|
+
if (!options.model.trim() || !Number.isInteger(options.max_output_tokens) || options.max_output_tokens < 1) {
|
|
30
|
+
throw new Error('A model and positive output token budget are required.');
|
|
31
|
+
}
|
|
32
|
+
if (!Number.isInteger(config.timeoutMs) || config.timeoutMs < 1 || config.timeoutMs > 2_147_483_647 || !Number.isInteger(config.maxToolCalls) || config.maxToolCalls < 0) {
|
|
33
|
+
throw new Error('Invalid session timeout or tool-call limit.');
|
|
34
|
+
}
|
|
35
|
+
if (config.signal?.aborted) throw new Error('OpenAI session was aborted.');
|
|
36
|
+
if (options.reasoning) reasoningEffort.parse(options.reasoning.effort);
|
|
37
|
+
const settings = {
|
|
38
|
+
...options,
|
|
39
|
+
input: undefined,
|
|
40
|
+
store: false,
|
|
41
|
+
truncation: 'disabled'
|
|
42
|
+
};
|
|
43
|
+
const connect = config.connect || (()=>new WebSocket('wss://api.openai.com/v1/responses', {
|
|
44
|
+
handshakeTimeout: Math.min(10000, config.timeoutMs),
|
|
45
|
+
headers: {
|
|
46
|
+
Authorization: `Bearer ${config.apiKey}`
|
|
47
|
+
},
|
|
48
|
+
maxPayload: 16 * 1024 * 1024
|
|
49
|
+
}));
|
|
50
|
+
const socket = connect();
|
|
51
|
+
const seenCalls = new Set();
|
|
52
|
+
const calls = new Map();
|
|
53
|
+
let active = true;
|
|
54
|
+
let closed = false;
|
|
55
|
+
let currentId;
|
|
56
|
+
let pendingSteer;
|
|
57
|
+
let nextEffort;
|
|
58
|
+
let timer;
|
|
59
|
+
const close = ()=>{
|
|
60
|
+
if (closed) return;
|
|
61
|
+
closed = true;
|
|
62
|
+
clearTimeout(timer);
|
|
63
|
+
config.signal?.removeEventListener('abort', close);
|
|
64
|
+
calls.clear();
|
|
65
|
+
seenCalls.clear();
|
|
66
|
+
socket.close();
|
|
67
|
+
};
|
|
68
|
+
const fail = (message)=>{
|
|
69
|
+
if (closed) return;
|
|
70
|
+
close();
|
|
71
|
+
onEvent({
|
|
72
|
+
message,
|
|
73
|
+
type: 'session.error'
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
const armTimeout = ()=>{
|
|
77
|
+
clearTimeout(timer);
|
|
78
|
+
timer = setTimeout(()=>fail('OpenAI session timed out. Start a new session; requests were not replayed.'), config.timeoutMs);
|
|
79
|
+
timer.unref?.();
|
|
80
|
+
};
|
|
81
|
+
const send = (event)=>{
|
|
82
|
+
if (closed || socket.readyState !== WebSocket.OPEN) throw new Error('OpenAI connection is not open.');
|
|
83
|
+
socket.send(JSON.stringify(event));
|
|
84
|
+
};
|
|
85
|
+
const create = (input)=>{
|
|
86
|
+
active = true;
|
|
87
|
+
armTimeout();
|
|
88
|
+
send({
|
|
89
|
+
...settings,
|
|
90
|
+
input,
|
|
91
|
+
...currentId ? {
|
|
92
|
+
previous_response_id: currentId
|
|
93
|
+
} : {},
|
|
94
|
+
type: 'response.create'
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
const flushTools = ()=>{
|
|
98
|
+
if (active || !currentId) return;
|
|
99
|
+
// Synchronous calls must all be satisfied before starting another response.
|
|
100
|
+
if ([
|
|
101
|
+
...calls.values()
|
|
102
|
+
].some(({ item, output })=>!item.async && output === undefined)) return;
|
|
103
|
+
const ready = [
|
|
104
|
+
...calls.entries()
|
|
105
|
+
].filter(([, call])=>call.output !== undefined);
|
|
106
|
+
if (!ready.length) return;
|
|
107
|
+
create(ready.map(([callId, { item, output }])=>({
|
|
108
|
+
call_id: callId,
|
|
109
|
+
output,
|
|
110
|
+
type: item.type === 'custom_tool_call' ? 'custom_tool_call_output' : 'function_call_output'
|
|
111
|
+
})));
|
|
112
|
+
for (const [id] of ready)calls.delete(id);
|
|
113
|
+
};
|
|
114
|
+
const registerCall = (item)=>{
|
|
115
|
+
if (![
|
|
116
|
+
'function_call',
|
|
117
|
+
'custom_tool_call'
|
|
118
|
+
].includes(String(item.type))) return;
|
|
119
|
+
const id = String(item.call_id || '');
|
|
120
|
+
if (!id) throw new Error('OpenAI tool call is missing its call_id.');
|
|
121
|
+
if (seenCalls.has(id)) return;
|
|
122
|
+
if (seenCalls.size >= config.maxToolCalls) throw new Error('Session tool-call limit exceeded.');
|
|
123
|
+
if (item.status === 'incomplete') throw new Error('OpenAI returned an incomplete tool call.');
|
|
124
|
+
if (!options.tools?.some((tool)=>tool.name === item.name && tool.type === (item.type === 'function_call' ? 'function' : 'custom'))) throw new Error('OpenAI requested an unregistered tool.');
|
|
125
|
+
seenCalls.add(id);
|
|
126
|
+
calls.set(id, {
|
|
127
|
+
item
|
|
128
|
+
});
|
|
129
|
+
onEvent({
|
|
130
|
+
item,
|
|
131
|
+
type: 'session.tool_call'
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
socket.on('open', ()=>{
|
|
135
|
+
if (closed) return;
|
|
136
|
+
try {
|
|
137
|
+
create(options.input);
|
|
138
|
+
} catch (error) {
|
|
139
|
+
fail(error.message);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
socket.on('message', (data)=>{
|
|
143
|
+
if (closed) return;
|
|
144
|
+
try {
|
|
145
|
+
const event = JSON.parse(data.toString());
|
|
146
|
+
const response = event.response;
|
|
147
|
+
if (event.type === 'response.created' && response) {
|
|
148
|
+
if (pendingSteer && response.id !== pendingSteer) pendingSteer = undefined;
|
|
149
|
+
currentId = response.id;
|
|
150
|
+
active = true;
|
|
151
|
+
}
|
|
152
|
+
if (event.type === 'response.output_item.done') registerCall(event.item);
|
|
153
|
+
onEvent(event);
|
|
154
|
+
if (closed) return;
|
|
155
|
+
if ([
|
|
156
|
+
'error',
|
|
157
|
+
'response.failed',
|
|
158
|
+
'response.steer.failed'
|
|
159
|
+
].includes(event.type)) {
|
|
160
|
+
const detail = event.error || event.response?.error;
|
|
161
|
+
fail(detail?.message?.slice(0, 2000) || 'OpenAI response or steering failed. See the preceding provider event.');
|
|
162
|
+
} else if (event.type === 'response.incomplete') {
|
|
163
|
+
if (response?.incomplete_details?.reason !== 'steered' || !pendingSteer) {
|
|
164
|
+
fail(`OpenAI response did not complete: ${response?.incomplete_details?.reason || 'unknown'}`);
|
|
165
|
+
}
|
|
166
|
+
} else if (event.type === 'response.completed' && response) {
|
|
167
|
+
if (response.status !== 'completed') throw new Error('Invalid completed response.');
|
|
168
|
+
for (const item of response.output || [])registerCall(item);
|
|
169
|
+
active = false;
|
|
170
|
+
if (calls.size) {
|
|
171
|
+
onEvent({
|
|
172
|
+
pending: [
|
|
173
|
+
...calls.keys()
|
|
174
|
+
],
|
|
175
|
+
type: 'session.tools_pending'
|
|
176
|
+
});
|
|
177
|
+
flushTools();
|
|
178
|
+
} else if (!pendingSteer) {
|
|
179
|
+
onEvent({
|
|
180
|
+
response,
|
|
181
|
+
text: readOpenAIResponseText(response),
|
|
182
|
+
type: 'session.turn.completed'
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
} else if (event.type === 'response.steer.pending') {
|
|
186
|
+
active = false;
|
|
187
|
+
flushTools();
|
|
188
|
+
}
|
|
189
|
+
} catch (error) {
|
|
190
|
+
fail(error.message);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
socket.on('error', ()=>fail('OpenAI WebSocket connection failed.'));
|
|
194
|
+
socket.on('close', ()=>fail('OpenAI connection closed. Pending work was not replayed.'));
|
|
195
|
+
config.signal?.addEventListener('abort', close, {
|
|
196
|
+
once: true
|
|
197
|
+
});
|
|
198
|
+
armTimeout();
|
|
199
|
+
return {
|
|
200
|
+
close,
|
|
201
|
+
continue: (text)=>{
|
|
202
|
+
if (closed) throw new Error('OpenAI connection is not open.');
|
|
203
|
+
if (active || pendingSteer || [
|
|
204
|
+
...calls.values()
|
|
205
|
+
].some(({ item })=>!item.async)) {
|
|
206
|
+
throw new Error('Wait for the current response or required tool results before continuing.');
|
|
207
|
+
}
|
|
208
|
+
const input = [];
|
|
209
|
+
if (nextEffort) input.push({
|
|
210
|
+
reasoning: {
|
|
211
|
+
effort: nextEffort
|
|
212
|
+
},
|
|
213
|
+
type: 'configuration_update'
|
|
214
|
+
});
|
|
215
|
+
input.push({
|
|
216
|
+
content: text,
|
|
217
|
+
role: 'user'
|
|
218
|
+
});
|
|
219
|
+
create(input);
|
|
220
|
+
nextEffort = undefined;
|
|
221
|
+
},
|
|
222
|
+
reasoning: (effort)=>{
|
|
223
|
+
if (closed) throw new Error('OpenAI connection is not open.');
|
|
224
|
+
nextEffort = reasoningEffort.parse(effort);
|
|
225
|
+
onEvent({
|
|
226
|
+
effort: nextEffort,
|
|
227
|
+
type: 'session.reasoning.queued'
|
|
228
|
+
});
|
|
229
|
+
},
|
|
230
|
+
steer: (text)=>{
|
|
231
|
+
if (!active || !currentId || pendingSteer) throw new Error('Steering requires an active response with no pending steering.');
|
|
232
|
+
send({
|
|
233
|
+
input: text,
|
|
234
|
+
previous_response_id: currentId,
|
|
235
|
+
type: 'response.steer'
|
|
236
|
+
});
|
|
237
|
+
pendingSteer = currentId;
|
|
238
|
+
},
|
|
239
|
+
toolResult: (callId, output)=>{
|
|
240
|
+
const call = calls.get(callId);
|
|
241
|
+
if (!call || call.output !== undefined) throw new Error('Unknown or duplicate tool result.');
|
|
242
|
+
call.output = output;
|
|
243
|
+
flushTools();
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9vcGVuYWlSZXNwb25zZVNlc3Npb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFdlYlNvY2tldCBmcm9tICd3cyc7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5cbmNvbnN0IHJlYXNvbmluZ0VmZm9ydCA9IHouZW51bShbJ25vbmUnLCAnbWluaW1hbCcsICdsb3cnLCAnbWVkaXVtJywgJ2hpZ2gnLCAneGhpZ2gnLCAnbWF4J10pO1xuZXhwb3J0IHR5cGUgT3BlbkFJUmVzcG9uc2VSZWFzb25pbmdFZmZvcnQgPSB6LmluZmVyPHR5cGVvZiByZWFzb25pbmdFZmZvcnQ+O1xudHlwZSBJdGVtID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5leHBvcnQgdHlwZSBPcGVuQUlSZXNwb25zZUV2ZW50ID0ge3R5cGU6IHN0cmluZzsgW2tleTogc3RyaW5nXTogdW5rbm93bn07XG5leHBvcnQgdHlwZSBPcGVuQUlSZXNwb25zZVNlc3Npb25PcHRpb25zID0ge1xuICBpbnB1dDogSXRlbVtdO1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIG1heF9vdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIHJlYXNvbmluZz86IHtlZmZvcnQ6IE9wZW5BSVJlc3BvbnNlUmVhc29uaW5nRWZmb3J0fTtcbiAgdGV4dD86IHtmb3JtYXQ6IEl0ZW19O1xuICB0b29scz86IEl0ZW1bXTtcbn07XG5leHBvcnQgdHlwZSBPcGVuQUlSZXNwb25zZU91dHB1dCA9IHtcbiAgaWQ6IHN0cmluZztcbiAgaW5jb21wbGV0ZV9kZXRhaWxzPzoge3JlYXNvbj86IHN0cmluZ307XG4gIG91dHB1dD86IEFycmF5PHtjb250ZW50PzogQXJyYXk8e3RleHQ/OiBzdHJpbmc7IHR5cGU6IHN0cmluZ30+OyBzdGF0dXM/OiBzdHJpbmc7IHR5cGU6IHN0cmluZ30+O1xuICBzdGF0dXM6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCByZWFkT3BlbkFJUmVzcG9uc2VUZXh0ID0gKHJlc3BvbnNlOiBPcGVuQUlSZXNwb25zZU91dHB1dCk6IHN0cmluZyA9PiB7XG4gIGlmKHJlc3BvbnNlLnN0YXR1cyAhPT0gJ2NvbXBsZXRlZCcgfHwgcmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2luY29tcGxldGUnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgT3BlbkFJIHJlc3BvbnNlIGRpZCBub3QgY29tcGxldGU6ICR7cmVzcG9uc2UuaW5jb21wbGV0ZV9kZXRhaWxzPy5yZWFzb24gfHwgcmVzcG9uc2Uuc3RhdHVzfWApO1xuICB9XG4gIGlmKHJlc3BvbnNlLm91dHB1dD8uc29tZSgoaXRlbSkgPT4gaXRlbS5jb250ZW50Py5zb21lKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdyZWZ1c2FsJykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdPcGVuQUkgZGVjbGluZWQgdGhlIHJlcXVlc3QuJyk7XG4gIH1cbiAgY29uc3QgdGV4dCA9IChyZXNwb25zZS5vdXRwdXQgfHwgW10pLmZsYXRNYXAoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ21lc3NhZ2UnID8gaXRlbS5jb250ZW50IHx8IFtdIDogW10pXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydC50eXBlID09PSAnb3V0cHV0X3RleHQnKS5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCB8fCAnJykuam9pbignJyk7XG4gIGlmKCF0ZXh0LnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignT3BlbkFJIHJldHVybmVkIGVtcHR5IG91dHB1dC4nKTtcbiAgfVxuICByZXR1cm4gdGV4dDtcbn07XG5cbi8vIE9uZSBvd25lciBhbmQgb25lIGNvbnZlcnNhdGlvbiBwZXIgc29ja2V0LiBOZXZlciByZXBsYXkgcmVxdWVzdHMgYWZ0ZXIgYSBkaXNjb25uZWN0OlxuLy8gdG9vbHMgbWF5IGFscmVhZHkgaGF2ZSBydW4sIGFuZCBhY2NlcHRlZCBzdGVlcmluZyBpcyBjb25uZWN0aW9uLWxvY2FsLlxuZXhwb3J0IGNvbnN0IGNyZWF0ZU9wZW5BSVJlc3BvbnNlU2Vzc2lvbiA9IChcbiAgb3B0aW9uczogT3BlbkFJUmVzcG9uc2VTZXNzaW9uT3B0aW9ucyxcbiAgb25FdmVudDogKGV2ZW50OiBPcGVuQUlSZXNwb25zZUV2ZW50KSA9PiB2b2lkLFxuICBjb25maWc6IHtcbiAgICBhcGlLZXk6IHN0cmluZztcbiAgICBjb25uZWN0PzogKCkgPT4gV2ViU29ja2V0O1xuICAgIG1heFRvb2xDYWxsczogbnVtYmVyO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAgIHRpbWVvdXRNczogbnVtYmVyO1xuICB9XG4pID0+IHtcbiAgaWYoIWNvbmZpZy5hcGlLZXkudHJpbSgpKSB0aHJvdyBuZXcgRXJyb3IoJ09wZW5BSSBBUEkga2V5IGlzIG5vdCBjb25maWd1cmVkLicpO1xuICBpZighb3B0aW9ucy5tb2RlbC50cmltKCkgfHwgIU51bWJlci5pc0ludGVnZXIob3B0aW9ucy5tYXhfb3V0cHV0X3Rva2VucykgfHwgb3B0aW9ucy5tYXhfb3V0cHV0X3Rva2VucyA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgbW9kZWwgYW5kIHBvc2l0aXZlIG91dHB1dCB0b2tlbiBidWRnZXQgYXJlIHJlcXVpcmVkLicpO1xuICB9XG4gIGlmKCFOdW1iZXIuaXNJbnRlZ2VyKGNvbmZpZy50aW1lb3V0TXMpIHx8IGNvbmZpZy50aW1lb3V0TXMgPCAxIHx8IGNvbmZpZy50aW1lb3V0TXMgPiAyXzE0N180ODNfNjQ3XG4gICAgfHwgIU51bWJlci5pc0ludGVnZXIoY29uZmlnLm1heFRvb2xDYWxscykgfHwgY29uZmlnLm1heFRvb2xDYWxscyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2Vzc2lvbiB0aW1lb3V0IG9yIHRvb2wtY2FsbCBsaW1pdC4nKTtcbiAgfVxuICBpZihjb25maWcuc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBuZXcgRXJyb3IoJ09wZW5BSSBzZXNzaW9uIHdhcyBhYm9ydGVkLicpO1xuICBpZihvcHRpb25zLnJlYXNvbmluZykgcmVhc29uaW5nRWZmb3J0LnBhcnNlKG9wdGlvbnMucmVhc29uaW5nLmVmZm9ydCk7XG4gIGNvbnN0IHNldHRpbmdzID0gey4uLm9wdGlvbnMsIGlucHV0OiB1bmRlZmluZWQsIHN0b3JlOiBmYWxzZSwgdHJ1bmNhdGlvbjogJ2Rpc2FibGVkJ307XG4gIGNvbnN0IGNvbm5lY3QgPSBjb25maWcuY29ubmVjdCB8fCAoKCkgPT4gbmV3IFdlYlNvY2tldCgnd3NzOi8vYXBpLm9wZW5haS5jb20vdjEvcmVzcG9uc2VzJywge1xuICAgIGhhbmRzaGFrZVRpbWVvdXQ6IE1hdGgubWluKDEwMDAwLCBjb25maWcudGltZW91dE1zKSxcbiAgICBoZWFkZXJzOiB7QXV0aG9yaXphdGlvbjogYEJlYXJlciAke2NvbmZpZy5hcGlLZXl9YH0sXG4gICAgbWF4UGF5bG9hZDogMTYgKiAxMDI0ICogMTAyNFxuICB9KSk7XG4gIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QoKTtcbiAgY29uc3Qgc2VlbkNhbGxzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGNhbGxzID0gbmV3IE1hcDxzdHJpbmcsIHtpdGVtOiBJdGVtOyBvdXRwdXQ/OiBzdHJpbmd9PigpO1xuICBsZXQgYWN0aXZlID0gdHJ1ZTtcbiAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuICBsZXQgY3VycmVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBwZW5kaW5nU3RlZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG5leHRFZmZvcnQ6IE9wZW5BSVJlc3BvbnNlUmVhc29uaW5nRWZmb3J0IHwgdW5kZWZpbmVkO1xuICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBjb25zdCBjbG9zZSA9ICgpID0+IHtcbiAgICBpZihjbG9zZWQpIHJldHVybjtcbiAgICBjbG9zZWQgPSB0cnVlO1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgY29uZmlnLnNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBjbG9zZSk7XG4gICAgY2FsbHMuY2xlYXIoKTtcbiAgICBzZWVuQ2FsbHMuY2xlYXIoKTtcbiAgICBzb2NrZXQuY2xvc2UoKTtcbiAgfTtcbiAgY29uc3QgZmFpbCA9IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICBpZihjbG9zZWQpIHJldHVybjtcbiAgICBjbG9zZSgpO1xuICAgIG9uRXZlbnQoe21lc3NhZ2UsIHR5cGU6ICdzZXNzaW9uLmVycm9yJ30pO1xuICB9O1xuICBjb25zdCBhcm1UaW1lb3V0ID0gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGZhaWwoJ09wZW5BSSBzZXNzaW9uIHRpbWVkIG91dC4gU3RhcnQgYSBuZXcgc2Vzc2lvbjsgcmVxdWVzdHMgd2VyZSBub3QgcmVwbGF5ZWQuJyksIGNvbmZpZy50aW1lb3V0TXMpO1xuICAgIHRpbWVyLnVucmVmPy4oKTtcbiAgfTtcbiAgY29uc3Qgc2VuZCA9IChldmVudDogSXRlbSkgPT4ge1xuICAgIGlmKGNsb3NlZCB8fCBzb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHRocm93IG5ldyBFcnJvcignT3BlbkFJIGNvbm5lY3Rpb24gaXMgbm90IG9wZW4uJyk7XG4gICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoZXZlbnQpKTtcbiAgfTtcbiAgY29uc3QgY3JlYXRlID0gKGlucHV0OiBJdGVtW10pID0+IHtcbiAgICBhY3RpdmUgPSB0cnVlO1xuICAgIGFybVRpbWVvdXQoKTtcbiAgICBzZW5kKHsuLi5zZXR0aW5ncywgaW5wdXQsIC4uLihjdXJyZW50SWQgPyB7cHJldmlvdXNfcmVzcG9uc2VfaWQ6IGN1cnJlbnRJZH0gOiB7fSksIHR5cGU6ICdyZXNwb25zZS5jcmVhdGUnfSk7XG4gIH07XG4gIGNvbnN0IGZsdXNoVG9vbHMgPSAoKSA9PiB7XG4gICAgaWYoYWN0aXZlIHx8ICFjdXJyZW50SWQpIHJldHVybjtcbiAgICAvLyBTeW5jaHJvbm91cyBjYWxscyBtdXN0IGFsbCBiZSBzYXRpc2ZpZWQgYmVmb3JlIHN0YXJ0aW5nIGFub3RoZXIgcmVzcG9uc2UuXG4gICAgaWYoWy4uLmNhbGxzLnZhbHVlcygpXS5zb21lKCh7aXRlbSwgb3V0cHV0fSkgPT4gIWl0ZW0uYXN5bmMgJiYgb3V0cHV0ID09PSB1bmRlZmluZWQpKSByZXR1cm47XG4gICAgY29uc3QgcmVhZHkgPSBbLi4uY2FsbHMuZW50cmllcygpXS5maWx0ZXIoKFssIGNhbGxdKSA9PiBjYWxsLm91dHB1dCAhPT0gdW5kZWZpbmVkKTtcbiAgICBpZighcmVhZHkubGVuZ3RoKSByZXR1cm47XG4gICAgY3JlYXRlKHJlYWR5Lm1hcCgoW2NhbGxJZCwge2l0ZW0sIG91dHB1dH1dKSA9PiAoe1xuICAgICAgY2FsbF9pZDogY2FsbElkLFxuICAgICAgb3V0cHV0LFxuICAgICAgdHlwZTogaXRlbS50eXBlID09PSAnY3VzdG9tX3Rvb2xfY2FsbCcgPyAnY3VzdG9tX3Rvb2xfY2FsbF9vdXRwdXQnIDogJ2Z1bmN0aW9uX2NhbGxfb3V0cHV0J1xuICAgIH0pKSk7XG4gICAgZm9yKGNvbnN0IFtpZF0gb2YgcmVhZHkpIGNhbGxzLmRlbGV0ZShpZCk7XG4gIH07XG4gIGNvbnN0IHJlZ2lzdGVyQ2FsbCA9IChpdGVtOiBJdGVtKSA9PiB7XG4gICAgaWYoIVsnZnVuY3Rpb25fY2FsbCcsICdjdXN0b21fdG9vbF9jYWxsJ10uaW5jbHVkZXMoU3RyaW5nKGl0ZW0udHlwZSkpKSByZXR1cm47XG4gICAgY29uc3QgaWQgPSBTdHJpbmcoaXRlbS5jYWxsX2lkIHx8ICcnKTtcbiAgICBpZighaWQpIHRocm93IG5ldyBFcnJvcignT3BlbkFJIHRvb2wgY2FsbCBpcyBtaXNzaW5nIGl0cyBjYWxsX2lkLicpO1xuICAgIGlmKHNlZW5DYWxscy5oYXMoaWQpKSByZXR1cm47XG4gICAgaWYoc2VlbkNhbGxzLnNpemUgPj0gY29uZmlnLm1heFRvb2xDYWxscykgdGhyb3cgbmV3IEVycm9yKCdTZXNzaW9uIHRvb2wtY2FsbCBsaW1pdCBleGNlZWRlZC4nKTtcbiAgICBpZihpdGVtLnN0YXR1cyA9PT0gJ2luY29tcGxldGUnKSB0aHJvdyBuZXcgRXJyb3IoJ09wZW5BSSByZXR1cm5lZCBhbiBpbmNvbXBsZXRlIHRvb2wgY2FsbC4nKTtcbiAgICBpZighb3B0aW9ucy50b29scz8uc29tZSgodG9vbCkgPT4gdG9vbC5uYW1lID09PSBpdGVtLm5hbWUgJiYgdG9vbC50eXBlID09PSAoaXRlbS50eXBlID09PSAnZnVuY3Rpb25fY2FsbCcgPyAnZnVuY3Rpb24nIDogJ2N1c3RvbScpKSkgdGhyb3cgbmV3IEVycm9yKCdPcGVuQUkgcmVxdWVzdGVkIGFuIHVucmVnaXN0ZXJlZCB0b29sLicpO1xuICAgIHNlZW5DYWxscy5hZGQoaWQpO1xuICAgIGNhbGxzLnNldChpZCwge2l0ZW19KTtcbiAgICBvbkV2ZW50KHtpdGVtLCB0eXBlOiAnc2Vzc2lvbi50b29sX2NhbGwnfSk7XG4gIH07XG4gIHNvY2tldC5vbignb3BlbicsICgpID0+IHtcbiAgICBpZihjbG9zZWQpIHJldHVybjtcbiAgICB0cnkgeyBjcmVhdGUob3B0aW9ucy5pbnB1dCk7IH0gY2F0Y2goZXJyb3IpIHsgZmFpbCgoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UpOyB9XG4gIH0pO1xuICBzb2NrZXQub24oJ21lc3NhZ2UnLCAoZGF0YSkgPT4ge1xuICAgIGlmKGNsb3NlZCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBldmVudCA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpKSBhcyBPcGVuQUlSZXNwb25zZUV2ZW50O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5yZXNwb25zZSBhcyBPcGVuQUlSZXNwb25zZU91dHB1dCB8IHVuZGVmaW5lZDtcbiAgICAgIGlmKGV2ZW50LnR5cGUgPT09ICdyZXNwb25zZS5jcmVhdGVkJyAmJiByZXNwb25zZSkge1xuICAgICAgICBpZihwZW5kaW5nU3RlZXIgJiYgcmVzcG9uc2UuaWQgIT09IHBlbmRpbmdTdGVlcikgcGVuZGluZ1N0ZWVyID0gdW5kZWZpbmVkO1xuICAgICAgICBjdXJyZW50SWQgPSByZXNwb25zZS5pZDtcbiAgICAgICAgYWN0aXZlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmKGV2ZW50LnR5cGUgPT09ICdyZXNwb25zZS5vdXRwdXRfaXRlbS5kb25lJykgcmVnaXN0ZXJDYWxsKGV2ZW50Lml0ZW0gYXMgSXRlbSk7XG4gICAgICBvbkV2ZW50KGV2ZW50KTtcbiAgICAgIGlmKGNsb3NlZCkgcmV0dXJuO1xuICAgICAgaWYoWydlcnJvcicsICdyZXNwb25zZS5mYWlsZWQnLCAncmVzcG9uc2Uuc3RlZXIuZmFpbGVkJ10uaW5jbHVkZXMoZXZlbnQudHlwZSkpIHtcbiAgICAgICAgY29uc3QgZGV0YWlsID0gKGV2ZW50LmVycm9yIHx8IChldmVudC5yZXNwb25zZSBhcyB7ZXJyb3I/OiB7bWVzc2FnZT86IHN0cmluZ319KT8uZXJyb3IpIGFzIHttZXNzYWdlPzogc3RyaW5nfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgZmFpbChkZXRhaWw/Lm1lc3NhZ2U/LnNsaWNlKDAsIDIwMDApIHx8ICdPcGVuQUkgcmVzcG9uc2Ugb3Igc3RlZXJpbmcgZmFpbGVkLiBTZWUgdGhlIHByZWNlZGluZyBwcm92aWRlciBldmVudC4nKTtcbiAgICAgIH0gZWxzZSBpZihldmVudC50eXBlID09PSAncmVzcG9uc2UuaW5jb21wbGV0ZScpIHtcbiAgICAgICAgaWYocmVzcG9uc2U/LmluY29tcGxldGVfZGV0YWlscz8ucmVhc29uICE9PSAnc3RlZXJlZCcgfHwgIXBlbmRpbmdTdGVlcikge1xuICAgICAgICAgIGZhaWwoYE9wZW5BSSByZXNwb25zZSBkaWQgbm90IGNvbXBsZXRlOiAke3Jlc3BvbnNlPy5pbmNvbXBsZXRlX2RldGFpbHM/LnJlYXNvbiB8fCAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZihldmVudC50eXBlID09PSAncmVzcG9uc2UuY29tcGxldGVkJyAmJiByZXNwb25zZSkge1xuICAgICAgICBpZihyZXNwb25zZS5zdGF0dXMgIT09ICdjb21wbGV0ZWQnKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29tcGxldGVkIHJlc3BvbnNlLicpO1xuICAgICAgICBmb3IoY29uc3QgaXRlbSBvZiByZXNwb25zZS5vdXRwdXQgfHwgW10pIHJlZ2lzdGVyQ2FsbChpdGVtIGFzIEl0ZW0pO1xuICAgICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgaWYoY2FsbHMuc2l6ZSkge1xuICAgICAgICAgIG9uRXZlbnQoe3BlbmRpbmc6IFsuLi5jYWxscy5rZXlzKCldLCB0eXBlOiAnc2Vzc2lvbi50b29sc19wZW5kaW5nJ30pO1xuICAgICAgICAgIGZsdXNoVG9vbHMoKTtcbiAgICAgICAgfSBlbHNlIGlmKCFwZW5kaW5nU3RlZXIpIHtcbiAgICAgICAgICBvbkV2ZW50KHtyZXNwb25zZSwgdGV4dDogcmVhZE9wZW5BSVJlc3BvbnNlVGV4dChyZXNwb25zZSksIHR5cGU6ICdzZXNzaW9uLnR1cm4uY29tcGxldGVkJ30pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYoZXZlbnQudHlwZSA9PT0gJ3Jlc3BvbnNlLnN0ZWVyLnBlbmRpbmcnKSB7XG4gICAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICBmbHVzaFRvb2xzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaChlcnJvcikgeyBmYWlsKChlcnJvciBhcyBFcnJvcikubWVzc2FnZSk7IH1cbiAgfSk7XG4gIHNvY2tldC5vbignZXJyb3InLCAoKSA9PiBmYWlsKCdPcGVuQUkgV2ViU29ja2V0IGNvbm5lY3Rpb24gZmFpbGVkLicpKTtcbiAgc29ja2V0Lm9uKCdjbG9zZScsICgpID0+IGZhaWwoJ09wZW5BSSBjb25uZWN0aW9uIGNsb3NlZC4gUGVuZGluZyB3b3JrIHdhcyBub3QgcmVwbGF5ZWQuJykpO1xuICBjb25maWcuc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGNsb3NlLCB7b25jZTogdHJ1ZX0pO1xuICBhcm1UaW1lb3V0KCk7XG4gIHJldHVybiB7XG4gICAgY2xvc2UsXG4gICAgY29udGludWU6ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmKGNsb3NlZCkgdGhyb3cgbmV3IEVycm9yKCdPcGVuQUkgY29ubmVjdGlvbiBpcyBub3Qgb3Blbi4nKTtcbiAgICAgIGlmKGFjdGl2ZSB8fCBwZW5kaW5nU3RlZXIgfHwgWy4uLmNhbGxzLnZhbHVlcygpXS5zb21lKCh7aXRlbX0pID0+ICFpdGVtLmFzeW5jKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhaXQgZm9yIHRoZSBjdXJyZW50IHJlc3BvbnNlIG9yIHJlcXVpcmVkIHRvb2wgcmVzdWx0cyBiZWZvcmUgY29udGludWluZy4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlucHV0OiBJdGVtW10gPSBbXTtcbiAgICAgIGlmKG5leHRFZmZvcnQpIGlucHV0LnB1c2goe3JlYXNvbmluZzoge2VmZm9ydDogbmV4dEVmZm9ydH0sIHR5cGU6ICdjb25maWd1cmF0aW9uX3VwZGF0ZSd9KTtcbiAgICAgIGlucHV0LnB1c2goe2NvbnRlbnQ6IHRleHQsIHJvbGU6ICd1c2VyJ30pO1xuICAgICAgY3JlYXRlKGlucHV0KTtcbiAgICAgIG5leHRFZmZvcnQgPSB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICByZWFzb25pbmc6IChlZmZvcnQ6IE9wZW5BSVJlc3BvbnNlUmVhc29uaW5nRWZmb3J0KSA9PiB7XG4gICAgICBpZihjbG9zZWQpIHRocm93IG5ldyBFcnJvcignT3BlbkFJIGNvbm5lY3Rpb24gaXMgbm90IG9wZW4uJyk7XG4gICAgICBuZXh0RWZmb3J0ID0gcmVhc29uaW5nRWZmb3J0LnBhcnNlKGVmZm9ydCk7XG4gICAgICBvbkV2ZW50KHtlZmZvcnQ6IG5leHRFZmZvcnQsIHR5cGU6ICdzZXNzaW9uLnJlYXNvbmluZy5xdWV1ZWQnfSk7XG4gICAgfSxcbiAgICBzdGVlcjogKHRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYoIWFjdGl2ZSB8fCAhY3VycmVudElkIHx8IHBlbmRpbmdTdGVlcikgdGhyb3cgbmV3IEVycm9yKCdTdGVlcmluZyByZXF1aXJlcyBhbiBhY3RpdmUgcmVzcG9uc2Ugd2l0aCBubyBwZW5kaW5nIHN0ZWVyaW5nLicpO1xuICAgICAgc2VuZCh7aW5wdXQ6IHRleHQsIHByZXZpb3VzX3Jlc3BvbnNlX2lkOiBjdXJyZW50SWQsIHR5cGU6ICdyZXNwb25zZS5zdGVlcid9KTtcbiAgICAgIHBlbmRpbmdTdGVlciA9IGN1cnJlbnRJZDtcbiAgICB9LFxuICAgIHRvb2xSZXN1bHQ6IChjYWxsSWQ6IHN0cmluZywgb3V0cHV0OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGNhbGwgPSBjYWxscy5nZXQoY2FsbElkKTtcbiAgICAgIGlmKCFjYWxsIHx8IGNhbGwub3V0cHV0ICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignVW5rbm93biBvciBkdXBsaWNhdGUgdG9vbCByZXN1bHQuJyk7XG4gICAgICBjYWxsLm91dHB1dCA9IG91dHB1dDtcbiAgICAgIGZsdXNoVG9vbHMoKTtcbiAgICB9XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbIldlYlNvY2tldCIsInoiLCJyZWFzb25pbmdFZmZvcnQiLCJlbnVtIiwicmVhZE9wZW5BSVJlc3BvbnNlVGV4dCIsInJlc3BvbnNlIiwic3RhdHVzIiwib3V0cHV0Iiwic29tZSIsIml0ZW0iLCJFcnJvciIsImluY29tcGxldGVfZGV0YWlscyIsInJlYXNvbiIsImNvbnRlbnQiLCJwYXJ0IiwidHlwZSIsInRleHQiLCJmbGF0TWFwIiwiZmlsdGVyIiwibWFwIiwiam9pbiIsInRyaW0iLCJjcmVhdGVPcGVuQUlSZXNwb25zZVNlc3Npb24iLCJvcHRpb25zIiwib25FdmVudCIsImNvbmZpZyIsImFwaUtleSIsIm1vZGVsIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwibWF4X291dHB1dF90b2tlbnMiLCJ0aW1lb3V0TXMiLCJtYXhUb29sQ2FsbHMiLCJzaWduYWwiLCJhYm9ydGVkIiwicmVhc29uaW5nIiwicGFyc2UiLCJlZmZvcnQiLCJzZXR0aW5ncyIsImlucHV0IiwidW5kZWZpbmVkIiwic3RvcmUiLCJ0cnVuY2F0aW9uIiwiY29ubmVjdCIsImhhbmRzaGFrZVRpbWVvdXQiLCJNYXRoIiwibWluIiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJtYXhQYXlsb2FkIiwic29ja2V0Iiwic2VlbkNhbGxzIiwiU2V0IiwiY2FsbHMiLCJNYXAiLCJhY3RpdmUiLCJjbG9zZWQiLCJjdXJyZW50SWQiLCJwZW5kaW5nU3RlZXIiLCJuZXh0RWZmb3J0IiwidGltZXIiLCJjbG9zZSIsImNsZWFyVGltZW91dCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJjbGVhciIsImZhaWwiLCJtZXNzYWdlIiwiYXJtVGltZW91dCIsInNldFRpbWVvdXQiLCJ1bnJlZiIsInNlbmQiLCJldmVudCIsInJlYWR5U3RhdGUiLCJPUEVOIiwiSlNPTiIsInN0cmluZ2lmeSIsImNyZWF0ZSIsInByZXZpb3VzX3Jlc3BvbnNlX2lkIiwiZmx1c2hUb29scyIsInZhbHVlcyIsImFzeW5jIiwicmVhZHkiLCJlbnRyaWVzIiwiY2FsbCIsImxlbmd0aCIsImNhbGxJZCIsImNhbGxfaWQiLCJpZCIsImRlbGV0ZSIsInJlZ2lzdGVyQ2FsbCIsImluY2x1ZGVzIiwiU3RyaW5nIiwiaGFzIiwic2l6ZSIsInRvb2xzIiwidG9vbCIsIm5hbWUiLCJhZGQiLCJzZXQiLCJvbiIsImVycm9yIiwiZGF0YSIsInRvU3RyaW5nIiwiZGV0YWlsIiwic2xpY2UiLCJwZW5kaW5nIiwia2V5cyIsImFkZEV2ZW50TGlzdGVuZXIiLCJvbmNlIiwiY29udGludWUiLCJwdXNoIiwicm9sZSIsInN0ZWVyIiwidG9vbFJlc3VsdCIsImdldCJdLCJtYXBwaW5ncyI6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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nlabs/reaktor",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.0",
|
|
4
4
|
"description": "GraphQL and ArangoDB application platform for typed actions, authentication, billing, media, messaging, and realtime services.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"type": "module",
|