@nlabs/reaktor 1.17.0 → 1.18.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/README.md +182 -0
- package/docs/ASSISTANT.md +138 -0
- package/docs/GENERATION.md +15 -0
- package/docs/NATIVE_PUSH.md +56 -0
- package/lib/actions/alfredFaq.d.ts +80 -0
- package/lib/actions/alfredFaq.js +206 -0
- package/lib/actions/contentGeneration.d.ts +1 -0
- package/lib/actions/contentGeneration.js +25 -6
- package/lib/actions/conversations.d.ts +1 -1
- package/lib/actions/conversations.js +19 -9
- package/lib/actions/crud.js +26 -1
- package/lib/actions/index.d.ts +1 -0
- package/lib/actions/index.js +2 -1
- package/lib/actions/messages.js +23 -7
- package/lib/actions/users.js +57 -4
- package/lib/assistant/core.d.ts +53 -0
- package/lib/assistant/core.js +123 -0
- package/lib/assistant/faq.d.ts +26 -0
- package/lib/assistant/faq.js +238 -0
- package/lib/assistant/faqCore.d.ts +23 -0
- package/lib/assistant/faqCore.js +20 -0
- package/lib/assistant/index.d.ts +7 -0
- package/lib/assistant/index.js +5 -0
- package/lib/assistant/service.d.ts +35 -0
- package/lib/assistant/service.js +201 -0
- package/lib/durableChat/conversations.d.ts +62 -0
- package/lib/durableChat/conversations.js +729 -0
- package/lib/durableChat/errors.d.ts +6 -0
- package/lib/durableChat/errors.js +11 -0
- package/lib/durableChat/events.d.ts +22 -0
- package/lib/durableChat/events.js +50 -0
- package/lib/durableChat/index.d.ts +8 -0
- package/lib/durableChat/index.js +10 -0
- package/lib/durableChat/membership.d.ts +24 -0
- package/lib/durableChat/membership.js +85 -0
- package/lib/durableChat/messageTypes.d.ts +76 -0
- package/lib/durableChat/messageTypes.js +3 -0
- package/lib/durableChat/messages.d.ts +16 -0
- package/lib/durableChat/messages.js +257 -0
- package/lib/durableChat/transaction.d.ts +10 -0
- package/lib/durableChat/transaction.js +53 -0
- package/lib/durableChat/types.d.ts +81 -0
- package/lib/durableChat/types.js +3 -0
- package/lib/index.d.ts +4 -4
- package/lib/index.js +5 -3
- package/lib/lambdas/actions/websockets.js +4 -4
- package/lib/nativePush/graphql.d.ts +14 -0
- package/lib/nativePush/graphql.js +105 -0
- package/lib/nativePush/index.d.ts +7 -0
- package/lib/nativePush/index.js +9 -0
- package/lib/nativePush/migrations.d.ts +2 -0
- package/lib/nativePush/migrations.js +36 -0
- package/lib/nativePush/nativePushContract.fixture.d.ts +22 -0
- package/lib/nativePush/nativePushContract.fixture.js +27 -0
- package/lib/nativePush/payload.d.ts +2 -0
- package/lib/nativePush/payload.js +106 -0
- package/lib/nativePush/repository.d.ts +9 -0
- package/lib/nativePush/repository.js +120 -0
- package/lib/nativePush/service.d.ts +2 -0
- package/lib/nativePush/service.js +110 -0
- package/lib/nativePush/snsProvider.d.ts +17 -0
- package/lib/nativePush/snsProvider.js +165 -0
- package/lib/nativePush/types.d.ts +89 -0
- package/lib/nativePush/types.js +3 -0
- package/lib/organizations/accountLifecycle.d.ts +7 -0
- package/lib/organizations/accountLifecycle.js +106 -0
- package/lib/organizations/authorization.d.ts +9 -0
- package/lib/organizations/authorization.js +40 -0
- package/lib/organizations/billing.d.ts +38 -0
- package/lib/organizations/billing.js +277 -0
- package/lib/organizations/billingProvider.d.ts +4 -0
- package/lib/organizations/billingProvider.js +287 -0
- package/lib/organizations/billingUpdates.d.ts +9 -0
- package/lib/organizations/billingUpdates.js +388 -0
- package/lib/organizations/index.d.ts +10 -0
- package/lib/organizations/index.js +12 -0
- package/lib/organizations/mail.d.ts +10 -0
- package/lib/organizations/mail.js +60 -0
- package/lib/organizations/memberDirectory.d.ts +15 -0
- package/lib/organizations/memberDirectory.js +28 -0
- package/lib/organizations/membership.d.ts +19 -0
- package/lib/organizations/membership.js +248 -0
- package/lib/organizations/passwordRecovery.d.ts +9 -0
- package/lib/organizations/passwordRecovery.js +50 -0
- package/lib/organizations/plans.d.ts +6 -0
- package/lib/organizations/plans.js +40 -0
- package/lib/organizations/providerPagination.d.ts +6 -0
- package/lib/organizations/providerPagination.js +23 -0
- package/lib/organizations/reconciliation.d.ts +11 -0
- package/lib/organizations/reconciliation.js +400 -0
- package/lib/organizations/signup.d.ts +25 -0
- package/lib/organizations/signup.js +169 -0
- package/lib/organizations/store.d.ts +25 -0
- package/lib/organizations/store.js +167 -0
- package/lib/organizations/types.d.ts +138 -0
- package/lib/organizations/types.js +3 -0
- package/lib/organizations/verification.d.ts +3 -0
- package/lib/organizations/verification.js +51 -0
- package/package.json +16 -3
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { aql } from 'arangojs';
|
|
3
|
+
import { useDb } from '../utils/arangodbUtils.js';
|
|
4
|
+
const hash = (value)=>createHash('sha256').update(value).digest('hex');
|
|
5
|
+
const products = new Set([
|
|
6
|
+
'alfred',
|
|
7
|
+
'nitrogen',
|
|
8
|
+
'nitrogen-labs',
|
|
9
|
+
'nitrogen-studios',
|
|
10
|
+
'reaktor',
|
|
11
|
+
'gothamui',
|
|
12
|
+
'lanternui',
|
|
13
|
+
'metropolisjs',
|
|
14
|
+
'arkhamjs',
|
|
15
|
+
'lex',
|
|
16
|
+
'torchone',
|
|
17
|
+
'pulsify',
|
|
18
|
+
'phantaze',
|
|
19
|
+
'reactorbox'
|
|
20
|
+
]);
|
|
21
|
+
const safeText = (value, max)=>typeof value === 'string' && value.trim().length >= 8 && value.length <= max && !/[@<>]|\b(?:sk_|AKIA)|(?:\d[\s()-]*){7}/i.test(value);
|
|
22
|
+
const vectorValid = (value)=>Array.isArray(value) && value.length === 256 && value.every((n)=>typeof n === 'number' && Number.isFinite(n)) && value.some((n)=>n !== 0);
|
|
23
|
+
const sourceValid = (source)=>{
|
|
24
|
+
try {
|
|
25
|
+
const url = new URL(source.url);
|
|
26
|
+
return typeof source.title === 'string' && source.title.length <= 200 && url.protocol === 'https:' && !url.username && !url.password && !url.search && [
|
|
27
|
+
'nitrogenx.co',
|
|
28
|
+
'www.nitrogenx.co',
|
|
29
|
+
'reaktor.io',
|
|
30
|
+
'torch.one',
|
|
31
|
+
'pulsify.com',
|
|
32
|
+
'phantaze.com',
|
|
33
|
+
'reactorbox.com',
|
|
34
|
+
...[
|
|
35
|
+
'alfred',
|
|
36
|
+
'reaktor',
|
|
37
|
+
'gothamui',
|
|
38
|
+
'lanternui',
|
|
39
|
+
'metropolisjs',
|
|
40
|
+
'arkhamjs',
|
|
41
|
+
'lex'
|
|
42
|
+
].map((name)=>`${name}.nitrogenx.co`)
|
|
43
|
+
].includes(url.hostname);
|
|
44
|
+
} catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
export const validateFaqInput = (value)=>{
|
|
49
|
+
const v = value;
|
|
50
|
+
if (!v || !safeText(v.question, 500) || !products.has(v.product) || ![
|
|
51
|
+
'website',
|
|
52
|
+
'phone'
|
|
53
|
+
].includes(v.channel) || !/^[a-f0-9]{64}$/.test(v.eventId) || !vectorValid(v.embedding) || !Number.isSafeInteger(v.revision) || v.revision < 0 || typeof v.topicId !== 'string' || v.topicId && !/^topic-[a-f0-9]{64}$/.test(v.topicId)) throw new Error('invalid_faq_input');
|
|
54
|
+
return {
|
|
55
|
+
channel: v.channel,
|
|
56
|
+
embedding: v.embedding,
|
|
57
|
+
eventId: v.eventId,
|
|
58
|
+
product: v.product,
|
|
59
|
+
question: v.question.trim(),
|
|
60
|
+
revision: v.revision,
|
|
61
|
+
topicId: v.topicId
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
export const publicFaq = (topics, now)=>topics.filter((topic)=>topic.appId === 'nitrogenx' && topic.kind === 'topic' && topic.weight >= 3 && safeText(topic.answer, 2500) && (topic.answerExpires || 0) > now && topic.sources?.length && topic.sources.every(sourceValid)).sort((a, b)=>b.weight - a.weight || b.lastAsked - a.lastAsked || a._key.localeCompare(b._key)).slice(0, 15).map(({ _key, answer, question, sources })=>({
|
|
65
|
+
answer,
|
|
66
|
+
id: _key,
|
|
67
|
+
question,
|
|
68
|
+
sources
|
|
69
|
+
}));
|
|
70
|
+
const cosine = (a, b)=>{
|
|
71
|
+
if (!vectorValid(b)) return -1;
|
|
72
|
+
return a.reduce((sum, n, i)=>sum + n * b[i], 0) / Math.sqrt(a.reduce((sum, n)=>sum + n * n, 0) * b.reduce((sum, n)=>sum + n * n, 0));
|
|
73
|
+
};
|
|
74
|
+
export const faqAction = async (context, operation, value = {})=>{
|
|
75
|
+
const db = useDb(context.databaseName);
|
|
76
|
+
const collection = db.collection('alfredFaq');
|
|
77
|
+
if (!await collection.exists()) {
|
|
78
|
+
try {
|
|
79
|
+
await collection.create();
|
|
80
|
+
} catch (error) {
|
|
81
|
+
if (!await collection.exists()) throw error;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
await collection.ensureIndex({
|
|
85
|
+
fields: [
|
|
86
|
+
'appId',
|
|
87
|
+
'kind',
|
|
88
|
+
'product'
|
|
89
|
+
],
|
|
90
|
+
type: 'persistent'
|
|
91
|
+
});
|
|
92
|
+
const input = value;
|
|
93
|
+
if (operation === 'list' || operation === 'refresh-list') {
|
|
94
|
+
const topics = await db.query(aql`FOR t IN alfredFaq FILTER t.appId == 'nitrogenx' AND t.kind == 'topic' AND t.weight >= 3 SORT t.weight DESC, t.lastAsked DESC, t._key ASC RETURN t`).then((cursor)=>cursor.all());
|
|
95
|
+
return operation === 'list' ? {
|
|
96
|
+
items: publicFaq(topics.filter((topic)=>topic.sourceRevision === input.sourceRevision), Date.now())
|
|
97
|
+
} : {
|
|
98
|
+
items: topics
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (operation === 'refresh') {
|
|
102
|
+
if (typeof input.topicId !== 'string' || !/^topic-[a-f0-9]{64}$/.test(input.topicId)) throw new Error('invalid_faq_input');
|
|
103
|
+
const valid = safeText(input.answer, 2500) && Array.isArray(input.sources) && input.sources.length > 0 && input.sources.length <= 3 && input.sources.every(sourceValid) && typeof input.answerExpires === 'number' && input.answerExpires > Date.now() && input.answerExpires <= Date.now() + 14 * 86400000;
|
|
104
|
+
await db.query(aql`FOR t IN alfredFaq FILTER t._key == ${input.topicId} AND t.appId == 'nitrogenx' AND t.kind == 'topic' UPDATE t WITH ${valid ? {
|
|
105
|
+
answer: input.answer,
|
|
106
|
+
answerExpires: input.answerExpires,
|
|
107
|
+
refreshAfter: Date.now() + 12 * 3600000,
|
|
108
|
+
sourceRevision: input.sourceRevision,
|
|
109
|
+
sources: input.sources
|
|
110
|
+
} : {
|
|
111
|
+
answer: null,
|
|
112
|
+
answerExpires: 0,
|
|
113
|
+
refreshAfter: Date.now() + 12 * 3600000,
|
|
114
|
+
sourceRevision: input.sourceRevision,
|
|
115
|
+
sources: []
|
|
116
|
+
}} IN alfredFaq`);
|
|
117
|
+
return {
|
|
118
|
+
ok: true
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (operation !== 'record' && operation !== 'candidates') throw new Error('invalid_faq_input');
|
|
122
|
+
const event = validateFaqInput(value);
|
|
123
|
+
const metaKey = `catalog-${event.product}`;
|
|
124
|
+
const tx = await db.beginTransaction({
|
|
125
|
+
exclusive: [
|
|
126
|
+
'alfredFaq'
|
|
127
|
+
]
|
|
128
|
+
}, {
|
|
129
|
+
lockTimeout: 10
|
|
130
|
+
});
|
|
131
|
+
const next = async (query)=>tx.step(()=>db.query(query)).then((cursor)=>cursor.next());
|
|
132
|
+
try {
|
|
133
|
+
if (operation === 'candidates') {
|
|
134
|
+
const meta = await next(aql`RETURN DOCUMENT('alfredFaq', ${metaKey})`);
|
|
135
|
+
const topics = await tx.step(()=>db.query(aql`FOR t IN alfredFaq FILTER t.appId == 'nitrogenx' AND t.kind == 'topic' AND t.product == ${event.product} RETURN t`)).then((cursor)=>cursor.all());
|
|
136
|
+
await tx.commit();
|
|
137
|
+
return {
|
|
138
|
+
candidates: topics.map((topic)=>({
|
|
139
|
+
id: topic._key,
|
|
140
|
+
question: topic.question,
|
|
141
|
+
score: cosine(event.embedding, topic.embedding || [])
|
|
142
|
+
})).filter((topic)=>topic.score >= 0.55).sort((a, b)=>b.score - a.score).slice(0, 8),
|
|
143
|
+
revision: meta?.revision || 0
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const key = `question-${event.eventId}`;
|
|
147
|
+
const existing = await next(aql`RETURN DOCUMENT('alfredFaq', ${key})`);
|
|
148
|
+
if (existing) {
|
|
149
|
+
await tx.commit();
|
|
150
|
+
return {
|
|
151
|
+
duplicate: true,
|
|
152
|
+
topicId: existing.topicId
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const meta = await next(aql`RETURN DOCUMENT('alfredFaq', ${metaKey})`);
|
|
156
|
+
if ((meta?.revision || 0) !== event.revision) throw new Error('faq_revision_conflict');
|
|
157
|
+
const topicId = event.topicId || `topic-${hash(`${event.product}:${event.question.toLowerCase()}`)}`;
|
|
158
|
+
const timestamp = Date.now();
|
|
159
|
+
if (event.topicId) {
|
|
160
|
+
const topic = await next(aql`RETURN DOCUMENT('alfredFaq', ${topicId})`);
|
|
161
|
+
if (!topic || topic.appId !== 'nitrogenx' || topic.product !== event.product || topic.kind !== 'topic') throw new Error('invalid_faq_input');
|
|
162
|
+
}
|
|
163
|
+
await next(aql`UPSERT {_key: ${topicId}} INSERT ${{
|
|
164
|
+
_key: topicId,
|
|
165
|
+
answerExpires: 0,
|
|
166
|
+
appId: 'nitrogenx',
|
|
167
|
+
embedding: event.embedding,
|
|
168
|
+
embeddingModel: 'amazon.titan-embed-text-v2:0/256',
|
|
169
|
+
firstAsked: timestamp,
|
|
170
|
+
kind: 'topic',
|
|
171
|
+
lastAsked: timestamp,
|
|
172
|
+
phoneCount: event.channel === 'phone' ? 1 : 0,
|
|
173
|
+
product: event.product,
|
|
174
|
+
question: event.question,
|
|
175
|
+
websiteCount: event.channel === 'website' ? 1 : 0,
|
|
176
|
+
weight: 1
|
|
177
|
+
}} UPDATE {lastAsked: ${timestamp}, weight: OLD.weight + 1, phoneCount: OLD.phoneCount + ${event.channel === 'phone' ? 1 : 0}, websiteCount: OLD.websiteCount + ${event.channel === 'website' ? 1 : 0}} IN alfredFaq`);
|
|
178
|
+
await next(aql`INSERT ${{
|
|
179
|
+
_key: key,
|
|
180
|
+
appId: 'nitrogenx',
|
|
181
|
+
channel: event.channel,
|
|
182
|
+
classifierVersion: 1,
|
|
183
|
+
created: timestamp,
|
|
184
|
+
kind: 'question',
|
|
185
|
+
product: event.product,
|
|
186
|
+
question: event.question,
|
|
187
|
+
topicId
|
|
188
|
+
}} IN alfredFaq`);
|
|
189
|
+
await next(aql`UPSERT {_key: ${metaKey}} INSERT ${{
|
|
190
|
+
_key: metaKey,
|
|
191
|
+
appId: 'nitrogenx',
|
|
192
|
+
kind: 'catalog',
|
|
193
|
+
revision: event.revision + 1
|
|
194
|
+
}} UPDATE {revision: ${event.revision + 1}} IN alfredFaq`);
|
|
195
|
+
await tx.commit();
|
|
196
|
+
return {
|
|
197
|
+
duplicate: false,
|
|
198
|
+
topicId
|
|
199
|
+
};
|
|
200
|
+
} catch (error) {
|
|
201
|
+
await tx.abort();
|
|
202
|
+
throw error;
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9hbGZyZWRGYXEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjcmVhdGVIYXNofSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHt1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5cbmludGVyZmFjZSBGYXFTb3VyY2Uge3RpdGxlOiBzdHJpbmc7IHVybDogc3RyaW5nfVxuaW50ZXJmYWNlIFRvcGljIHsgX2tleTogc3RyaW5nOyBhbnN3ZXI/OiBzdHJpbmc7IGFuc3dlckV4cGlyZXM/OiBudW1iZXI7IGFwcElkOiBzdHJpbmc7IGVtYmVkZGluZz86IG51bWJlcltdOyBraW5kOiBzdHJpbmc7IGxhc3RBc2tlZDogbnVtYmVyOyBwcm9kdWN0Pzogc3RyaW5nOyBxdWVzdGlvbjogc3RyaW5nOyBzb3VyY2VzPzogRmFxU291cmNlW107IHdlaWdodDogbnVtYmVyfVxuaW50ZXJmYWNlIEZhcUlucHV0IHtjaGFubmVsOiAnd2Vic2l0ZScgfCAncGhvbmUnOyBlbWJlZGRpbmc6IG51bWJlcltdOyBldmVudElkOiBzdHJpbmc7IHByb2R1Y3Q6IHN0cmluZzsgcXVlc3Rpb246IHN0cmluZzsgcmV2aXNpb246IG51bWJlcjsgdG9waWNJZDogc3RyaW5nfVxuY29uc3QgaGFzaCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZSh2YWx1ZSkuZGlnZXN0KCdoZXgnKTtcbmNvbnN0IHByb2R1Y3RzID0gbmV3IFNldChbJ2FsZnJlZCcsICduaXRyb2dlbicsICduaXRyb2dlbi1sYWJzJywgJ25pdHJvZ2VuLXN0dWRpb3MnLCAncmVha3RvcicsICdnb3RoYW11aScsICdsYW50ZXJudWknLCAnbWV0cm9wb2xpc2pzJywgJ2Fya2hhbWpzJywgJ2xleCcsICd0b3JjaG9uZScsICdwdWxzaWZ5JywgJ3BoYW50YXplJywgJ3JlYWN0b3Jib3gnXSk7XG5jb25zdCBzYWZlVGV4dCA9ICh2YWx1ZTogdW5rbm93biwgbWF4OiBudW1iZXIpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID49IDggJiYgdmFsdWUubGVuZ3RoIDw9IG1heCAmJiAhL1tAPD5dfFxcYig/OnNrX3xBS0lBKXwoPzpcXGRbXFxzKCktXSopezd9L2kudGVzdCh2YWx1ZSk7XG5jb25zdCB2ZWN0b3JWYWxpZCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bWJlcltdID0+IEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMjU2ICYmIHZhbHVlLmV2ZXJ5KChuKSA9PiB0eXBlb2YgbiA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKG4pKSAmJiB2YWx1ZS5zb21lKChuKSA9PiBuICE9PSAwKTtcbmNvbnN0IHNvdXJjZVZhbGlkID0gKHNvdXJjZTogRmFxU291cmNlKTogYm9vbGVhbiA9PiB7XG4gIHRyeSB7Y29uc3QgdXJsID0gbmV3IFVSTChzb3VyY2UudXJsKTsgcmV0dXJuIHR5cGVvZiBzb3VyY2UudGl0bGUgPT09ICdzdHJpbmcnICYmIHNvdXJjZS50aXRsZS5sZW5ndGggPD0gMjAwICYmIHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiYgIXVybC51c2VybmFtZSAmJiAhdXJsLnBhc3N3b3JkICYmICF1cmwuc2VhcmNoICYmIFsnbml0cm9nZW54LmNvJywgJ3d3dy5uaXRyb2dlbnguY28nLCAncmVha3Rvci5pbycsICd0b3JjaC5vbmUnLCAncHVsc2lmeS5jb20nLCAncGhhbnRhemUuY29tJywgJ3JlYWN0b3Jib3guY29tJywgLi4uWydhbGZyZWQnLCAncmVha3RvcicsICdnb3RoYW11aScsICdsYW50ZXJudWknLCAnbWV0cm9wb2xpc2pzJywgJ2Fya2hhbWpzJywgJ2xleCddLm1hcCgobmFtZSkgPT4gYCR7bmFtZX0ubml0cm9nZW54LmNvYCldLmluY2x1ZGVzKHVybC5ob3N0bmFtZSk7fSBjYXRjaCB7cmV0dXJuIGZhbHNlO31cbn07XG5leHBvcnQgY29uc3QgdmFsaWRhdGVGYXFJbnB1dCA9ICh2YWx1ZTogdW5rbm93bik6IEZhcUlucHV0ID0+IHtcbiAgY29uc3QgdiA9IHZhbHVlIGFzIEZhcUlucHV0O1xuICBpZighdiB8fCAhc2FmZVRleHQodi5xdWVzdGlvbiwgNTAwKSB8fCAhcHJvZHVjdHMuaGFzKHYucHJvZHVjdCkgfHwgIVsnd2Vic2l0ZScsICdwaG9uZSddLmluY2x1ZGVzKHYuY2hhbm5lbCkgfHwgIS9eW2EtZjAtOV17NjR9JC8udGVzdCh2LmV2ZW50SWQpIHx8ICF2ZWN0b3JWYWxpZCh2LmVtYmVkZGluZykgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHYucmV2aXNpb24pIHx8IHYucmV2aXNpb24gPCAwIHx8IHR5cGVvZiB2LnRvcGljSWQgIT09ICdzdHJpbmcnIHx8ICh2LnRvcGljSWQgJiYgIS9edG9waWMtW2EtZjAtOV17NjR9JC8udGVzdCh2LnRvcGljSWQpKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkX2ZhcV9pbnB1dCcpO1xuICByZXR1cm4ge2NoYW5uZWw6IHYuY2hhbm5lbCwgZW1iZWRkaW5nOiB2LmVtYmVkZGluZywgZXZlbnRJZDogdi5ldmVudElkLCBwcm9kdWN0OiB2LnByb2R1Y3QsIHF1ZXN0aW9uOiB2LnF1ZXN0aW9uLnRyaW0oKSwgcmV2aXNpb246IHYucmV2aXNpb24sIHRvcGljSWQ6IHYudG9waWNJZH07XG59O1xuZXhwb3J0IGNvbnN0IHB1YmxpY0ZhcSA9ICh0b3BpY3M6IFRvcGljW10sIG5vdzogbnVtYmVyKSA9PiB0b3BpY3MuZmlsdGVyKCh0b3BpYykgPT4gdG9waWMuYXBwSWQgPT09ICduaXRyb2dlbngnICYmIHRvcGljLmtpbmQgPT09ICd0b3BpYycgJiYgdG9waWMud2VpZ2h0ID49IDMgJiYgc2FmZVRleHQodG9waWMuYW5zd2VyLCAyNTAwKSAmJiAodG9waWMuYW5zd2VyRXhwaXJlcyB8fCAwKSA+IG5vdyAmJiB0b3BpYy5zb3VyY2VzPy5sZW5ndGggJiYgdG9waWMuc291cmNlcy5ldmVyeShzb3VyY2VWYWxpZCkpLnNvcnQoKGEsIGIpID0+IGIud2VpZ2h0IC0gYS53ZWlnaHQgfHwgYi5sYXN0QXNrZWQgLSBhLmxhc3RBc2tlZCB8fCBhLl9rZXkubG9jYWxlQ29tcGFyZShiLl9rZXkpKS5zbGljZSgwLCAxNSkubWFwKCh7X2tleSwgYW5zd2VyLCBxdWVzdGlvbiwgc291cmNlc30pID0+ICh7YW5zd2VyLCBpZDogX2tleSwgcXVlc3Rpb24sIHNvdXJjZXN9KSk7XG5jb25zdCBjb3NpbmUgPSAoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKTogbnVtYmVyID0+IHtcbiAgaWYoIXZlY3RvclZhbGlkKGIpKSByZXR1cm4gLTE7XG4gIHJldHVybiBhLnJlZHVjZSgoc3VtLCBuLCBpKSA9PiBzdW0gKyBuICogYltpXSwgMCkgLyBNYXRoLnNxcnQoYS5yZWR1Y2UoKHN1bSwgbikgPT4gc3VtICsgbiAqIG4sIDApICogYi5yZWR1Y2UoKHN1bSwgbikgPT4gc3VtICsgbiAqIG4sIDApKTtcbn07XG5leHBvcnQgY29uc3QgZmFxQWN0aW9uID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIG9wZXJhdGlvbjogc3RyaW5nLCB2YWx1ZTogdW5rbm93biA9IHt9KSA9PiB7XG4gIGNvbnN0IGRiID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICBjb25zdCBjb2xsZWN0aW9uID0gZGIuY29sbGVjdGlvbignYWxmcmVkRmFxJyk7XG4gIGlmKCFhd2FpdCBjb2xsZWN0aW9uLmV4aXN0cygpKSB7dHJ5IHthd2FpdCBjb2xsZWN0aW9uLmNyZWF0ZSgpO30gY2F0Y2goZXJyb3IpIHtpZighYXdhaXQgY29sbGVjdGlvbi5leGlzdHMoKSkgdGhyb3cgZXJyb3I7fX1cbiAgYXdhaXQgY29sbGVjdGlvbi5lbnN1cmVJbmRleCh7ZmllbGRzOiBbJ2FwcElkJywgJ2tpbmQnLCAncHJvZHVjdCddLCB0eXBlOiAncGVyc2lzdGVudCd9KTtcbiAgY29uc3QgaW5wdXQgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYob3BlcmF0aW9uID09PSAnbGlzdCcgfHwgb3BlcmF0aW9uID09PSAncmVmcmVzaC1saXN0Jykge1xuICAgIGNvbnN0IHRvcGljcyA9IGF3YWl0IGRiLnF1ZXJ5KGFxbGBGT1IgdCBJTiBhbGZyZWRGYXEgRklMVEVSIHQuYXBwSWQgPT0gJ25pdHJvZ2VueCcgQU5EIHQua2luZCA9PSAndG9waWMnIEFORCB0LndlaWdodCA+PSAzIFNPUlQgdC53ZWlnaHQgREVTQywgdC5sYXN0QXNrZWQgREVTQywgdC5fa2V5IEFTQyBSRVRVUk4gdGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKSBhcyBUb3BpY1tdO1xuICAgIHJldHVybiBvcGVyYXRpb24gPT09ICdsaXN0JyA/IHtpdGVtczogcHVibGljRmFxKHRvcGljcy5maWx0ZXIoKHRvcGljKSA9PiAodG9waWMgYXMgVG9waWMgJiB7c291cmNlUmV2aXNpb24/OiBzdHJpbmd9KS5zb3VyY2VSZXZpc2lvbiA9PT0gaW5wdXQuc291cmNlUmV2aXNpb24pLCBEYXRlLm5vdygpKX0gOiB7aXRlbXM6IHRvcGljc307XG4gIH1cbiAgaWYob3BlcmF0aW9uID09PSAncmVmcmVzaCcpIHtcbiAgICBpZih0eXBlb2YgaW5wdXQudG9waWNJZCAhPT0gJ3N0cmluZycgfHwgIS9edG9waWMtW2EtZjAtOV17NjR9JC8udGVzdChpbnB1dC50b3BpY0lkKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkX2ZhcV9pbnB1dCcpO1xuICAgIGNvbnN0IHZhbGlkID0gc2FmZVRleHQoaW5wdXQuYW5zd2VyLCAyNTAwKSAmJiBBcnJheS5pc0FycmF5KGlucHV0LnNvdXJjZXMpICYmIGlucHV0LnNvdXJjZXMubGVuZ3RoID4gMCAmJiBpbnB1dC5zb3VyY2VzLmxlbmd0aCA8PSAzICYmIGlucHV0LnNvdXJjZXMuZXZlcnkoc291cmNlVmFsaWQpICYmIHR5cGVvZiBpbnB1dC5hbnN3ZXJFeHBpcmVzID09PSAnbnVtYmVyJyAmJiBpbnB1dC5hbnN3ZXJFeHBpcmVzID4gRGF0ZS5ub3coKSAmJiBpbnB1dC5hbnN3ZXJFeHBpcmVzIDw9IERhdGUubm93KCkgKyAxNCAqIDg2NDAwMDAwO1xuICAgIGF3YWl0IGRiLnF1ZXJ5KGFxbGBGT1IgdCBJTiBhbGZyZWRGYXEgRklMVEVSIHQuX2tleSA9PSAke2lucHV0LnRvcGljSWR9IEFORCB0LmFwcElkID09ICduaXRyb2dlbngnIEFORCB0LmtpbmQgPT0gJ3RvcGljJyBVUERBVEUgdCBXSVRIICR7dmFsaWQgPyB7YW5zd2VyOiBpbnB1dC5hbnN3ZXIsIGFuc3dlckV4cGlyZXM6IGlucHV0LmFuc3dlckV4cGlyZXMsIHJlZnJlc2hBZnRlcjogRGF0ZS5ub3coKSArIDEyICogMzYwMDAwMCwgc291cmNlUmV2aXNpb246IGlucHV0LnNvdXJjZVJldmlzaW9uLCBzb3VyY2VzOiBpbnB1dC5zb3VyY2VzfSA6IHthbnN3ZXI6IG51bGwsIGFuc3dlckV4cGlyZXM6IDAsIHJlZnJlc2hBZnRlcjogRGF0ZS5ub3coKSArIDEyICogMzYwMDAwMCwgc291cmNlUmV2aXNpb246IGlucHV0LnNvdXJjZVJldmlzaW9uLCBzb3VyY2VzOiBbXX19IElOIGFsZnJlZEZhcWApO1xuICAgIHJldHVybiB7b2s6IHRydWV9O1xuICB9XG4gIGlmKG9wZXJhdGlvbiAhPT0gJ3JlY29yZCcgJiYgb3BlcmF0aW9uICE9PSAnY2FuZGlkYXRlcycpIHRocm93IG5ldyBFcnJvcignaW52YWxpZF9mYXFfaW5wdXQnKTtcbiAgY29uc3QgZXZlbnQgPSB2YWxpZGF0ZUZhcUlucHV0KHZhbHVlKTtcbiAgY29uc3QgbWV0YUtleSA9IGBjYXRhbG9nLSR7ZXZlbnQucHJvZHVjdH1gO1xuICBjb25zdCB0eCA9IGF3YWl0IGRiLmJlZ2luVHJhbnNhY3Rpb24oe2V4Y2x1c2l2ZTogWydhbGZyZWRGYXEnXX0sIHtsb2NrVGltZW91dDogMTB9KTtcbiAgY29uc3QgbmV4dCA9IGFzeW5jIChxdWVyeTogUmV0dXJuVHlwZTx0eXBlb2YgYXFsPikgPT4gdHguc3RlcCgoKSA9PiBkYi5xdWVyeShxdWVyeSkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSBhcyBQcm9taXNlPHthcHBJZD86IHN0cmluZzsga2luZD86IHN0cmluZzsgcHJvZHVjdD86IHN0cmluZzsgcmV2aXNpb24/OiBudW1iZXI7IHRvcGljSWQ/OiBzdHJpbmd9IHwgbnVsbD4pO1xuICB0cnkge1xuICAgIGlmKG9wZXJhdGlvbiA9PT0gJ2NhbmRpZGF0ZXMnKSB7XG4gICAgICBjb25zdCBtZXRhID0gYXdhaXQgbmV4dChhcWxgUkVUVVJOIERPQ1VNRU5UKCdhbGZyZWRGYXEnLCAke21ldGFLZXl9KWApO1xuICAgICAgY29uc3QgdG9waWNzID0gYXdhaXQgdHguc3RlcCgoKSA9PiBkYi5xdWVyeShhcWxgRk9SIHQgSU4gYWxmcmVkRmFxIEZJTFRFUiB0LmFwcElkID09ICduaXRyb2dlbngnIEFORCB0LmtpbmQgPT0gJ3RvcGljJyBBTkQgdC5wcm9kdWN0ID09ICR7ZXZlbnQucHJvZHVjdH0gUkVUVVJOIHRgKSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpIGFzIFRvcGljW107XG4gICAgICBhd2FpdCB0eC5jb21taXQoKTtcbiAgICAgIHJldHVybiB7Y2FuZGlkYXRlczogdG9waWNzLm1hcCgodG9waWMpID0+ICh7aWQ6IHRvcGljLl9rZXksIHF1ZXN0aW9uOiB0b3BpYy5xdWVzdGlvbiwgc2NvcmU6IGNvc2luZShldmVudC5lbWJlZGRpbmcsIHRvcGljLmVtYmVkZGluZyB8fCBbXSl9KSkuZmlsdGVyKCh0b3BpYykgPT4gdG9waWMuc2NvcmUgPj0gMC41NSkuc29ydCgoYSwgYikgPT4gYi5zY29yZSAtIGEuc2NvcmUpLnNsaWNlKDAsIDgpLCByZXZpc2lvbjogbWV0YT8ucmV2aXNpb24gfHwgMH07XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IGBxdWVzdGlvbi0ke2V2ZW50LmV2ZW50SWR9YDtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IG5leHQoYXFsYFJFVFVSTiBET0NVTUVOVCgnYWxmcmVkRmFxJywgJHtrZXl9KWApO1xuICAgIGlmKGV4aXN0aW5nKSB7YXdhaXQgdHguY29tbWl0KCk7IHJldHVybiB7ZHVwbGljYXRlOiB0cnVlLCB0b3BpY0lkOiBleGlzdGluZy50b3BpY0lkfTt9XG4gICAgY29uc3QgbWV0YSA9IGF3YWl0IG5leHQoYXFsYFJFVFVSTiBET0NVTUVOVCgnYWxmcmVkRmFxJywgJHttZXRhS2V5fSlgKTtcbiAgICBpZigobWV0YT8ucmV2aXNpb24gfHwgMCkgIT09IGV2ZW50LnJldmlzaW9uKSB0aHJvdyBuZXcgRXJyb3IoJ2ZhcV9yZXZpc2lvbl9jb25mbGljdCcpO1xuICAgIGNvbnN0IHRvcGljSWQgPSBldmVudC50b3BpY0lkIHx8IGB0b3BpYy0ke2hhc2goYCR7ZXZlbnQucHJvZHVjdH06JHtldmVudC5xdWVzdGlvbi50b0xvd2VyQ2FzZSgpfWApfWA7XG4gICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICBpZihldmVudC50b3BpY0lkKSB7XG4gICAgICBjb25zdCB0b3BpYyA9IGF3YWl0IG5leHQoYXFsYFJFVFVSTiBET0NVTUVOVCgnYWxmcmVkRmFxJywgJHt0b3BpY0lkfSlgKTtcbiAgICAgIGlmKCF0b3BpYyB8fCB0b3BpYy5hcHBJZCAhPT0gJ25pdHJvZ2VueCcgfHwgdG9waWMucHJvZHVjdCAhPT0gZXZlbnQucHJvZHVjdCB8fCB0b3BpYy5raW5kICE9PSAndG9waWMnKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWRfZmFxX2lucHV0Jyk7XG4gICAgfVxuICAgIGF3YWl0IG5leHQoYXFsYFVQU0VSVCB7X2tleTogJHt0b3BpY0lkfX0gSU5TRVJUICR7e19rZXk6IHRvcGljSWQsIGFuc3dlckV4cGlyZXM6IDAsIGFwcElkOiAnbml0cm9nZW54JywgZW1iZWRkaW5nOiBldmVudC5lbWJlZGRpbmcsIGVtYmVkZGluZ01vZGVsOiAnYW1hem9uLnRpdGFuLWVtYmVkLXRleHQtdjI6MC8yNTYnLCBmaXJzdEFza2VkOiB0aW1lc3RhbXAsIGtpbmQ6ICd0b3BpYycsIGxhc3RBc2tlZDogdGltZXN0YW1wLCBwaG9uZUNvdW50OiBldmVudC5jaGFubmVsID09PSAncGhvbmUnID8gMSA6IDAsIHByb2R1Y3Q6IGV2ZW50LnByb2R1Y3QsIHF1ZXN0aW9uOiBldmVudC5xdWVzdGlvbiwgd2Vic2l0ZUNvdW50OiBldmVudC5jaGFubmVsID09PSAnd2Vic2l0ZScgPyAxIDogMCwgd2VpZ2h0OiAxfX0gVVBEQVRFIHtsYXN0QXNrZWQ6ICR7dGltZXN0YW1wfSwgd2VpZ2h0OiBPTEQud2VpZ2h0ICsgMSwgcGhvbmVDb3VudDogT0xELnBob25lQ291bnQgKyAke2V2ZW50LmNoYW5uZWwgPT09ICdwaG9uZScgPyAxIDogMH0sIHdlYnNpdGVDb3VudDogT0xELndlYnNpdGVDb3VudCArICR7ZXZlbnQuY2hhbm5lbCA9PT0gJ3dlYnNpdGUnID8gMSA6IDB9fSBJTiBhbGZyZWRGYXFgKTtcbiAgICBhd2FpdCBuZXh0KGFxbGBJTlNFUlQgJHt7X2tleToga2V5LCBhcHBJZDogJ25pdHJvZ2VueCcsIGNoYW5uZWw6IGV2ZW50LmNoYW5uZWwsIGNsYXNzaWZpZXJWZXJzaW9uOiAxLCBjcmVhdGVkOiB0aW1lc3RhbXAsIGtpbmQ6ICdxdWVzdGlvbicsIHByb2R1Y3Q6IGV2ZW50LnByb2R1Y3QsIHF1ZXN0aW9uOiBldmVudC5xdWVzdGlvbiwgdG9waWNJZH19IElOIGFsZnJlZEZhcWApO1xuICAgIGF3YWl0IG5leHQoYXFsYFVQU0VSVCB7X2tleTogJHttZXRhS2V5fX0gSU5TRVJUICR7e19rZXk6IG1ldGFLZXksIGFwcElkOiAnbml0cm9nZW54Jywga2luZDogJ2NhdGFsb2cnLCByZXZpc2lvbjogZXZlbnQucmV2aXNpb24gKyAxfX0gVVBEQVRFIHtyZXZpc2lvbjogJHtldmVudC5yZXZpc2lvbiArIDF9fSBJTiBhbGZyZWRGYXFgKTtcbiAgICBhd2FpdCB0eC5jb21taXQoKTtcbiAgICByZXR1cm4ge2R1cGxpY2F0ZTogZmFsc2UsIHRvcGljSWR9O1xuICB9IGNhdGNoKGVycm9yKSB7YXdhaXQgdHguYWJvcnQoKTsgdGhyb3cgZXJyb3I7fVxufTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwiYXFsIiwidXNlRGIiLCJoYXNoIiwidmFsdWUiLCJ1cGRhdGUiLCJkaWdlc3QiLCJwcm9kdWN0cyIsIlNldCIsInNhZmVUZXh0IiwibWF4IiwidHJpbSIsImxlbmd0aCIsInRlc3QiLCJ2ZWN0b3JWYWxpZCIsIkFycmF5IiwiaXNBcnJheSIsImV2ZXJ5IiwibiIsIk51bWJlciIsImlzRmluaXRlIiwic29tZSIsInNvdXJjZVZhbGlkIiwic291cmNlIiwidXJsIiwiVVJMIiwidGl0bGUiLCJwcm90b2NvbCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJzZWFyY2giLCJtYXAiLCJuYW1lIiwiaW5jbHVkZXMiLCJob3N0bmFtZSIsInZhbGlkYXRlRmFxSW5wdXQiLCJ2IiwicXVlc3Rpb24iLCJoYXMiLCJwcm9kdWN0IiwiY2hhbm5lbCIsImV2ZW50SWQiLCJlbWJlZGRpbmciLCJpc1NhZmVJbnRlZ2VyIiwicmV2aXNpb24iLCJ0b3BpY0lkIiwiRXJyb3IiLCJwdWJsaWNGYXEiLCJ0b3BpY3MiLCJub3ciLCJmaWx0ZXIiLCJ0b3BpYyIsImFwcElkIiwia2luZCIsIndlaWdodCIsImFuc3dlciIsImFuc3dlckV4cGlyZXMiLCJzb3VyY2VzIiwic29ydCIsImEiLCJiIiwibGFzdEFza2VkIiwiX2tleSIsImxvY2FsZUNvbXBhcmUiLCJzbGljZSIsImlkIiwiY29zaW5lIiwicmVkdWNlIiwic3VtIiwiaSIsIk1hdGgiLCJzcXJ0IiwiZmFxQWN0aW9uIiwiY29udGV4dCIsIm9wZXJhdGlvbiIsImRiIiwiZGF0YWJhc2VOYW1lIiwiY29sbGVjdGlvbiIsImV4aXN0cyIsImNyZWF0ZSIsImVycm9yIiwiZW5zdXJlSW5kZXgiLCJmaWVsZHMiLCJ0eXBlIiwiaW5wdXQiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJhbGwiLCJpdGVtcyIsInNvdXJjZVJldmlzaW9uIiwiRGF0ZSIsInZhbGlkIiwicmVmcmVzaEFmdGVyIiwib2siLCJldmVudCIsIm1ldGFLZXkiLCJ0eCIsImJlZ2luVHJhbnNhY3Rpb24iLCJleGNsdXNpdmUiLCJsb2NrVGltZW91dCIsIm5leHQiLCJzdGVwIiwibWV0YSIsImNvbW1pdCIsImNhbmRpZGF0ZXMiLCJzY29yZSIsImtleSIsImV4aXN0aW5nIiwiZHVwbGljYXRlIiwidG9Mb3dlckNhc2UiLCJ0aW1lc3RhbXAiLCJlbWJlZGRpbmdNb2RlbCIsImZpcnN0QXNrZWQiLCJwaG9uZUNvdW50Iiwid2Vic2l0ZUNvdW50IiwiY2xhc3NpZmllclZlcnNpb24iLCJjcmVhdGVkIiwiYWJvcnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLFVBQVUsUUFBTyxjQUFjO0FBQ3ZDLFNBQVFDLEdBQUcsUUFBTyxXQUFXO0FBQzdCLFNBQVFDLEtBQUssUUFBTyw0QkFBNEI7QUFNaEQsTUFBTUMsT0FBTyxDQUFDQyxRQUEwQkosV0FBVyxVQUFVSyxNQUFNLENBQUNELE9BQU9FLE1BQU0sQ0FBQztBQUNsRixNQUFNQyxXQUFXLElBQUlDLElBQUk7SUFBQztJQUFVO0lBQVk7SUFBaUI7SUFBb0I7SUFBVztJQUFZO0lBQWE7SUFBZ0I7SUFBWTtJQUFPO0lBQVk7SUFBVztJQUFZO0NBQWE7QUFDNU0sTUFBTUMsV0FBVyxDQUFDTCxPQUFnQk0sTUFBaUMsT0FBT04sVUFBVSxZQUFZQSxNQUFNTyxJQUFJLEdBQUdDLE1BQU0sSUFBSSxLQUFLUixNQUFNUSxNQUFNLElBQUlGLE9BQU8sQ0FBQywwQ0FBMENHLElBQUksQ0FBQ1Q7QUFDbk0sTUFBTVUsY0FBYyxDQUFDVixR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
|
|
@@ -46,6 +46,7 @@ export interface ContentGenerationInput {
|
|
|
46
46
|
messages?: ContentGenerationMessage[];
|
|
47
47
|
modality?: 'image' | 'text';
|
|
48
48
|
model?: string;
|
|
49
|
+
outputTextMode?: 'preserve' | 'trim';
|
|
49
50
|
prompt?: string;
|
|
50
51
|
provider: 'claude' | 'gemini' | 'grok' | 'ollama' | 'openai';
|
|
51
52
|
reasoningEffort?: ContentGenerationReasoningEffort;
|
|
@@ -31,6 +31,16 @@ const validMessageContent = (message)=>{
|
|
|
31
31
|
].includes(input.provider)) {
|
|
32
32
|
throw new ContentGenerationRejectedError('A supported provider is required.');
|
|
33
33
|
}
|
|
34
|
+
if (input.outputTextMode !== undefined && (![
|
|
35
|
+
'claude',
|
|
36
|
+
'openai',
|
|
37
|
+
'grok'
|
|
38
|
+
].includes(input.provider) || ![
|
|
39
|
+
'preserve',
|
|
40
|
+
'trim'
|
|
41
|
+
].includes(input.outputTextMode))) {
|
|
42
|
+
throw new ContentGenerationRejectedError('outputTextMode requires Claude, OpenAI or Grok and preserve or trim.');
|
|
43
|
+
}
|
|
34
44
|
if (input.messages !== undefined) {
|
|
35
45
|
if (input.prompt !== undefined || !Array.isArray(input.messages) || !input.messages.length || input.messages.some((message)=>!message || ![
|
|
36
46
|
'assistant',
|
|
@@ -130,8 +140,17 @@ const validMessageContent = (message)=>{
|
|
|
130
140
|
].includes(response.error.type || '')) {
|
|
131
141
|
throw new ContentGenerationRejectedError('Claude rejected the request. Check the model and account access.');
|
|
132
142
|
}
|
|
133
|
-
const
|
|
134
|
-
if (
|
|
143
|
+
const preserve = input.outputTextMode === 'preserve';
|
|
144
|
+
if (preserve && (!Array.isArray(response.content) || response.content.some((part)=>!part || ![
|
|
145
|
+
'text',
|
|
146
|
+
'thinking',
|
|
147
|
+
'redacted_thinking'
|
|
148
|
+
].includes(part.type || '') || part.type === 'text' && typeof part.text !== 'string'))) {
|
|
149
|
+
throw new ContentGenerationResponseError('Claude response could not be confirmed.');
|
|
150
|
+
}
|
|
151
|
+
const chunks = response.content?.filter((part)=>part.type === 'text').map((part)=>part.text || '') || [];
|
|
152
|
+
const text = preserve ? chunks.join('') : chunks.join('\n').trim();
|
|
153
|
+
if (response.error || response.type !== 'message' || response.stop_reason !== 'end_turn' || !text.trim()) {
|
|
135
154
|
throw new ContentGenerationResponseError('Claude response could not be confirmed.');
|
|
136
155
|
}
|
|
137
156
|
return {
|
|
@@ -214,13 +233,13 @@ const validMessageContent = (message)=>{
|
|
|
214
233
|
].includes(item.type))) {
|
|
215
234
|
throw new ContentGenerationResponseError(`${grok ? 'Grok' : 'OpenAI'} returned an unsupported output item.`);
|
|
216
235
|
}
|
|
217
|
-
const text = response.output?.filter((item)=>item.type === 'message' || grok && !item.type).flatMap((item)=>item.content || []).filter((part)=>part.type === 'output_text').map((part)=>part.text || '').join('')
|
|
218
|
-
if (!text) {
|
|
236
|
+
const text = response.output?.filter((item)=>item.type === 'message' || grok && !item.type).flatMap((item)=>item.content || []).filter((part)=>part.type === 'output_text').map((part)=>part.text || '').join('') || '';
|
|
237
|
+
if (!text.trim()) {
|
|
219
238
|
throw new ContentGenerationResponseError(`${grok ? 'Grok' : 'OpenAI'} returned empty output.`);
|
|
220
239
|
}
|
|
221
240
|
return {
|
|
222
241
|
sources: [],
|
|
223
|
-
text
|
|
242
|
+
text: input.outputTextMode === 'preserve' ? text : text.trim()
|
|
224
243
|
};
|
|
225
244
|
}
|
|
226
245
|
if (!config.geminiKey) {
|
|
@@ -349,4 +368,4 @@ const validMessageContent = (message)=>{
|
|
|
349
368
|
};
|
|
350
369
|
};
|
|
351
370
|
|
|
352
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb250ZW50R2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2dlbmVyYXRlT2xsYW1hQ29udGVudH0gZnJvbSAnLi9vbGxhbWFHZW5lcmF0aW9uLmpzJztcbmltcG9ydCB7Q29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yLCBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3J9IGZyb20gJy4vY29udGVudEdlbmVyYXRpb25FcnJvcnMuanMnO1xuZXhwb3J0IHtDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IsIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcn0gZnJvbSAnLi9jb250ZW50R2VuZXJhdGlvbkVycm9ycy5qcyc7XG5pbXBvcnQge3Bvc3R9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25Db25maWcge1xuICBjbGF1ZGVLZXk/OiBzdHJpbmc7XG4gIGNsYXVkZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlJbWFnZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlLZXk/OiBzdHJpbmc7XG4gIGdlbWluaU1vZGVsPzogc3RyaW5nO1xuICBncm9rS2V5Pzogc3RyaW5nO1xuICBncm9rTW9kZWw/OiBzdHJpbmc7XG4gIG9sbGFtYT86IHtlbmRwb2ludDogc3RyaW5nOyBwcm90b2NvbDogJ2dlbmVyYXRlJyB8ICdjaGF0JyB8ICdvcGVuYWktY2hhdCd9O1xuICBvcGVuYWlLZXk/OiBzdHJpbmc7XG4gIG9wZW5haU1vZGVsPzogc3RyaW5nO1xufVxuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25QYXJ0ID0ge3RleHQ6IHN0cmluZzsgdHlwZTogJ3RleHQnfSB8IHtcbiAgZGV0YWlsPzogJ2F1dG8nIHwgJ2hpZ2gnIHwgJ2xvdyc7XG4gIHR5cGU6ICdpbWFnZSc7XG4gIHVybDogc3RyaW5nO1xufTtcbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25NZXNzYWdlIHtcbiAgY29udGVudDogc3RyaW5nIHwgQ29udGVudEdlbmVyYXRpb25QYXJ0W107XG4gIHJvbGU6ICdhc3Npc3RhbnQnIHwgJ2RldmVsb3BlcicgfCAnc3lzdGVtJyB8ICd1c2VyJztcbn1cbmV4cG9ydCB0eXBlIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQgPSB7dHlwZTogJ2pzb25fb2JqZWN0JyB8ICd0ZXh0J30gfCB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmljdD86IGJvb2xlYW47XG4gIHR5cGU6ICdqc29uX3NjaGVtYSc7XG59O1xuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25SZWFzb25pbmdFZmZvcnQgPSAnbm9uZScgfCAnbWluaW1hbCcgfCAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ3hoaWdoJyB8ICdtYXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0aW9uSW5wdXQge1xuICBhc3BlY3RSYXRpbz86IHN0cmluZztcbiAgaW1hZ2VzPzoge2J5dGVzOiBCdWZmZXI7IG1pbWU6IHN0cmluZ31bXTtcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICBtZXNzYWdlcz86IENvbnRlbnRHZW5lcmF0aW9uTWVzc2FnZVtdO1xuICBtb2RhbGl0eT86ICdpbWFnZScgfCAndGV4dCc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBwcm9tcHQ/OiBzdHJpbmc7XG4gIHByb3ZpZGVyOiAnY2xhdWRlJyB8ICdnZW1pbmknIHwgJ2dyb2snIHwgJ29sbGFtYScgfCAnb3BlbmFpJztcbiAgcmVhc29uaW5nRWZmb3J0PzogQ29udGVudEdlbmVyYXRpb25SZWFzb25pbmdFZmZvcnQ7XG4gIHJlc3BvbnNlRm9ybWF0PzogQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUZvcm1hdDtcbiAgc2VhcmNoPzogYm9vbGVhbjtcbiAgc3lzdGVtPzogc3RyaW5nO1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICB0b3BQPzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZWRDb250ZW50IHtcbiAgaW1hZ2U/OiB7Ynl0ZXM6IEJ1ZmZlcjsgbWltZTogJ2ltYWdlL2pwZWcnIHwgJ2ltYWdlL3BuZyd9O1xuICBzZWFyY2hTdWdnZXN0aW9uc0h0bWw/OiBzdHJpbmc7XG4gIHNvdXJjZXM6IHt0aXRsZTogc3RyaW5nOyB1cmw6IHN0cmluZ31bXTtcbiAgdGV4dDogc3RyaW5nO1xufVxuaW50ZXJmYWNlIEdlbWluaVBhcnQge2lubGluZURhdGE/OiB7ZGF0YTogc3RyaW5nOyBtaW1lVHlwZTogc3RyaW5nfTsgdGV4dD86IHN0cmluZzsgdGhvdWdodD86IGJvb2xlYW59XG5pbnRlcmZhY2UgR2VtaW5pUmVzcG9uc2Uge1xuICBjYW5kaWRhdGVzPzoge1xuICAgIGNvbnRlbnQ/OiB7cGFydHM/OiBHZW1pbmlQYXJ0W119O1xuICAgIGZpbmlzaFJlYXNvbj86IHN0cmluZztcbiAgICBncm91bmRpbmdNZXRhZGF0YT86IHtcbiAgICAgIGdyb3VuZGluZ0NodW5rcz86IHt3ZWI/OiB7dGl0bGU/OiBzdHJpbmc7IHVyaT86IHN0cmluZ319W107XG4gICAgICBzZWFyY2hFbnRyeVBvaW50Pzoge3JlbmRlcmVkQ29udGVudD86IHN0cmluZ307XG4gICAgfTtcbiAgfVtdO1xuICBlcnJvcj86IHtjb2RlPzogbnVtYmVyfTtcbiAgcHJvbXB0RmVlZGJhY2s/OiB7YmxvY2tSZWFzb24/OiBzdHJpbmd9O1xufVxuXG5jb25zdCB2YWxpZE1lc3NhZ2VDb250ZW50ID0gKG1lc3NhZ2U6IENvbnRlbnRHZW5lcmF0aW9uTWVzc2FnZSk6IGJvb2xlYW4gPT4ge1xuICBpZih0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAhIW1lc3NhZ2UuY29udGVudC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSAmJiBtZXNzYWdlLmNvbnRlbnQubGVuZ3RoID4gMCAmJiBtZXNzYWdlLmNvbnRlbnQuZXZlcnkoKHBhcnQpID0+IHtcbiAgICBpZighcGFydCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZihwYXJ0LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0LnRleHQgPT09ICdzdHJpbmcnICYmICEhcGFydC50ZXh0LnRyaW0oKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnQudHlwZSA9PT0gJ2ltYWdlJyAmJiBtZXNzYWdlLnJvbGUgPT09ICd1c2VyJyAmJiB0eXBlb2YgcGFydC51cmwgPT09ICdzdHJpbmcnXG4gICAgICAmJiAvXihodHRwcz86XFwvXFwvW15cXHNdK3xkYXRhOmltYWdlXFwvKHBuZ3xqcGVnfHdlYnB8Z2lmKTtiYXNlNjQsW0EtWmEtejAtOSsvXSs9ezAsMn0pJC8udGVzdChwYXJ0LnVybClcbiAgICAgICYmIChwYXJ0LmRldGFpbCA9PT0gdW5kZWZpbmVkIHx8IFsnYXV0bycsICdoaWdoJywgJ2xvdyddLmluY2x1ZGVzKHBhcnQuZGV0YWlsKSk7XG4gIH0pO1xufTtcblxuLyoqIFNpbmdsZSBzdWJtaXNzaW9uIHRocm91Z2ggUmlwLUh1bnRlcjsgY2FsbGVycyBvd24gZHVyYWJsZSBqb2JzIGFuZCByZWNvbmNpbGlhdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUNvbnRlbnQgPSBhc3luYyAoXG4gIGlucHV0OiBDb250ZW50R2VuZXJhdGlvbklucHV0LFxuICBjb25maWc6IENvbnRlbnRHZW5lcmF0aW9uQ29uZmlnID0gQ29uZmlnLmdldDxDb250ZW50R2VuZXJhdGlvbkNvbmZpZz4oJ2NvbnRlbnRHZW5lcmF0aW9uJykgfHwge31cbik6IFByb21pc2U8R2VuZXJhdGVkQ29udGVudD4gPT4ge1xuICBpZighWydjbGF1ZGUnLCAnZ2VtaW5pJywgJ2dyb2snLCAnb2xsYW1hJywgJ29wZW5haSddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0Egc3VwcG9ydGVkIHByb3ZpZGVyIGlzIHJlcXVpcmVkLicpO1xuICB9XG4gIGlmKGlucHV0Lm1lc3NhZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZihpbnB1dC5wcm9tcHQgIT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheShpbnB1dC5tZXNzYWdlcykgfHwgIWlucHV0Lm1lc3NhZ2VzLmxlbmd0aFxuICAgICAgfHwgaW5wdXQubWVzc2FnZXMuc29tZSgobWVzc2FnZSkgPT5cbiAgICAgICAgIW1lc3NhZ2UgfHwgIVsnYXNzaXN0YW50JywgJ2RldmVsb3BlcicsICdzeXN0ZW0nLCAndXNlciddLmluY2x1ZGVzKG1lc3NhZ2Uucm9sZSkgfHwgIXZhbGlkTWVzc2FnZUNvbnRlbnQobWVzc2FnZSkpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdTdXBwbHkgZWl0aGVyIGEgbm9uLWVtcHR5IHByb21wdCBvciBub24tZW1wdHkgdGV4dCBtZXNzYWdlcyB3aXRoIHN1cHBvcnRlZCByb2xlcy4nKTtcbiAgICB9XG4gIH0gZWxzZSBpZih0eXBlb2YgaW5wdXQucHJvbXB0ICE9PSAnc3RyaW5nJyB8fCAhaW5wdXQucHJvbXB0LnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0Egbm9uLWVtcHR5IHByb21wdCBpcyByZXF1aXJlZC4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciAhPT0gJ29wZW5haSdcbiAgICAmJiAoaW5wdXQubWVzc2FnZXMgIT09IHVuZGVmaW5lZCB8fCBpbnB1dC5yZWFzb25pbmdFZmZvcnQgIT09IHVuZGVmaW5lZFxuICAgICAgfHwgKFsnY2xhdWRlJywgJ2dyb2snXS5pbmNsdWRlcyhpbnB1dC5wcm92aWRlcikgJiYgaW5wdXQucmVzcG9uc2VGb3JtYXQgIT09IHVuZGVmaW5lZCkpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcihcbiAgICAgICdNZXNzYWdlcyBhbmQgcmVhc29uaW5nIGVmZm9ydCByZXF1aXJlIE9wZW5BSTsgQ2xhdWRlIGFuZCBHcm9rIGRvIG5vdCBzdXBwb3J0IHJlc3BvbnNlIGZvcm1hdCBvcHRpb25zLidcbiAgICApO1xuICB9XG4gIGlmKGlucHV0LnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlucHV0LnRpbWVvdXRNcykgfHwgaW5wdXQudGltZW91dE1zIDwgMSB8fCBpbnB1dC50aW1lb3V0TXMgPiAyXzE0N180ODNfNjQ3KSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ3RpbWVvdXRNcyBtdXN0IGJlIGEgcG9zaXRpdmUgMzItYml0IGludGVnZXIuJyk7XG4gIH1cbiAgaWYoaW5wdXQucmVhc29uaW5nRWZmb3J0ICE9PSB1bmRlZmluZWQgJiYgIVsnbm9uZScsICdtaW5pbWFsJywgJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcsICd4aGlnaCcsICdtYXgnXS5pbmNsdWRlcyhpbnB1dC5yZWFzb25pbmdFZmZvcnQpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVW5zdXBwb3J0ZWQgcmVhc29uaW5nIGVmZm9ydC4nKTtcbiAgfVxuICBjb25zdCBmb3JtYXQgPSBpbnB1dC5yZXNwb25zZUZvcm1hdDtcbiAgaWYoZm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgKCFmb3JtYXQgfHwgIVsndGV4dCcsICdqc29uX29iamVjdCcsICdqc29uX3NjaGVtYSddLmluY2x1ZGVzKGZvcm1hdC50eXBlKSB8fCAoZm9ybWF0LnR5cGUgPT09ICdqc29uX3NjaGVtYScgJiYgKFxuICAgIHR5cGVvZiBmb3JtYXQubmFtZSAhPT0gJ3N0cmluZycgfHwgIS9eW2EtekEtWjAtOV8tXXsxLDY0fSQvLnRlc3QoZm9ybWF0Lm5hbWUpIHx8ICFmb3JtYXQuc2NoZW1hIHx8IHR5cGVvZiBmb3JtYXQuc2NoZW1hICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGZvcm1hdC5zY2hlbWEpXG4gICAgfHwgKGZvcm1hdC5zdHJpY3QgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZm9ybWF0LnN0cmljdCAhPT0gJ2Jvb2xlYW4nKVxuICApKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIGZvcm1hdC4gSlNPTiBzY2hlbWFzIHJlcXVpcmUgYSBuYW1lIGFuZCBzY2hlbWEgb2JqZWN0LicpO1xuICB9XG4gIGlmKFsnZ2VtaW5pJywgJ29sbGFtYSddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSAmJiBmb3JtYXQgIT09IHVuZGVmaW5lZCAmJiAoZm9ybWF0LnR5cGUgPT09ICdqc29uX3NjaGVtYScgfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVGhpcyBwcm92aWRlciBzdXBwb3J0cyB0ZXh0IG9yIGpzb25fb2JqZWN0IGZvciB0ZXh0IGdlbmVyYXRpb24gb25seS4nKTtcbiAgfVxuICBpZihpbnB1dC50b3BQICE9PSB1bmRlZmluZWQgJiYgKCFbJ2dlbWluaScsICdvbGxhbWEnXS5pbmNsdWRlcyhpbnB1dC5wcm92aWRlcikgfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgfHwgIU51bWJlci5pc0Zpbml0ZShpbnB1dC50b3BQKSB8fCBpbnB1dC50b3BQIDwgMCB8fCBpbnB1dC50b3BQID4gMSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCd0b3BQIHJlcXVpcmVzIGEgR2VtaW5pIG9yIE9sbGFtYSB0ZXh0IHJlcXVlc3QgYW5kIGEgZmluaXRlIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4nKTtcbiAgfVxuICBpZihpbnB1dC50ZW1wZXJhdHVyZSAhPT0gdW5kZWZpbmVkICYmICghWydnZW1pbmknLCAnb2xsYW1hJ10uaW5jbHVkZXMoaW5wdXQucHJvdmlkZXIpIHx8IGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnIHx8ICFOdW1iZXIuaXNGaW5pdGUoaW5wdXQudGVtcGVyYXR1cmUpIHx8IGlucHV0LnRlbXBlcmF0dXJlIDwgMCB8fCAoaW5wdXQucHJvdmlkZXIgPT09ICdnZW1pbmknICYmIGlucHV0LnRlbXBlcmF0dXJlID4gMikpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcigndGVtcGVyYXR1cmUgcmVxdWlyZXMgYSBub25uZWdhdGl2ZSBmaW5pdGUgdmFsdWUgZm9yIE9sbGFtYSB0ZXh0IG9yIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyIGZvciBHZW1pbmkgdGV4dC4nKTtcbiAgfVxuICBpZihpbnB1dC5tYXhUb2tlbnMgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0ludGVnZXIoaW5wdXQubWF4VG9rZW5zKSB8fCBpbnB1dC5tYXhUb2tlbnMgPCAxKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ21heFRva2VucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciAhPT0gJ2dlbWluaSdcbiAgICAmJiAoKGlucHV0LmltYWdlcz8ubGVuZ3RoICYmICFbJ2dyb2snLCAnb2xsYW1hJ10uaW5jbHVkZXMoaW5wdXQucHJvdmlkZXIpKSB8fCBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyB8fCBpbnB1dC5zZWFyY2gpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVGhpcyBwcm92aWRlciBvcGVyYXRpb24gc3VwcG9ydHMgdGV4dCBpbnB1dCBhbmQgb3V0cHV0IG9ubHkuJyk7XG4gIH1cbiAgaWYoaW5wdXQucHJvdmlkZXIgPT09ICdvbGxhbWEnKSByZXR1cm4gZ2VuZXJhdGVPbGxhbWFDb250ZW50KGlucHV0LCBjb25maWcpO1xuICBjb25zdCB7cHJvbXB0LCBpbWFnZXMgPSBbXX0gPSBpbnB1dDtcbiAgaWYoaW5wdXQucHJvdmlkZXIgPT09ICdjbGF1ZGUnKSB7XG4gICAgaWYoIWNvbmZpZy5jbGF1ZGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0NsYXVkZSBpcyBub3QgY29uZmlndXJlZCBvbiB0aGlzIHNlcnZlci4nKTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0KCdodHRwczovL2FwaS5hbnRocm9waWMuY29tL3YxL21lc3NhZ2VzJywge1xuICAgICAgbWF4X3Rva2VuczogaW5wdXQubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICBtZXNzYWdlczogW3tjb250ZW50OiBwcm9tcHQsIHJvbGU6ICd1c2VyJ31dLFxuICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsIHx8IGNvbmZpZy5jbGF1ZGVNb2RlbCB8fCAnY2xhdWRlLXNvbm5ldC01JyxcbiAgICAgIHN5c3RlbTogaW5wdXQuc3lzdGVtXG4gICAgfSwge2NhY2hlOiBmYWxzZSwgaGVhZGVyczogbmV3IEhlYWRlcnMoeydhbnRocm9waWMtdmVyc2lvbic6ICcyMDIzLTA2LTAxJywgJ3gtYXBpLWtleSc6IGNvbmZpZy5jbGF1ZGVLZXl9KSwgdGltZW91dDogaW5wdXQudGltZW91dE1zID8/IDEyMF8wMDB9KSBhcyB7XG4gICAgICBjb250ZW50Pzoge3RleHQ/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9W107XG4gICAgICBlcnJvcj86IHt0eXBlPzogc3RyaW5nfTtcbiAgICAgIHN0b3BfcmVhc29uPzogc3RyaW5nO1xuICAgICAgdHlwZT86IHN0cmluZztcbiAgICB9O1xuICAgIGlmKHJlc3BvbnNlLmVycm9yICYmIFsnYXV0aGVudGljYXRpb25fZXJyb3InLCAnaW52YWxpZF9yZXF1ZXN0X2Vycm9yJywgJ25vdF9mb3VuZF9lcnJvcicsICdwZXJtaXNzaW9uX2Vycm9yJ10uaW5jbHVkZXMocmVzcG9uc2UuZXJyb3IudHlwZSB8fCAnJykpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0NsYXVkZSByZWplY3RlZCB0aGUgcmVxdWVzdC4gQ2hlY2sgdGhlIG1vZGVsIGFuZCBhY2NvdW50IGFjY2Vzcy4nKTtcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IHJlc3BvbnNlLmNvbnRlbnQ/LmZpbHRlcigocGFydCkgPT4gcGFydC50eXBlID09PSAndGV4dCcpLm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKS5qb2luKCdcXG4nKS50cmltKCk7XG4gICAgaWYocmVzcG9uc2UuZXJyb3IgfHwgcmVzcG9uc2UudHlwZSAhPT0gJ21lc3NhZ2UnIHx8IHJlc3BvbnNlLnN0b3BfcmVhc29uICE9PSAnZW5kX3R1cm4nIHx8ICF0ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdDbGF1ZGUgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtzb3VyY2VzOiBbXSwgdGV4dH07XG4gIH1cbiAgaWYoaW5wdXQucHJvdmlkZXIgPT09ICdvcGVuYWknIHx8IGlucHV0LnByb3ZpZGVyID09PSAnZ3JvaycpIHtcbiAgICBjb25zdCBncm9rID0gaW5wdXQucHJvdmlkZXIgPT09ICdncm9rJztcbiAgICBjb25zdCBrZXkgPSBncm9rID8gY29uZmlnLmdyb2tLZXkgOiBjb25maWcub3BlbmFpS2V5O1xuICAgIGlmKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoYCR7Z3JvayA/ICdHcm9rJyA6ICdPcGVuQUknfSBpcyBub3QgY29uZmlndXJlZCBvbiB0aGlzIHNlcnZlci5gKTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0KGdyb2sgPyAnaHR0cHM6Ly9hcGkueC5haS92MS9yZXNwb25zZXMnIDogJ2h0dHBzOi8vYXBpLm9wZW5haS5jb20vdjEvcmVzcG9uc2VzJywge1xuICAgICAgaW5wdXQ6IGdyb2sgJiYgaW1hZ2VzLmxlbmd0aCA/IFt7Y29udGVudDogW3t0ZXh0OiBwcm9tcHQsIHR5cGU6ICdpbnB1dF90ZXh0J30sIC4uLmltYWdlcy5tYXAoKGltYWdlKSA9PiAoe2ltYWdlX3VybDogYGRhdGE6JHtpbWFnZS5taW1lfTtiYXNlNjQsJHtpbWFnZS5ieXRlcy50b1N0cmluZygnYmFzZTY0Jyl9YCwgdHlwZTogJ2lucHV0X2ltYWdlJ30pKV0sIHJvbGU6ICd1c2VyJ31dIDogaW5wdXQubWVzc2FnZXM/Lm1hcCgobWVzc2FnZSkgPT4gKHtjb250ZW50OiB0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSAnc3RyaW5nJyA/IG1lc3NhZ2UuY29udGVudCA6IG1lc3NhZ2UuY29udGVudC5tYXAoKHBhcnQpID0+IChwYXJ0LnR5cGUgPT09ICd0ZXh0J1xuICAgICAgICA/IHt0ZXh0OiBwYXJ0LnRleHQsIHR5cGU6ICdpbnB1dF90ZXh0J30gOiB7ZGV0YWlsOiBwYXJ0LmRldGFpbCA/PyAnYXV0bycsIGltYWdlX3VybDogcGFydC51cmwsIHR5cGU6ICdpbnB1dF9pbWFnZSd9KSksIHJvbGU6IG1lc3NhZ2Uucm9sZSA9PT0gJ3N5c3RlbScgPyAnZGV2ZWxvcGVyJyA6IG1lc3NhZ2Uucm9sZX0pKSA/PyBwcm9tcHQsXG4gICAgICBpbnN0cnVjdGlvbnM6IGlucHV0LnN5c3RlbSxcbiAgICAgIG1heF9vdXRwdXRfdG9rZW5zOiBpbnB1dC5tYXhUb2tlbnMgPz8gNDA5NixcbiAgICAgIG1vZGVsOiBpbnB1dC5tb2RlbCB8fCAoZ3JvayA/IGNvbmZpZy5ncm9rTW9kZWwgfHwgJ2dyb2stNC43JyA6IGNvbmZpZy5vcGVuYWlNb2RlbCB8fCAnZ3B0LTYtYXN0cmEnKSxcbiAgICAgIC4uLihpbnB1dC5yZWFzb25pbmdFZmZvcnQgPyB7cmVhc29uaW5nOiB7ZWZmb3J0OiBpbnB1dC5yZWFzb25pbmdFZmZvcnR9fSA6IHt9KSxcbiAgICAgIHN0b3JlOiBmYWxzZSxcbiAgICAgIC4uLihmb3JtYXQgPyB7dGV4dDoge2Zvcm1hdH19IDoge30pLFxuICAgICAgLi4uKCFncm9rID8ge3RydW5jYXRpb246ICdkaXNhYmxlZCd9IDoge30pXG4gICAgfSwge2NhY2hlOiBmYWxzZSwgaGVhZGVyczogbmV3IEhlYWRlcnMoe0F1dGhvcml6YXRpb246IGBCZWFyZXIgJHtrZXl9YH0pLCB0aW1lb3V0OiBpbnB1dC50aW1lb3V0TXMgPz8gMTIwXzAwMH0pIGFzIHtcbiAgICAgIGVycm9yPzoge2NvZGU/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9O1xuICAgICAgb3V0cHV0Pzoge2NvbnRlbnQ/OiB7dGV4dD86IHN0cmluZzsgdHlwZT86IHN0cmluZ31bXTsgc3RhdHVzPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfVtdO1xuICAgICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIH07XG4gICAgaWYocmVzcG9uc2UuZXJyb3IgJiYgWydpbnZhbGlkX3JlcXVlc3RfZXJyb3InLCAnYXV0aGVudGljYXRpb25fZXJyb3InLCAncGVybWlzc2lvbl9lcnJvciddLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLnR5cGUgfHwgJycpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKGAke2dyb2sgPyAnR3JvaycgOiAnT3BlbkFJJ30gcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSBtb2RlbCBhbmQgYWNjb3VudCBhY2Nlc3MuYCk7XG4gICAgfVxuICAgIGlmKHJlc3BvbnNlLmVycm9yIHx8IHJlc3BvbnNlLnN0YXR1cyAhPT0gJ2NvbXBsZXRlZCcgfHwgcmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2luY29tcGxldGUnKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcihgJHtncm9rID8gJ0dyb2snIDogJ09wZW5BSSd9IHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQ6IGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZS5gKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQ/LnNvbWUoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3JlZnVzYWwnKSkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoYCR7Z3JvayA/ICdHcm9rJyA6ICdPcGVuQUknfSBkZWNsaW5lZCB0aGUgcmVxdWVzdC5gKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnR5cGUgJiYgIVsnbWVzc2FnZScsICdyZWFzb25pbmcnXS5pbmNsdWRlcyhpdGVtLnR5cGUpKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcihgJHtncm9rID8gJ0dyb2snIDogJ09wZW5BSSd9IHJldHVybmVkIGFuIHVuc3VwcG9ydGVkIG91dHB1dCBpdGVtLmApO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcmVzcG9uc2Uub3V0cHV0Py5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ21lc3NhZ2UnIHx8IChncm9rICYmICFpdGVtLnR5cGUpKS5mbGF0TWFwKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQgfHwgW10pXG4gICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdvdXRwdXRfdGV4dCcpLm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKS5qb2luKCcnKS50cmltKCk7XG4gICAgaWYoIXRleHQpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoYCR7Z3JvayA/ICdHcm9rJyA6ICdPcGVuQUknfSByZXR1cm5lZCBlbXB0eSBvdXRwdXQuYCk7XG4gICAgfVxuICAgIHJldHVybiB7c291cmNlczogW10sIHRleHR9O1xuICB9XG4gIGlmKCFjb25maWcuZ2VtaW5pS2V5KSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignR2VtaW5pIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgc2VydmVyLicpO1xuICB9XG4gIGNvbnN0IHBhcnRzOiB1bmtub3duW10gPSBbe3RleHQ6IHByb21wdH0sIC4uLmltYWdlcy5tYXAoKGltYWdlKSA9PiAoe2lubGluZURhdGE6IHtkYXRhOiBpbWFnZS5ieXRlcy50b1N0cmluZygnYmFzZTY0JyksIG1pbWVUeXBlOiBpbWFnZS5taW1lfX0pKV07XG4gIGNvbnN0IG1vZGVsID0gaW5wdXQubW9kZWwgfHwgKGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnID8gY29uZmlnLmdlbWluaUltYWdlTW9kZWwgfHwgJ2dlbWluaS0zLjEtZmxhc2gtaW1hZ2UnIDogY29uZmlnLmdlbWluaU1vZGVsIHx8ICdnZW1pbmktMy44LWZsYXNoJyk7XG4gIGlmKCEvXlthLXpBLVowLTkuXy1dKyQvLnRlc3QobW9kZWwpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignSW52YWxpZCBHZW1pbmkgbW9kZWwgY29uZmlndXJhdGlvbi4nKTtcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3QoYGh0dHBzOi8vZ2VuZXJhdGl2ZWxhbmd1YWdlLmdvb2dsZWFwaXMuY29tL3YxYmV0YS9tb2RlbHMvJHttb2RlbH06Z2VuZXJhdGVDb250ZW50YCwge1xuICAgIGNvbnRlbnRzOiBbe3BhcnRzLCByb2xlOiAndXNlcid9XSxcbiAgICAuLi4oaW5wdXQuc3lzdGVtID8ge3N5c3RlbUluc3RydWN0aW9uOiB7cGFydHM6IFt7dGV4dDogaW5wdXQuc3lzdGVtfV19fSA6IHt9KSxcbiAgICBnZW5lcmF0aW9uQ29uZmlnOiBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyA/IHsuLi4oaW5wdXQuYXNwZWN0UmF0aW8gPyB7aW1hZ2VDb25maWc6IHthc3BlY3RSYXRpbzogaW5wdXQuYXNwZWN0UmF0aW99fSA6IHt9KSwgcmVzcG9uc2VNb2RhbGl0aWVzOiBbJ1RFWFQnLCAnSU1BR0UnXX0gOiB7XG4gICAgICBtYXhPdXRwdXRUb2tlbnM6IGlucHV0Lm1heFRva2VucyA/PyA0MDk2LFxuICAgICAgLi4uKGZvcm1hdCA/IHtyZXNwb25zZU1pbWVUeXBlOiBmb3JtYXQudHlwZSA9PT0gJ2pzb25fb2JqZWN0JyA/ICdhcHBsaWNhdGlvbi9qc29uJyA6ICd0ZXh0L3BsYWluJ30gOiB7fSksXG4gICAgICAuLi4oaW5wdXQudGVtcGVyYXR1cmUgIT09IHVuZGVmaW5lZCA/IHt0ZW1wZXJhdHVyZTogaW5wdXQudGVtcGVyYXR1cmV9IDoge30pLFxuICAgICAgLi4uKGlucHV0LnRvcFAgIT09IHVuZGVmaW5lZCA/IHt0b3BQOiBpbnB1dC50b3BQfSA6IHt9KVxuICAgIH0sXG4gICAgLi4uKGlucHV0LnNlYXJjaCA/IHt0b29sczogW3tnb29nbGVTZWFyY2g6IHt9fV19IDoge30pXG4gIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHsneC1nb29nLWFwaS1rZXknOiBjb25maWcuZ2VtaW5pS2V5fSksIHRpbWVvdXQ6IGlucHV0LnRpbWVvdXRNcyA/PyAxMjBfMDAwfSkgYXMgR2VtaW5pUmVzcG9uc2U7XG4gIGlmKHJlc3BvbnNlLmVycm9yICYmIFs0MDAsIDQwMSwgNDAzLCA0MDRdLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLmNvZGUgfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdHZW1pbmkgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSByZWZlcmVuY2UgZm9ybWF0IGFuZCBtb2RlbCBhY2Nlc3MuJyk7XG4gIH1cbiAgaWYocmVzcG9uc2UucHJvbXB0RmVlZGJhY2s/LmJsb2NrUmVhc29uIHx8IHJlc3BvbnNlLmVycm9yIHx8ICFyZXNwb25zZS5jYW5kaWRhdGVzPy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdHZW1pbmkgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZC4nKTtcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSByZXNwb25zZS5jYW5kaWRhdGVzWzBdITtcbiAgaWYoY2FuZGlkYXRlLmZpbmlzaFJlYXNvbiAhPT0gJ1NUT1AnKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignR2VtaW5pIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQ6IGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZS4nKTtcbiAgfVxuICBjb25zdCBvdXRwdXQgPSAoY2FuZGlkYXRlLmNvbnRlbnQ/LnBhcnRzIHx8IFtdKS5maWx0ZXIoKHBhcnQpID0+ICFwYXJ0LnRob3VnaHQpO1xuICBjb25zdCBpbmxpbmUgPSBvdXRwdXQuZmluZCgocGFydCkgPT4gcGFydC5pbmxpbmVEYXRhKT8uaW5saW5lRGF0YTtcbiAgbGV0IGltYWdlOiBHZW5lcmF0ZWRDb250ZW50WydpbWFnZSddO1xuICBpZihpbmxpbmUgJiYgWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZyddLmluY2x1ZGVzKGlubGluZS5taW1lVHlwZSkpIHtcbiAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKGlubGluZS5kYXRhLCAnYmFzZTY0Jyk7XG4gICAgaWYoIWJ5dGVzLmxlbmd0aCB8fCBieXRlcy5sZW5ndGggPiAyMCAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdJbnZhbGlkIGltYWdlIG91dHB1dC4nKTtcbiAgICB9XG4gICAgaW1hZ2UgPSB7Ynl0ZXMsIG1pbWU6IGlubGluZS5taW1lVHlwZSBhcyAnaW1hZ2UvcG5nJyB8ICdpbWFnZS9qcGVnJ307XG4gIH1cbiAgY29uc3QgdGV4dCA9IG91dHB1dC5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCB8fCAnJykuam9pbignXFxuJykudHJpbSgpO1xuICBpZihpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyA/ICFpbWFnZSA6ICF0ZXh0KSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignVGhlIHJlcXVlc3RlZCBvdXRwdXQgd2FzIG5vdCByZXR1cm5lZC4nKTtcbiAgfVxuICBjb25zdCBzb3VyY2VzID0gKGNhbmRpZGF0ZS5ncm91bmRpbmdNZXRhZGF0YT8uZ3JvdW5kaW5nQ2h1bmtzIHx8IFtdKS5mbGF0TWFwKCh7d2VifSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdlYj8udXJpIHx8ICcnKTtcbiAgICAgIHJldHVybiB1cmwucHJvdG9jb2wgPT09ICdodHRwczonID8gW3t0aXRsZTogd2ViPy50aXRsZSB8fCB1cmwuaG9zdG5hbWUsIHVybDogdXJsLmhyZWZ9XSA6IFtdO1xuICAgIH0gY2F0Y2h7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBpbWFnZSwgc2VhcmNoU3VnZ2VzdGlvbnNIdG1sOiBjYW5kaWRhdGUuZ3JvdW5kaW5nTWV0YWRhdGE/LnNlYXJjaEVudHJ5UG9pbnQ/LnJlbmRlcmVkQ29udGVudCwgc291cmNlcywgdGV4dFxuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJnZW5lcmF0ZU9sbGFtYUNvbnRlbnQiLCJDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IiLCJDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IiLCJwb3N0IiwiQ29uZmlnIiwidmFsaWRNZXNzYWdlQ29udGVudCIsIm1lc3NhZ2UiLCJjb250ZW50IiwidHJpbSIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsImV2ZXJ5IiwicGFydCIsInR5cGUiLCJ0ZXh0Iiwicm9sZSIsInVybCIsInRlc3QiLCJkZXRhaWwiLCJ1bmRlZmluZWQiLCJpbmNsdWRlcyIsImdlbmVyYXRlQ29udGVudCIsImlucHV0IiwiY29uZmlnIiwiZ2V0IiwicHJvdmlkZXIiLCJtZXNzYWdlcyIsInByb21wdCIsInNvbWUiLCJyZWFzb25pbmdFZmZvcnQiLCJyZXNwb25zZUZvcm1hdCIsInRpbWVvdXRNcyIsIk51bWJlciIsImlzSW50ZWdlciIsImZvcm1hdCIsIm5hbWUiLCJzY2hlbWEiLCJzdHJpY3QiLCJtb2RhbGl0eSIsInRvcFAiLCJpc0Zpbml0ZSIsInRlbXBlcmF0dXJlIiwibWF4VG9rZW5zIiwiaW1hZ2VzIiwic2VhcmNoIiwiY2xhdWRlS2V5IiwicmVzcG9uc2UiLCJtYXhfdG9rZW5zIiwibW9kZWwiLCJjbGF1ZGVNb2RlbCIsInN5c3RlbSIsImNhY2hlIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJ0aW1lb3V0IiwiZXJyb3IiLCJmaWx0ZXIiLCJtYXAiLCJqb2luIiwic3RvcF9yZWFzb24iLCJzb3VyY2VzIiwiZ3JvayIsImtleSIsImdyb2tLZXkiLCJvcGVuYWlLZXkiLCJpbWFnZSIsImltYWdlX3VybCIsIm1pbWUiLCJieXRlcyIsInRvU3RyaW5nIiwiaW5zdHJ1Y3Rpb25zIiwibWF4X291dHB1dF90b2tlbnMiLCJncm9rTW9kZWwiLCJvcGVuYWlNb2RlbCIsInJlYXNvbmluZyIsImVmZm9ydCIsInN0b3JlIiwidHJ1bmNhdGlvbiIsIkF1dGhvcml6YXRpb24iLCJzdGF0dXMiLCJvdXRwdXQiLCJpdGVtIiwiZmxhdE1hcCIsImdlbWluaUtleSIsInBhcnRzIiwiaW5saW5lRGF0YSIsImRhdGEiLCJtaW1lVHlwZSIsImdlbWluaUltYWdlTW9kZWwiLCJnZW1pbmlNb2RlbCIsImNvbnRlbnRzIiwic3lzdGVtSW5zdHJ1Y3Rpb24iLCJnZW5lcmF0aW9uQ29uZmlnIiwiYXNwZWN0UmF0aW8iLCJpbWFnZUNvbmZpZyIsInJlc3BvbnNlTW9kYWxpdGllcyIsIm1heE91dHB1dFRva2VucyIsInJlc3BvbnNlTWltZVR5cGUiLCJ0b29scyIsImdvb2dsZVNlYXJjaCIsImNvZGUiLCJwcm9tcHRGZWVkYmFjayIsImJsb2NrUmVhc29uIiwiY2FuZGlkYXRlcyIsImNhbmRpZGF0ZSIsImZpbmlzaFJlYXNvbiIsInRob3VnaHQiLCJpbmxpbmUiLCJmaW5kIiwiQnVmZmVyIiwiZnJvbSIsImdyb3VuZGluZ01ldGFkYXRhIiwiZ3JvdW5kaW5nQ2h1bmtzIiwid2ViIiwiVVJMIiwidXJpIiwicHJvdG9jb2wiLCJ0aXRsZSIsImhvc3RuYW1lIiwiaHJlZiIsInNlYXJjaFN1Z2dlc3Rpb25zSHRtbCIsInNlYXJjaEVudHJ5UG9pbnQiLCJyZW5kZXJlZENvbnRlbnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLHFCQUFxQixRQUFPLHdCQUF3QjtBQUM1RCxTQUFRQyw4QkFBOEIsRUFBRUMsOEJBQThCLFFBQU8sK0JBQStCO0FBQzVHLFNBQVFELDhCQUE4QixFQUFFQyw4QkFBOEIsUUFBTywrQkFBK0I7QUFDNUcsU0FBUUMsSUFBSSxRQUFPLG9CQUFvQjtBQUV2QyxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQXFFcEMsTUFBTUMsc0JBQXNCLENBQUNDO0lBQzNCLElBQUcsT0FBT0EsUUFBUUMsT0FBTyxLQUFLLFVBQVU7UUFDdEMsT0FBTyxDQUFDLENBQUNELFFBQVFDLE9BQU8sQ0FBQ0MsSUFBSTtJQUMvQjtJQUNBLE9BQU9DLE1BQU1DLE9BQU8sQ0FBQ0osUUFBUUMsT0FBTyxLQUFLRCxRQUFRQyxPQUFPLENBQUNJLE1BQU0sR0FBRyxLQUFLTCxRQUFRQyxPQUFPLENBQUNLLEtBQUssQ0FBQyxDQUFDQztR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
|
|
371
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb250ZW50R2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2dlbmVyYXRlT2xsYW1hQ29udGVudH0gZnJvbSAnLi9vbGxhbWFHZW5lcmF0aW9uLmpzJztcbmltcG9ydCB7Q29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yLCBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3J9IGZyb20gJy4vY29udGVudEdlbmVyYXRpb25FcnJvcnMuanMnO1xuZXhwb3J0IHtDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IsIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcn0gZnJvbSAnLi9jb250ZW50R2VuZXJhdGlvbkVycm9ycy5qcyc7XG5pbXBvcnQge3Bvc3R9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25Db25maWcge1xuICBjbGF1ZGVLZXk/OiBzdHJpbmc7XG4gIGNsYXVkZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlJbWFnZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlLZXk/OiBzdHJpbmc7XG4gIGdlbWluaU1vZGVsPzogc3RyaW5nO1xuICBncm9rS2V5Pzogc3RyaW5nO1xuICBncm9rTW9kZWw/OiBzdHJpbmc7XG4gIG9sbGFtYT86IHtlbmRwb2ludDogc3RyaW5nOyBwcm90b2NvbDogJ2dlbmVyYXRlJyB8ICdjaGF0JyB8ICdvcGVuYWktY2hhdCd9O1xuICBvcGVuYWlLZXk/OiBzdHJpbmc7XG4gIG9wZW5haU1vZGVsPzogc3RyaW5nO1xufVxuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25QYXJ0ID0ge3RleHQ6IHN0cmluZzsgdHlwZTogJ3RleHQnfSB8IHtcbiAgZGV0YWlsPzogJ2F1dG8nIHwgJ2hpZ2gnIHwgJ2xvdyc7XG4gIHR5cGU6ICdpbWFnZSc7XG4gIHVybDogc3RyaW5nO1xufTtcbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25NZXNzYWdlIHtcbiAgY29udGVudDogc3RyaW5nIHwgQ29udGVudEdlbmVyYXRpb25QYXJ0W107XG4gIHJvbGU6ICdhc3Npc3RhbnQnIHwgJ2RldmVsb3BlcicgfCAnc3lzdGVtJyB8ICd1c2VyJztcbn1cbmV4cG9ydCB0eXBlIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQgPSB7dHlwZTogJ2pzb25fb2JqZWN0JyB8ICd0ZXh0J30gfCB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmljdD86IGJvb2xlYW47XG4gIHR5cGU6ICdqc29uX3NjaGVtYSc7XG59O1xuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25SZWFzb25pbmdFZmZvcnQgPSAnbm9uZScgfCAnbWluaW1hbCcgfCAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ3hoaWdoJyB8ICdtYXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0aW9uSW5wdXQge1xuICBhc3BlY3RSYXRpbz86IHN0cmluZztcbiAgaW1hZ2VzPzoge2J5dGVzOiBCdWZmZXI7IG1pbWU6IHN0cmluZ31bXTtcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICBtZXNzYWdlcz86IENvbnRlbnRHZW5lcmF0aW9uTWVzc2FnZVtdO1xuICBtb2RhbGl0eT86ICdpbWFnZScgfCAndGV4dCc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBvdXRwdXRUZXh0TW9kZT86ICdwcmVzZXJ2ZScgfCAndHJpbSc7XG4gIHByb21wdD86IHN0cmluZztcbiAgcHJvdmlkZXI6ICdjbGF1ZGUnIHwgJ2dlbWluaScgfCAnZ3JvaycgfCAnb2xsYW1hJyB8ICdvcGVuYWknO1xuICByZWFzb25pbmdFZmZvcnQ/OiBDb250ZW50R2VuZXJhdGlvblJlYXNvbmluZ0VmZm9ydDtcbiAgcmVzcG9uc2VGb3JtYXQ/OiBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRm9ybWF0O1xuICBzZWFyY2g/OiBib29sZWFuO1xuICBzeXN0ZW0/OiBzdHJpbmc7XG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIHRvcFA/OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlZENvbnRlbnQge1xuICBpbWFnZT86IHtieXRlczogQnVmZmVyOyBtaW1lOiAnaW1hZ2UvanBlZycgfCAnaW1hZ2UvcG5nJ307XG4gIHNlYXJjaFN1Z2dlc3Rpb25zSHRtbD86IHN0cmluZztcbiAgc291cmNlczoge3RpdGxlOiBzdHJpbmc7IHVybDogc3RyaW5nfVtdO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgR2VtaW5pUGFydCB7aW5saW5lRGF0YT86IHtkYXRhOiBzdHJpbmc7IG1pbWVUeXBlOiBzdHJpbmd9OyB0ZXh0Pzogc3RyaW5nOyB0aG91Z2h0PzogYm9vbGVhbn1cbmludGVyZmFjZSBHZW1pbmlSZXNwb25zZSB7XG4gIGNhbmRpZGF0ZXM/OiB7XG4gICAgY29udGVudD86IHtwYXJ0cz86IEdlbWluaVBhcnRbXX07XG4gICAgZmluaXNoUmVhc29uPzogc3RyaW5nO1xuICAgIGdyb3VuZGluZ01ldGFkYXRhPzoge1xuICAgICAgZ3JvdW5kaW5nQ2h1bmtzPzoge3dlYj86IHt0aXRsZT86IHN0cmluZzsgdXJpPzogc3RyaW5nfX1bXTtcbiAgICAgIHNlYXJjaEVudHJ5UG9pbnQ/OiB7cmVuZGVyZWRDb250ZW50Pzogc3RyaW5nfTtcbiAgICB9O1xuICB9W107XG4gIGVycm9yPzoge2NvZGU/OiBudW1iZXJ9O1xuICBwcm9tcHRGZWVkYmFjaz86IHtibG9ja1JlYXNvbj86IHN0cmluZ307XG59XG5cbmNvbnN0IHZhbGlkTWVzc2FnZUNvbnRlbnQgPSAobWVzc2FnZTogQ29udGVudEdlbmVyYXRpb25NZXNzYWdlKTogYm9vbGVhbiA9PiB7XG4gIGlmKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuICEhbWVzc2FnZS5jb250ZW50LnRyaW0oKTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpICYmIG1lc3NhZ2UuY29udGVudC5sZW5ndGggPiAwICYmIG1lc3NhZ2UuY29udGVudC5ldmVyeSgocGFydCkgPT4ge1xuICAgIGlmKCFwYXJ0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmKHBhcnQudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHBhcnQudGV4dCA9PT0gJ3N0cmluZycgJiYgISFwYXJ0LnRleHQudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gcGFydC50eXBlID09PSAnaW1hZ2UnICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ3VzZXInICYmIHR5cGVvZiBwYXJ0LnVybCA9PT0gJ3N0cmluZydcbiAgICAgICYmIC9eKGh0dHBzPzpcXC9cXC9bXlxcc10rfGRhdGE6aW1hZ2VcXC8ocG5nfGpwZWd8d2VicHxnaWYpO2Jhc2U2NCxbQS1aYS16MC05Ky9dKz17MCwyfSkkLy50ZXN0KHBhcnQudXJsKVxuICAgICAgJiYgKHBhcnQuZGV0YWlsID09PSB1bmRlZmluZWQgfHwgWydhdXRvJywgJ2hpZ2gnLCAnbG93J10uaW5jbHVkZXMocGFydC5kZXRhaWwpKTtcbiAgfSk7XG59O1xuXG4vKiogU2luZ2xlIHN1Ym1pc3Npb24gdGhyb3VnaCBSaXAtSHVudGVyOyBjYWxsZXJzIG93biBkdXJhYmxlIGpvYnMgYW5kIHJlY29uY2lsaWF0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlQ29udGVudCA9IGFzeW5jIChcbiAgaW5wdXQ6IENvbnRlbnRHZW5lcmF0aW9uSW5wdXQsXG4gIGNvbmZpZzogQ29udGVudEdlbmVyYXRpb25Db25maWcgPSBDb25maWcuZ2V0PENvbnRlbnRHZW5lcmF0aW9uQ29uZmlnPignY29udGVudEdlbmVyYXRpb24nKSB8fCB7fVxuKTogUHJvbWlzZTxHZW5lcmF0ZWRDb250ZW50PiA9PiB7XG4gIGlmKCFbJ2NsYXVkZScsICdnZW1pbmknLCAnZ3JvaycsICdvbGxhbWEnLCAnb3BlbmFpJ10uaW5jbHVkZXMoaW5wdXQucHJvdmlkZXIpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignQSBzdXBwb3J0ZWQgcHJvdmlkZXIgaXMgcmVxdWlyZWQuJyk7XG4gIH1cbiAgaWYoaW5wdXQub3V0cHV0VGV4dE1vZGUgIT09IHVuZGVmaW5lZFxuICAgICYmICghWydjbGF1ZGUnLCAnb3BlbmFpJywgJ2dyb2snXS5pbmNsdWRlcyhpbnB1dC5wcm92aWRlcikgfHwgIVsncHJlc2VydmUnLCAndHJpbSddLmluY2x1ZGVzKGlucHV0Lm91dHB1dFRleHRNb2RlKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdvdXRwdXRUZXh0TW9kZSByZXF1aXJlcyBDbGF1ZGUsIE9wZW5BSSBvciBHcm9rIGFuZCBwcmVzZXJ2ZSBvciB0cmltLicpO1xuICB9XG4gIGlmKGlucHV0Lm1lc3NhZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZihpbnB1dC5wcm9tcHQgIT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheShpbnB1dC5tZXNzYWdlcykgfHwgIWlucHV0Lm1lc3NhZ2VzLmxlbmd0aFxuICAgICAgfHwgaW5wdXQubWVzc2FnZXMuc29tZSgobWVzc2FnZSkgPT5cbiAgICAgICAgIW1lc3NhZ2UgfHwgIVsnYXNzaXN0YW50JywgJ2RldmVsb3BlcicsICdzeXN0ZW0nLCAndXNlciddLmluY2x1ZGVzKG1lc3NhZ2Uucm9sZSkgfHwgIXZhbGlkTWVzc2FnZUNvbnRlbnQobWVzc2FnZSkpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdTdXBwbHkgZWl0aGVyIGEgbm9uLWVtcHR5IHByb21wdCBvciBub24tZW1wdHkgdGV4dCBtZXNzYWdlcyB3aXRoIHN1cHBvcnRlZCByb2xlcy4nKTtcbiAgICB9XG4gIH0gZWxzZSBpZih0eXBlb2YgaW5wdXQucHJvbXB0ICE9PSAnc3RyaW5nJyB8fCAhaW5wdXQucHJvbXB0LnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0Egbm9uLWVtcHR5IHByb21wdCBpcyByZXF1aXJlZC4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciAhPT0gJ29wZW5haSdcbiAgICAmJiAoaW5wdXQubWVzc2FnZXMgIT09IHVuZGVmaW5lZCB8fCBpbnB1dC5yZWFzb25pbmdFZmZvcnQgIT09IHVuZGVmaW5lZFxuICAgICAgfHwgKFsnY2xhdWRlJywgJ2dyb2snXS5pbmNsdWRlcyhpbnB1dC5wcm92aWRlcikgJiYgaW5wdXQucmVzcG9uc2VGb3JtYXQgIT09IHVuZGVmaW5lZCkpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcihcbiAgICAgICdNZXNzYWdlcyBhbmQgcmVhc29uaW5nIGVmZm9ydCByZXF1aXJlIE9wZW5BSTsgQ2xhdWRlIGFuZCBHcm9rIGRvIG5vdCBzdXBwb3J0IHJlc3BvbnNlIGZvcm1hdCBvcHRpb25zLidcbiAgICApO1xuICB9XG4gIGlmKGlucHV0LnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlucHV0LnRpbWVvdXRNcykgfHwgaW5wdXQudGltZW91dE1zIDwgMSB8fCBpbnB1dC50aW1lb3V0TXMgPiAyXzE0N180ODNfNjQ3KSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ3RpbWVvdXRNcyBtdXN0IGJlIGEgcG9zaXRpdmUgMzItYml0IGludGVnZXIuJyk7XG4gIH1cbiAgaWYoaW5wdXQucmVhc29uaW5nRWZmb3J0ICE9PSB1bmRlZmluZWQgJiYgIVsnbm9uZScsICdtaW5pbWFsJywgJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcsICd4aGlnaCcsICdtYXgnXS5pbmNsdWRlcyhpbnB1dC5yZWFzb25pbmdFZmZvcnQpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVW5zdXBwb3J0ZWQgcmVhc29uaW5nIGVmZm9ydC4nKTtcbiAgfVxuICBjb25zdCBmb3JtYXQgPSBpbnB1dC5yZXNwb25zZUZvcm1hdDtcbiAgaWYoZm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgKCFmb3JtYXQgfHwgIVsndGV4dCcsICdqc29uX29iamVjdCcsICdqc29uX3NjaGVtYSddLmluY2x1ZGVzKGZvcm1hdC50eXBlKSB8fCAoZm9ybWF0LnR5cGUgPT09ICdqc29uX3NjaGVtYScgJiYgKFxuICAgIHR5cGVvZiBmb3JtYXQubmFtZSAhPT0gJ3N0cmluZycgfHwgIS9eW2EtekEtWjAtOV8tXXsxLDY0fSQvLnRlc3QoZm9ybWF0Lm5hbWUpIHx8ICFmb3JtYXQuc2NoZW1hIHx8IHR5cGVvZiBmb3JtYXQuc2NoZW1hICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGZvcm1hdC5zY2hlbWEpXG4gICAgfHwgKGZvcm1hdC5zdHJpY3QgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZm9ybWF0LnN0cmljdCAhPT0gJ2Jvb2xlYW4nKVxuICApKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIGZvcm1hdC4gSlNPTiBzY2hlbWFzIHJlcXVpcmUgYSBuYW1lIGFuZCBzY2hlbWEgb2JqZWN0LicpO1xuICB9XG4gIGlmKFsnZ2VtaW5pJywgJ29sbGFtYSddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSAmJiBmb3JtYXQgIT09IHVuZGVmaW5lZCAmJiAoZm9ybWF0LnR5cGUgPT09ICdqc29uX3NjaGVtYScgfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVGhpcyBwcm92aWRlciBzdXBwb3J0cyB0ZXh0IG9yIGpzb25fb2JqZWN0IGZvciB0ZXh0IGdlbmVyYXRpb24gb25seS4nKTtcbiAgfVxuICBpZihpbnB1dC50b3BQICE9PSB1bmRlZmluZWQgJiYgKCFbJ2dlbWluaScsICdvbGxhbWEnXS5pbmNsdWRlcyhpbnB1dC5wcm92aWRlcikgfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgfHwgIU51bWJlci5pc0Zpbml0ZShpbnB1dC50b3BQKSB8fCBpbnB1dC50b3BQIDwgMCB8fCBpbnB1dC50b3BQID4gMSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCd0b3BQIHJlcXVpcmVzIGEgR2VtaW5pIG9yIE9sbGFtYSB0ZXh0IHJlcXVlc3QgYW5kIGEgZmluaXRlIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4nKTtcbiAgfVxuICBpZihpbnB1dC50ZW1wZXJhdHVyZSAhPT0gdW5kZWZpbmVkICYmICghWydnZW1pbmknLCAnb2xsYW1hJ10uaW5jbHVkZXMoaW5wdXQucHJvdmlkZXIpIHx8IGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnIHx8ICFOdW1iZXIuaXNGaW5pdGUoaW5wdXQudGVtcGVyYXR1cmUpIHx8IGlucHV0LnRlbXBlcmF0dXJlIDwgMCB8fCAoaW5wdXQucHJvdmlkZXIgPT09ICdnZW1pbmknICYmIGlucHV0LnRlbXBlcmF0dXJlID4gMikpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcigndGVtcGVyYXR1cmUgcmVxdWlyZXMgYSBub25uZWdhdGl2ZSBmaW5pdGUgdmFsdWUgZm9yIE9sbGFtYSB0ZXh0IG9yIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyIGZvciBHZW1pbmkgdGV4dC4nKTtcbiAgfVxuICBpZihpbnB1dC5tYXhUb2tlbnMgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0ludGVnZXIoaW5wdXQubWF4VG9rZW5zKSB8fCBpbnB1dC5tYXhUb2tlbnMgPCAxKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ21heFRva2VucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciAhPT0gJ2dlbWluaSdcbiAgICAmJiAoKGlucHV0LmltYWdlcz8ubGVuZ3RoICYmICFbJ2dyb2snLCAnb2xsYW1hJ10uaW5jbHVkZXMoaW5wdXQucHJvdmlkZXIpKSB8fCBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyB8fCBpbnB1dC5zZWFyY2gpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVGhpcyBwcm92aWRlciBvcGVyYXRpb24gc3VwcG9ydHMgdGV4dCBpbnB1dCBhbmQgb3V0cHV0IG9ubHkuJyk7XG4gIH1cbiAgaWYoaW5wdXQucHJvdmlkZXIgPT09ICdvbGxhbWEnKSByZXR1cm4gZ2VuZXJhdGVPbGxhbWFDb250ZW50KGlucHV0LCBjb25maWcpO1xuICBjb25zdCB7cHJvbXB0LCBpbWFnZXMgPSBbXX0gPSBpbnB1dDtcbiAgaWYoaW5wdXQucHJvdmlkZXIgPT09ICdjbGF1ZGUnKSB7XG4gICAgaWYoIWNvbmZpZy5jbGF1ZGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0NsYXVkZSBpcyBub3QgY29uZmlndXJlZCBvbiB0aGlzIHNlcnZlci4nKTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0KCdodHRwczovL2FwaS5hbnRocm9waWMuY29tL3YxL21lc3NhZ2VzJywge1xuICAgICAgbWF4X3Rva2VuczogaW5wdXQubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICBtZXNzYWdlczogW3tjb250ZW50OiBwcm9tcHQsIHJvbGU6ICd1c2VyJ31dLFxuICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsIHx8IGNvbmZpZy5jbGF1ZGVNb2RlbCB8fCAnY2xhdWRlLXNvbm5ldC01JyxcbiAgICAgIHN5c3RlbTogaW5wdXQuc3lzdGVtXG4gICAgfSwge2NhY2hlOiBmYWxzZSwgaGVhZGVyczogbmV3IEhlYWRlcnMoeydhbnRocm9waWMtdmVyc2lvbic6ICcyMDIzLTA2LTAxJywgJ3gtYXBpLWtleSc6IGNvbmZpZy5jbGF1ZGVLZXl9KSwgdGltZW91dDogaW5wdXQudGltZW91dE1zID8/IDEyMF8wMDB9KSBhcyB7XG4gICAgICBjb250ZW50Pzoge3RleHQ/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9W107XG4gICAgICBlcnJvcj86IHt0eXBlPzogc3RyaW5nfTtcbiAgICAgIHN0b3BfcmVhc29uPzogc3RyaW5nO1xuICAgICAgdHlwZT86IHN0cmluZztcbiAgICB9O1xuICAgIGlmKHJlc3BvbnNlLmVycm9yICYmIFsnYXV0aGVudGljYXRpb25fZXJyb3InLCAnaW52YWxpZF9yZXF1ZXN0X2Vycm9yJywgJ25vdF9mb3VuZF9lcnJvcicsICdwZXJtaXNzaW9uX2Vycm9yJ10uaW5jbHVkZXMocmVzcG9uc2UuZXJyb3IudHlwZSB8fCAnJykpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0NsYXVkZSByZWplY3RlZCB0aGUgcmVxdWVzdC4gQ2hlY2sgdGhlIG1vZGVsIGFuZCBhY2NvdW50IGFjY2Vzcy4nKTtcbiAgICB9XG4gICAgY29uc3QgcHJlc2VydmUgPSBpbnB1dC5vdXRwdXRUZXh0TW9kZSA9PT0gJ3ByZXNlcnZlJztcbiAgICBpZihwcmVzZXJ2ZSAmJiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2UuY29udGVudCkgfHwgcmVzcG9uc2UuY29udGVudC5zb21lKChwYXJ0KSA9PlxuICAgICAgIXBhcnQgfHwgIVsndGV4dCcsICd0aGlua2luZycsICdyZWRhY3RlZF90aGlua2luZyddLmluY2x1ZGVzKHBhcnQudHlwZSB8fCAnJykgfHwgKHBhcnQudHlwZSA9PT0gJ3RleHQnICYmIHR5cGVvZiBwYXJ0LnRleHQgIT09ICdzdHJpbmcnKSkpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdDbGF1ZGUgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZC4nKTtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzID0gcmVzcG9uc2UuY29udGVudD8uZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICd0ZXh0JykubWFwKChwYXJ0KSA9PiBwYXJ0LnRleHQgfHwgJycpIHx8IFtdO1xuICAgIGNvbnN0IHRleHQgPSBwcmVzZXJ2ZSA/IGNodW5rcy5qb2luKCcnKSA6IGNodW5rcy5qb2luKCdcXG4nKS50cmltKCk7XG4gICAgaWYocmVzcG9uc2UuZXJyb3IgfHwgcmVzcG9uc2UudHlwZSAhPT0gJ21lc3NhZ2UnIHx8IHJlc3BvbnNlLnN0b3BfcmVhc29uICE9PSAnZW5kX3R1cm4nIHx8ICF0ZXh0LnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignQ2xhdWRlIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB7c291cmNlczogW10sIHRleHR9O1xuICB9XG4gIGlmKGlucHV0LnByb3ZpZGVyID09PSAnb3BlbmFpJyB8fCBpbnB1dC5wcm92aWRlciA9PT0gJ2dyb2snKSB7XG4gICAgY29uc3QgZ3JvayA9IGlucHV0LnByb3ZpZGVyID09PSAnZ3Jvayc7XG4gICAgY29uc3Qga2V5ID0gZ3JvayA/IGNvbmZpZy5ncm9rS2V5IDogY29uZmlnLm9wZW5haUtleTtcbiAgICBpZigha2V5KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKGAke2dyb2sgPyAnR3JvaycgOiAnT3BlbkFJJ30gaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2ZXIuYCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdChncm9rID8gJ2h0dHBzOi8vYXBpLnguYWkvdjEvcmVzcG9uc2VzJyA6ICdodHRwczovL2FwaS5vcGVuYWkuY29tL3YxL3Jlc3BvbnNlcycsIHtcbiAgICAgIGlucHV0OiBncm9rICYmIGltYWdlcy5sZW5ndGggPyBbe2NvbnRlbnQ6IFt7dGV4dDogcHJvbXB0LCB0eXBlOiAnaW5wdXRfdGV4dCd9LCAuLi5pbWFnZXMubWFwKChpbWFnZSkgPT4gKHtpbWFnZV91cmw6IGBkYXRhOiR7aW1hZ2UubWltZX07YmFzZTY0LCR7aW1hZ2UuYnl0ZXMudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsIHR5cGU6ICdpbnB1dF9pbWFnZSd9KSldLCByb2xlOiAndXNlcid9XSA6IGlucHV0Lm1lc3NhZ2VzPy5tYXAoKG1lc3NhZ2UpID0+ICh7Y29udGVudDogdHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gJ3N0cmluZycgPyBtZXNzYWdlLmNvbnRlbnQgOiBtZXNzYWdlLmNvbnRlbnQubWFwKChwYXJ0KSA9PiAocGFydC50eXBlID09PSAndGV4dCdcbiAgICAgICAgPyB7dGV4dDogcGFydC50ZXh0LCB0eXBlOiAnaW5wdXRfdGV4dCd9IDoge2RldGFpbDogcGFydC5kZXRhaWwgPz8gJ2F1dG8nLCBpbWFnZV91cmw6IHBhcnQudXJsLCB0eXBlOiAnaW5wdXRfaW1hZ2UnfSkpLCByb2xlOiBtZXNzYWdlLnJvbGUgPT09ICdzeXN0ZW0nID8gJ2RldmVsb3BlcicgOiBtZXNzYWdlLnJvbGV9KSkgPz8gcHJvbXB0LFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBpbnB1dC5zeXN0ZW0sXG4gICAgICBtYXhfb3V0cHV0X3Rva2VuczogaW5wdXQubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICBtb2RlbDogaW5wdXQubW9kZWwgfHwgKGdyb2sgPyBjb25maWcuZ3Jva01vZGVsIHx8ICdncm9rLTQuNycgOiBjb25maWcub3BlbmFpTW9kZWwgfHwgJ2dwdC02LWFzdHJhJyksXG4gICAgICAuLi4oaW5wdXQucmVhc29uaW5nRWZmb3J0ID8ge3JlYXNvbmluZzoge2VmZm9ydDogaW5wdXQucmVhc29uaW5nRWZmb3J0fX0gOiB7fSksXG4gICAgICBzdG9yZTogZmFsc2UsXG4gICAgICAuLi4oZm9ybWF0ID8ge3RleHQ6IHtmb3JtYXR9fSA6IHt9KSxcbiAgICAgIC4uLighZ3JvayA/IHt0cnVuY2F0aW9uOiAnZGlzYWJsZWQnfSA6IHt9KVxuICAgIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7a2V5fWB9KSwgdGltZW91dDogaW5wdXQudGltZW91dE1zID8/IDEyMF8wMDB9KSBhcyB7XG4gICAgICBlcnJvcj86IHtjb2RlPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfTtcbiAgICAgIG91dHB1dD86IHtjb250ZW50Pzoge3RleHQ/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9W107IHN0YXR1cz86IHN0cmluZzsgdHlwZT86IHN0cmluZ31bXTtcbiAgICAgIHN0YXR1cz86IHN0cmluZztcbiAgICB9O1xuICAgIGlmKHJlc3BvbnNlLmVycm9yICYmIFsnaW52YWxpZF9yZXF1ZXN0X2Vycm9yJywgJ2F1dGhlbnRpY2F0aW9uX2Vycm9yJywgJ3Blcm1pc3Npb25fZXJyb3InXS5pbmNsdWRlcyhyZXNwb25zZS5lcnJvci50eXBlIHx8ICcnKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcihgJHtncm9rID8gJ0dyb2snIDogJ09wZW5BSSd9IHJlamVjdGVkIHRoZSByZXF1ZXN0LiBDaGVjayB0aGUgbW9kZWwgYW5kIGFjY291bnQgYWNjZXNzLmApO1xuICAgIH1cbiAgICBpZihyZXNwb25zZS5lcnJvciB8fCByZXNwb25zZS5zdGF0dXMgIT09ICdjb21wbGV0ZWQnIHx8IHJlc3BvbnNlLm91dHB1dD8uc29tZSgoaXRlbSkgPT4gaXRlbS5zdGF0dXMgPT09ICdpbmNvbXBsZXRlJykpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoYCR7Z3JvayA/ICdHcm9rJyA6ICdPcGVuQUknfSByZXNwb25zZSBjb3VsZCBub3QgYmUgY29uZmlybWVkOiBnZW5lcmF0aW9uIGRpZCBub3QgY29tcGxldGUuYCk7XG4gICAgfVxuICAgIGlmKHJlc3BvbnNlLm91dHB1dD8uc29tZSgoaXRlbSkgPT4gaXRlbS5jb250ZW50Py5zb21lKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdyZWZ1c2FsJykpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKGAke2dyb2sgPyAnR3JvaycgOiAnT3BlbkFJJ30gZGVjbGluZWQgdGhlIHJlcXVlc3QuYCk7XG4gICAgfVxuICAgIGlmKHJlc3BvbnNlLm91dHB1dD8uc29tZSgoaXRlbSkgPT4gaXRlbS50eXBlICYmICFbJ21lc3NhZ2UnLCAncmVhc29uaW5nJ10uaW5jbHVkZXMoaXRlbS50eXBlKSkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoYCR7Z3JvayA/ICdHcm9rJyA6ICdPcGVuQUknfSByZXR1cm5lZCBhbiB1bnN1cHBvcnRlZCBvdXRwdXQgaXRlbS5gKTtcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IHJlc3BvbnNlLm91dHB1dD8uZmlsdGVyKChpdGVtKSA9PiBpdGVtLnR5cGUgPT09ICdtZXNzYWdlJyB8fCAoZ3JvayAmJiAhaXRlbS50eXBlKSkuZmxhdE1hcCgoaXRlbSkgPT4gaXRlbS5jb250ZW50IHx8IFtdKVxuICAgICAgLmZpbHRlcigocGFydCkgPT4gcGFydC50eXBlID09PSAnb3V0cHV0X3RleHQnKS5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCB8fCAnJykuam9pbignJykgfHwgJyc7XG4gICAgaWYoIXRleHQudHJpbSgpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKGAke2dyb2sgPyAnR3JvaycgOiAnT3BlbkFJJ30gcmV0dXJuZWQgZW1wdHkgb3V0cHV0LmApO1xuICAgIH1cbiAgICByZXR1cm4ge3NvdXJjZXM6IFtdLCB0ZXh0OiBpbnB1dC5vdXRwdXRUZXh0TW9kZSA9PT0gJ3ByZXNlcnZlJyA/IHRleHQgOiB0ZXh0LnRyaW0oKX07XG4gIH1cbiAgaWYoIWNvbmZpZy5nZW1pbmlLZXkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdHZW1pbmkgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2ZXIuJyk7XG4gIH1cbiAgY29uc3QgcGFydHM6IHVua25vd25bXSA9IFt7dGV4dDogcHJvbXB0fSwgLi4uaW1hZ2VzLm1hcCgoaW1hZ2UpID0+ICh7aW5saW5lRGF0YToge2RhdGE6IGltYWdlLmJ5dGVzLnRvU3RyaW5nKCdiYXNlNjQnKSwgbWltZVR5cGU6IGltYWdlLm1pbWV9fSkpXTtcbiAgY29uc3QgbW9kZWwgPSBpbnB1dC5tb2RlbCB8fCAoaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgPyBjb25maWcuZ2VtaW5pSW1hZ2VNb2RlbCB8fCAnZ2VtaW5pLTMuMS1mbGFzaC1pbWFnZScgOiBjb25maWcuZ2VtaW5pTW9kZWwgfHwgJ2dlbWluaS0zLjgtZmxhc2gnKTtcbiAgaWYoIS9eW2EtekEtWjAtOS5fLV0rJC8udGVzdChtb2RlbCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdJbnZhbGlkIEdlbWluaSBtb2RlbCBjb25maWd1cmF0aW9uLicpO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdChgaHR0cHM6Ly9nZW5lcmF0aXZlbGFuZ3VhZ2UuZ29vZ2xlYXBpcy5jb20vdjFiZXRhL21vZGVscy8ke21vZGVsfTpnZW5lcmF0ZUNvbnRlbnRgLCB7XG4gICAgY29udGVudHM6IFt7cGFydHMsIHJvbGU6ICd1c2VyJ31dLFxuICAgIC4uLihpbnB1dC5zeXN0ZW0gPyB7c3lzdGVtSW5zdHJ1Y3Rpb246IHtwYXJ0czogW3t0ZXh0OiBpbnB1dC5zeXN0ZW19XX19IDoge30pLFxuICAgIGdlbmVyYXRpb25Db25maWc6IGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnID8gey4uLihpbnB1dC5hc3BlY3RSYXRpbyA/IHtpbWFnZUNvbmZpZzoge2FzcGVjdFJhdGlvOiBpbnB1dC5hc3BlY3RSYXRpb319IDoge30pLCByZXNwb25zZU1vZGFsaXRpZXM6IFsnVEVYVCcsICdJTUFHRSddfSA6IHtcbiAgICAgIG1heE91dHB1dFRva2VuczogaW5wdXQubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICAuLi4oZm9ybWF0ID8ge3Jlc3BvbnNlTWltZVR5cGU6IGZvcm1hdC50eXBlID09PSAnanNvbl9vYmplY3QnID8gJ2FwcGxpY2F0aW9uL2pzb24nIDogJ3RleHQvcGxhaW4nfSA6IHt9KSxcbiAgICAgIC4uLihpbnB1dC50ZW1wZXJhdHVyZSAhPT0gdW5kZWZpbmVkID8ge3RlbXBlcmF0dXJlOiBpbnB1dC50ZW1wZXJhdHVyZX0gOiB7fSksXG4gICAgICAuLi4oaW5wdXQudG9wUCAhPT0gdW5kZWZpbmVkID8ge3RvcFA6IGlucHV0LnRvcFB9IDoge30pXG4gICAgfSxcbiAgICAuLi4oaW5wdXQuc2VhcmNoID8ge3Rvb2xzOiBbe2dvb2dsZVNlYXJjaDoge319XX0gOiB7fSlcbiAgfSwge2NhY2hlOiBmYWxzZSwgaGVhZGVyczogbmV3IEhlYWRlcnMoeyd4LWdvb2ctYXBpLWtleSc6IGNvbmZpZy5nZW1pbmlLZXl9KSwgdGltZW91dDogaW5wdXQudGltZW91dE1zID8/IDEyMF8wMDB9KSBhcyBHZW1pbmlSZXNwb25zZTtcbiAgaWYocmVzcG9uc2UuZXJyb3IgJiYgWzQwMCwgNDAxLCA0MDMsIDQwNF0uaW5jbHVkZXMocmVzcG9uc2UuZXJyb3IuY29kZSB8fCAwKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0dlbWluaSByZWplY3RlZCB0aGUgcmVxdWVzdC4gQ2hlY2sgdGhlIHJlZmVyZW5jZSBmb3JtYXQgYW5kIG1vZGVsIGFjY2Vzcy4nKTtcbiAgfVxuICBpZihyZXNwb25zZS5wcm9tcHRGZWVkYmFjaz8uYmxvY2tSZWFzb24gfHwgcmVzcG9uc2UuZXJyb3IgfHwgIXJlc3BvbnNlLmNhbmRpZGF0ZXM/Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ0dlbWluaSByZXNwb25zZSBjb3VsZCBub3QgYmUgY29uZmlybWVkLicpO1xuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHJlc3BvbnNlLmNhbmRpZGF0ZXNbMF0hO1xuICBpZihjYW5kaWRhdGUuZmluaXNoUmVhc29uICE9PSAnU1RPUCcpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdHZW1pbmkgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZDogZ2VuZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlLicpO1xuICB9XG4gIGNvbnN0IG91dHB1dCA9IChjYW5kaWRhdGUuY29udGVudD8ucGFydHMgfHwgW10pLmZpbHRlcigocGFydCkgPT4gIXBhcnQudGhvdWdodCk7XG4gIGNvbnN0IGlubGluZSA9IG91dHB1dC5maW5kKChwYXJ0KSA9PiBwYXJ0LmlubGluZURhdGEpPy5pbmxpbmVEYXRhO1xuICBsZXQgaW1hZ2U6IEdlbmVyYXRlZENvbnRlbnRbJ2ltYWdlJ107XG4gIGlmKGlubGluZSAmJiBbJ2ltYWdlL3BuZycsICdpbWFnZS9qcGVnJ10uaW5jbHVkZXMoaW5saW5lLm1pbWVUeXBlKSkge1xuICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmZyb20oaW5saW5lLmRhdGEsICdiYXNlNjQnKTtcbiAgICBpZighYnl0ZXMubGVuZ3RoIHx8IGJ5dGVzLmxlbmd0aCA+IDIwICogMTAyNCAqIDEwMjQpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ0ludmFsaWQgaW1hZ2Ugb3V0cHV0LicpO1xuICAgIH1cbiAgICBpbWFnZSA9IHtieXRlcywgbWltZTogaW5saW5lLm1pbWVUeXBlIGFzICdpbWFnZS9wbmcnIHwgJ2ltYWdlL2pwZWcnfTtcbiAgfVxuICBjb25zdCB0ZXh0ID0gb3V0cHV0Lm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKS5qb2luKCdcXG4nKS50cmltKCk7XG4gIGlmKGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnID8gIWltYWdlIDogIXRleHQpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdUaGUgcmVxdWVzdGVkIG91dHB1dCB3YXMgbm90IHJldHVybmVkLicpO1xuICB9XG4gIGNvbnN0IHNvdXJjZXMgPSAoY2FuZGlkYXRlLmdyb3VuZGluZ01ldGFkYXRhPy5ncm91bmRpbmdDaHVua3MgfHwgW10pLmZsYXRNYXAoKHt3ZWJ9KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2ViPy51cmkgfHwgJycpO1xuICAgICAgcmV0dXJuIHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyBbe3RpdGxlOiB3ZWI/LnRpdGxlIHx8IHVybC5ob3N0bmFtZSwgdXJsOiB1cmwuaHJlZn1dIDogW107XG4gICAgfSBjYXRjaHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGltYWdlLCBzZWFyY2hTdWdnZXN0aW9uc0h0bWw6IGNhbmRpZGF0ZS5ncm91bmRpbmdNZXRhZGF0YT8uc2VhcmNoRW50cnlQb2ludD8ucmVuZGVyZWRDb250ZW50LCBzb3VyY2VzLCB0ZXh0XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbImdlbmVyYXRlT2xsYW1hQ29udGVudCIsIkNvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvciIsIkNvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvciIsInBvc3QiLCJDb25maWciLCJ2YWxpZE1lc3NhZ2VDb250ZW50IiwibWVzc2FnZSIsImNvbnRlbnQiLCJ0cmltIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiZXZlcnkiLCJwYXJ0IiwidHlwZSIsInRleHQiLCJyb2xlIiwidXJsIiwidGVzdCIsImRldGFpbCIsInVuZGVmaW5lZCIsImluY2x1ZGVzIiwiZ2VuZXJhdGVDb250ZW50IiwiaW5wdXQiLCJjb25maWciLCJnZXQiLCJwcm92aWRlciIsIm91dHB1dFRleHRNb2RlIiwibWVzc2FnZXMiLCJwcm9tcHQiLCJzb21lIiwicmVhc29uaW5nRWZmb3J0IiwicmVzcG9uc2VGb3JtYXQiLCJ0aW1lb3V0TXMiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJmb3JtYXQiLCJuYW1lIiwic2NoZW1hIiwic3RyaWN0IiwibW9kYWxpdHkiLCJ0b3BQIiwiaXNGaW5pdGUiLCJ0ZW1wZXJhdHVyZSIsIm1heFRva2VucyIsImltYWdlcyIsInNlYXJjaCIsImNsYXVkZUtleSIsInJlc3BvbnNlIiwibWF4X3Rva2VucyIsIm1vZGVsIiwiY2xhdWRlTW9kZWwiLCJzeXN0ZW0iLCJjYWNoZSIsImhlYWRlcnMiLCJIZWFkZXJzIiwidGltZW91dCIsImVycm9yIiwicHJlc2VydmUiLCJjaHVua3MiLCJmaWx0ZXIiLCJtYXAiLCJqb2luIiwic3RvcF9yZWFzb24iLCJzb3VyY2VzIiwiZ3JvayIsImtleSIsImdyb2tLZXkiLCJvcGVuYWlLZXkiLCJpbWFnZSIsImltYWdlX3VybCIsIm1pbWUiLCJieXRlcyIsInRvU3RyaW5nIiwiaW5zdHJ1Y3Rpb25zIiwibWF4X291dHB1dF90b2tlbnMiLCJncm9rTW9kZWwiLCJvcGVuYWlNb2RlbCIsInJlYXNvbmluZyIsImVmZm9ydCIsInN0b3JlIiwidHJ1bmNhdGlvbiIsIkF1dGhvcml6YXRpb24iLCJzdGF0dXMiLCJvdXRwdXQiLCJpdGVtIiwiZmxhdE1hcCIsImdlbWluaUtleSIsInBhcnRzIiwiaW5saW5lRGF0YSIsImRhdGEiLCJtaW1lVHlwZSIsImdlbWluaUltYWdlTW9kZWwiLCJnZW1pbmlNb2RlbCIsImNvbnRlbnRzIiwic3lzdGVtSW5zdHJ1Y3Rpb24iLCJnZW5lcmF0aW9uQ29uZmlnIiwiYXNwZWN0UmF0aW8iLCJpbWFnZUNvbmZpZyIsInJlc3BvbnNlTW9kYWxpdGllcyIsIm1heE91dHB1dFRva2VucyIsInJlc3BvbnNlTWltZVR5cGUiLCJ0b29scyIsImdvb2dsZVNlYXJjaCIsImNvZGUiLCJwcm9tcHRGZWVkYmFjayIsImJsb2NrUmVhc29uIiwiY2FuZGlkYXRlcyIsImNhbmRpZGF0ZSIsImZpbmlzaFJlYXNvbiIsInRob3VnaHQiLCJpbmxpbmUiLCJmaW5kIiwiQnVmZmVyIiwiZnJvbSIsImdyb3VuZGluZ01ldGFkYXRhIiwiZ3JvdW5kaW5nQ2h1bmtzIiwid2ViIiwiVVJMIiwidXJpIiwicHJvdG9jb2wiLCJ0aXRsZSIsImhvc3RuYW1lIiwiaHJlZiIsInNlYXJjaFN1Z2dlc3Rpb25zSHRtbCIsInNlYXJjaEVudHJ5UG9pbnQiLCJyZW5kZXJlZENvbnRlbnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLHFCQUFxQixRQUFPLHdCQUF3QjtBQUM1RCxTQUFRQyw4QkFBOEIsRUFBRUMsOEJBQThCLFFBQU8sK0JBQStCO0FBQzVHLFNBQVFELDhCQUE4QixFQUFFQyw4QkFBOEIsUUFBTywrQkFBK0I7QUFDNUcsU0FBUUMsSUFBSSxRQUFPLG9CQUFvQjtBQUV2QyxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQXNFcEMsTUFBTUMsc0JBQXNCLENBQUNDO0lBQzNCLElBQUcsT0FBT0EsUUFBUUMsT0FBTyxLQUFLLFVBQVU7UUFDdEMsT0FBTyxDQUFDLENBQUNELFFBQVFDLE9BQU8sQ0FBQ0MsSUFBSTtJQUMvQjtJQUNBLE9BQU9DLE1BQU1DLE9BQU8sQ0FBQ0osUUFBUUMsT0FBTyxLQUFLRCxRQUFRQyxPQUFPLENBQUNJLE1BQU0sR0FBRyxLQUFLTCxRQUFRQyxPQUFPLENBQUNLLEtBQUssQ0FBQyxDQUFDQztRQUM1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
|
|
@@ -6,7 +6,7 @@ export declare const ensureConversationMessagingAllowed: (context: ApiContext, c
|
|
|
6
6
|
export declare const parseConversationOptions: (options?: ConversationOptions) => {
|
|
7
7
|
limit: ArangoDbLimit;
|
|
8
8
|
};
|
|
9
|
-
export declare const getConversationListByUser: (context: ApiContext, userId: string, options?:
|
|
9
|
+
export declare const getConversationListByUser: (context: ApiContext, userId: string, options?: ConversationOptions) => Promise<ConversationType[]>;
|
|
10
10
|
export declare const getDirectConversation: (context: ApiContext, { fromId, toId, toUser }: DirectConversationParams) => Promise<ConversationType>;
|
|
11
11
|
export declare const addDirectConversation: (context: ApiContext, { fromId, toId, toUser }: DirectConversationParams) => Promise<ConversationType>;
|
|
12
12
|
export declare const getConnectionUserList: (context: ApiContext, { conversationId, includeAll, isDirect }: ConversationUsersParams) => Promise<ConnectionType[]>;
|