@modelprofile.com/flexharness-providers 7.0.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts_openai_account/smartai.providers.interfaces.d.ts +20 -2
- package/dist_ts_openai_account/smartai.providers.openai.d.ts +3 -3
- package/dist_ts_openai_account/smartai.providers.openai.js +61 -17
- package/dist_ts_openai_auth/interfaces.d.ts +4 -0
- package/dist_ts_openai_auth/smartai.auth.openai.d.ts +5 -1
- package/dist_ts_openai_auth/smartai.auth.openai.js +66 -12
- package/package.json +2 -2
- package/ts_openai_account/readme.md +52 -0
- package/ts_openai_account/smartai.providers.interfaces.ts +25 -2
- package/ts_openai_account/smartai.providers.openai.ts +73 -17
- package/ts_openai_auth/interfaces.ts +5 -1
- package/ts_openai_auth/readme.md +12 -0
- package/ts_openai_auth/smartai.auth.openai.ts +82 -12
|
@@ -22,11 +22,15 @@ const utf8ByteLength = (valueArg) => textEncoder.encode(valueArg).byteLength;
|
|
|
22
22
|
export class OpenAiChatGptAuthError extends Error {
|
|
23
23
|
status;
|
|
24
24
|
body;
|
|
25
|
+
requestOutcome;
|
|
26
|
+
retryAfterMs;
|
|
25
27
|
constructor(message, options = {}) {
|
|
26
28
|
super(message);
|
|
27
29
|
this.name = 'OpenAiChatGptAuthError';
|
|
28
30
|
this.status = options.status;
|
|
29
31
|
this.body = options.body;
|
|
32
|
+
this.requestOutcome = options.requestOutcome;
|
|
33
|
+
this.retryAfterMs = options.retryAfterMs;
|
|
30
34
|
}
|
|
31
35
|
}
|
|
32
36
|
function getFetch(options) {
|
|
@@ -148,10 +152,27 @@ async function readJson(response, context, options) {
|
|
|
148
152
|
: `${context} returned invalid JSON: ${error.message}`, options, { status: response.status, body });
|
|
149
153
|
}
|
|
150
154
|
}
|
|
155
|
+
const parseRetryAfterMs = (headerArg) => {
|
|
156
|
+
if (!headerArg || headerArg.length > 128)
|
|
157
|
+
return undefined;
|
|
158
|
+
const maximumDelayMs = 24 * 60 * 60 * 1000;
|
|
159
|
+
if (/^\d{1,10}$/.test(headerArg)) {
|
|
160
|
+
return Math.min(Number(headerArg) * 1000, maximumDelayMs);
|
|
161
|
+
}
|
|
162
|
+
const retryAt = Date.parse(headerArg);
|
|
163
|
+
if (!Number.isFinite(retryAt))
|
|
164
|
+
return undefined;
|
|
165
|
+
return Math.min(Math.max(0, retryAt - Date.now()), maximumDelayMs);
|
|
166
|
+
};
|
|
151
167
|
async function runFetch(url, init, options, responseHandlerArg, timeoutMsArg = AUTH_REQUEST_TIMEOUT_MS) {
|
|
152
|
-
|
|
168
|
+
if (options.signal?.aborted) {
|
|
169
|
+
throw new OpenAiChatGptAuthError('OpenAI ChatGPT authentication was aborted.', {
|
|
170
|
+
requestOutcome: 'notSent',
|
|
171
|
+
});
|
|
172
|
+
}
|
|
153
173
|
const controller = new AbortController();
|
|
154
174
|
let response;
|
|
175
|
+
let requestStarted = false;
|
|
155
176
|
const onExternalAbort = () => controller.abort();
|
|
156
177
|
const onRequestAbort = () => {
|
|
157
178
|
void response?.body?.cancel().catch(() => undefined);
|
|
@@ -170,7 +191,9 @@ async function runFetch(url, init, options, responseHandlerArg, timeoutMsArg = A
|
|
|
170
191
|
try {
|
|
171
192
|
return await Promise.race([
|
|
172
193
|
(async () => {
|
|
173
|
-
|
|
194
|
+
const fetchImplementation = getFetch(options);
|
|
195
|
+
requestStarted = true;
|
|
196
|
+
response = await fetchImplementation(url, {
|
|
174
197
|
...init,
|
|
175
198
|
redirect: 'error',
|
|
176
199
|
signal: controller.signal,
|
|
@@ -185,13 +208,28 @@ async function runFetch(url, init, options, responseHandlerArg, timeoutMsArg = A
|
|
|
185
208
|
]);
|
|
186
209
|
}
|
|
187
210
|
catch (error) {
|
|
188
|
-
|
|
189
|
-
|
|
211
|
+
const requestOutcome = requestStarted
|
|
212
|
+
? 'outcomeUnknown'
|
|
213
|
+
: 'notSent';
|
|
214
|
+
const retryAfterMs = response ? parseRetryAfterMs(response.headers.get('retry-after')) : undefined;
|
|
215
|
+
if (error instanceof OpenAiChatGptAuthError) {
|
|
216
|
+
throw new OpenAiChatGptAuthError(error.message, {
|
|
217
|
+
...(error.status !== undefined ? { status: error.status }
|
|
218
|
+
: response ? { status: response.status } : {}),
|
|
219
|
+
...(error.body !== undefined ? { body: error.body } : {}),
|
|
220
|
+
requestOutcome,
|
|
221
|
+
...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
190
224
|
if (!usesSafeErrors(options))
|
|
191
225
|
throw error;
|
|
192
|
-
throw
|
|
226
|
+
throw new OpenAiChatGptAuthError(options.signal?.aborted
|
|
193
227
|
? 'OpenAI ChatGPT authentication was aborted.'
|
|
194
|
-
: 'OpenAI ChatGPT authentication request failed.',
|
|
228
|
+
: 'OpenAI ChatGPT authentication request failed.', {
|
|
229
|
+
requestOutcome,
|
|
230
|
+
...(response ? { status: response.status } : {}),
|
|
231
|
+
...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
|
|
232
|
+
});
|
|
195
233
|
}
|
|
196
234
|
finally {
|
|
197
235
|
clearTimeout(timer);
|
|
@@ -281,7 +319,9 @@ export function parseOpenAiChatGptTokenInfo(token) {
|
|
|
281
319
|
chatgptUserId: asOptionalString(auth?.chatgpt_user_id) ?? asOptionalString(auth?.user_id),
|
|
282
320
|
chatgptAccountId: asOptionalString(auth?.chatgpt_account_id),
|
|
283
321
|
chatgptAccountIsFedramp: auth?.chatgpt_account_is_fedramp === true,
|
|
284
|
-
expiresAt: expiresAtSeconds
|
|
322
|
+
expiresAt: expiresAtSeconds !== undefined
|
|
323
|
+
? new Date(expiresAtSeconds * 1000).toISOString()
|
|
324
|
+
: undefined,
|
|
285
325
|
rawJwt: token,
|
|
286
326
|
};
|
|
287
327
|
}
|
|
@@ -577,14 +617,28 @@ export async function revokeOpenAiChatGptToken(token, options) {
|
|
|
577
617
|
});
|
|
578
618
|
}
|
|
579
619
|
export function createOpenAiChatGptProviderSettings(credentials) {
|
|
580
|
-
const
|
|
620
|
+
const currentTokenInfo = parseOpenAiChatGptTokenInfo(credentials.accessToken);
|
|
621
|
+
if (currentTokenInfo.expiresAt === undefined
|
|
622
|
+
|| Date.parse(currentTokenInfo.expiresAt) <= Date.now()) {
|
|
623
|
+
throw new OpenAiChatGptAuthError('OpenAI ChatGPT access token has no valid future expiry.');
|
|
624
|
+
}
|
|
625
|
+
const tokenAccountId = currentTokenInfo.chatgptAccountId;
|
|
581
626
|
if (credentials.accountId !== undefined
|
|
582
|
-
&& tokenAccountId !== undefined
|
|
583
627
|
&& credentials.accountId !== tokenAccountId) {
|
|
584
628
|
throw new OpenAiChatGptAuthError('OpenAI ChatGPT account ID does not match the token claim.');
|
|
585
629
|
}
|
|
586
|
-
|
|
587
|
-
|
|
630
|
+
if (credentials.tokenInfo !== undefined
|
|
631
|
+
&& (credentials.tokenInfo.chatgptAccountId !== tokenAccountId
|
|
632
|
+
|| credentials.tokenInfo.chatgptAccountIsFedramp !== currentTokenInfo.chatgptAccountIsFedramp)) {
|
|
633
|
+
throw new OpenAiChatGptAuthError('OpenAI ChatGPT token information does not match the current access token.');
|
|
634
|
+
}
|
|
635
|
+
if (credentials.isFedrampAccount !== undefined
|
|
636
|
+
&& (typeof credentials.isFedrampAccount !== 'boolean'
|
|
637
|
+
|| credentials.isFedrampAccount !== currentTokenInfo.chatgptAccountIsFedramp)) {
|
|
638
|
+
throw new OpenAiChatGptAuthError('OpenAI ChatGPT FedRAMP status does not match the token claim.');
|
|
639
|
+
}
|
|
640
|
+
const accountId = tokenAccountId;
|
|
641
|
+
const isFedrampAccount = currentTokenInfo.chatgptAccountIsFedramp;
|
|
588
642
|
const headers = {
|
|
589
643
|
originator: credentials.originator ?? OPENAI_CHATGPT_DEFAULT_ORIGINATOR,
|
|
590
644
|
};
|
|
@@ -600,4 +654,4 @@ export function createOpenAiChatGptProviderSettings(credentials) {
|
|
|
600
654
|
headers,
|
|
601
655
|
};
|
|
602
656
|
}
|
|
603
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5hdXRoLm9wZW5haS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX29wZW5haV9hdXRoL3NtYXJ0YWkuYXV0aC5vcGVuYWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLHlCQUF5QixDQUFDO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLDhCQUE4QixDQUFDO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLHVDQUF1QyxDQUFDO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLFNBQVMsQ0FBQztBQUUzRCxNQUFNLHNCQUFzQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzlDLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDdkMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ25ELE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbEMscUNBQXFDO0lBQ3JDLHFDQUFxQztDQUN0QyxDQUFDLENBQUM7QUFDSCxNQUFNLFlBQVksR0FBRywrRUFBK0UsQ0FBQztBQUNyRyxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUV0QyxNQUFNLGNBQWMsR0FBRyxDQUFDLFVBQXFDLEVBQVcsRUFBRSxDQUN4RSxVQUFVLENBQUMsVUFBVSxLQUFLLEtBQUss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
|
|
657
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5hdXRoLm9wZW5haS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX29wZW5haV9hdXRoL3NtYXJ0YWkuYXV0aC5vcGVuYWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0JBLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLHlCQUF5QixDQUFDO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLDhCQUE4QixDQUFDO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLHVDQUF1QyxDQUFDO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLFNBQVMsQ0FBQztBQUUzRCxNQUFNLHNCQUFzQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzlDLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDdkMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ25ELE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbEMscUNBQXFDO0lBQ3JDLHFDQUFxQztDQUN0QyxDQUFDLENBQUM7QUFDSCxNQUFNLFlBQVksR0FBRywrRUFBK0UsQ0FBQztBQUNyRyxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUV0QyxNQUFNLGNBQWMsR0FBRyxDQUFDLFVBQXFDLEVBQVcsRUFBRSxDQUN4RSxVQUFVLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQztBQUNsQyxNQUFNLGNBQWMsR0FBRyxDQUFDLFFBQWdCLEVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDO0FBRTdGLE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxLQUFLO0lBQ3hDLE1BQU0sQ0FBVTtJQUNoQixJQUFJLENBQVU7SUFDZCxjQUFjLENBQWdDO0lBQzlDLFlBQVksQ0FBVTtJQUU3QixZQUFZLE9BQWUsRUFBRSxVQUt6QixFQUFFO1FBQ0osS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyx3QkFBd0IsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM3QyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBY0QsU0FBUyxRQUFRLENBQUMsT0FBa0M7SUFDbEQsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQ3hELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksc0JBQXNCLENBQUMsMkRBQTJELENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBQ0QsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUNoQixPQUFlLEVBQ2YsT0FBa0MsRUFDbEMsVUFBOEMsRUFBRTtJQUVoRCxPQUFPLElBQUksc0JBQXNCLENBQy9CLE9BQU8sRUFDUCxjQUFjLENBQUMsT0FBTyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUN6RSxDQUFDLENBQUMsT0FBTyxDQUNaLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsT0FBa0M7SUFDeEQsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sU0FBUyxDQUFDLDRDQUE0QyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pFLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxTQUFTO0lBQ2hCLE9BQU8sMEJBQTBCLENBQUM7QUFDcEMsQ0FBQztBQUVELFNBQVMsV0FBVztJQUNsQixPQUFPLHdCQUF3QixDQUFDO0FBQ2xDLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FDZixLQUFjLEVBQ2QsSUFBWSxFQUNaLFVBQXFDLEVBQUUsRUFDdkMsWUFBWSxHQUFHLHlCQUF5QjtJQUV4QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BELE1BQU0sU0FBUyxDQUFDLDJDQUEyQyxJQUFJLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQ3BFLE1BQU0sU0FBUyxDQUFDLG9EQUFvRCxJQUFJLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FDdkIsS0FBYyxFQUNkLFVBQXFDLEVBQUUsRUFDdkMsWUFBWSxHQUFHLHlCQUF5QjtJQUV4QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN0RSxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDcEUsTUFBTSxTQUFTLENBQUMsNERBQTRELEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBYyxFQUFFLFVBQXFDLEVBQUU7SUFDaEYsTUFBTSxRQUFRLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQy9GLE1BQU0sU0FBUyxDQUFDLDhEQUE4RCxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsS0FBSyxVQUFVLGdCQUFnQixDQUM3QixRQUFrQixFQUNsQixPQUFrQztJQUVsQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDN0QsSUFDRSxhQUFhLEtBQUssSUFBSTtXQUNuQixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsdUJBQXVCLENBQUMsRUFDcEYsQ0FBQztRQUNELE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckQsTUFBTSxTQUFTLENBQUMsdURBQXVELEVBQUUsT0FBTyxFQUFFO1lBQ2hGLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtTQUN4QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDOUIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN6QyxNQUFNLE1BQU0sR0FBaUIsRUFBRSxDQUFDO0lBQ2hDLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNuQixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDdEIsTUFBTSxPQUFPLEdBQUcsR0FBUyxFQUFFO1FBQ3pCLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUM7SUFDRixPQUFPLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNuRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3ZDLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEIsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEIsSUFBSSxJQUFJO2dCQUFFLE1BQU07WUFDaEIsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDL0IsSUFBSSxVQUFVLEdBQUcsdUJBQXVCLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM3QyxNQUFNLFNBQVMsQ0FBQyx1REFBdUQsRUFBRSxPQUFPLEVBQUU7b0JBQ2hGLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtpQkFDeEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUNELFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztZQUFTLENBQUM7UUFDVCxPQUFPLENBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsU0FBUztZQUFFLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDN0IsQ0FBQztJQUNELE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELEtBQUssVUFBVSxRQUFRLENBQ3JCLFFBQWtCLEVBQ2xCLE9BQWUsRUFDZixPQUFrQztJQUVsQyxNQUFNLElBQUksR0FBRyxNQUFNLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sU0FBUyxDQUFDLEdBQUcsT0FBTyx1QkFBdUIsUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLE9BQU8sRUFBRTtZQUM1RSxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsSUFBSTtTQUNMLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxTQUFTLENBQ2IsY0FBYyxDQUFDLE9BQU8sQ0FBQztZQUNyQixDQUFDLENBQUMsR0FBRyxPQUFPLHlCQUF5QjtZQUNyQyxDQUFDLENBQUMsR0FBRyxPQUFPLDJCQUE0QixLQUFlLENBQUMsT0FBTyxFQUFFLEVBQ25FLE9BQU8sRUFDUCxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUNsQyxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLGlCQUFpQixHQUFHLENBQUMsU0FBd0IsRUFBc0IsRUFBRTtJQUN6RSxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsR0FBRztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzNELE1BQU0sY0FBYyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztJQUMzQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ3JFLENBQUMsQ0FBQztBQUVGLEtBQUssVUFBVSxRQUFRLENBQ3JCLEdBQVcsRUFDWCxJQUFpQixFQUNqQixPQUFrQyxFQUNsQyxrQkFHcUIsRUFDckIsWUFBWSxHQUFHLHVCQUF1QjtJQUV0QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLHNCQUFzQixDQUFDLDRDQUE0QyxFQUFFO1lBQzdFLGNBQWMsRUFBRSxTQUFTO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3pDLElBQUksUUFBOEIsQ0FBQztJQUNuQyxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDM0IsTUFBTSxlQUFlLEdBQUcsR0FBUyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZELE1BQU0sY0FBYyxHQUFHLEdBQVMsRUFBRTtRQUNoQyxLQUFLLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQztJQUNGLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLElBQUksYUFBMEIsQ0FBQztJQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUN0RCxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUMsQ0FBQztRQUMxRixVQUFVLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDLENBQUMsQ0FBQztJQUNILFVBQVUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPO1FBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO0lBQ3BHLE1BQU0sY0FBYyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNqRSxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQztZQUN4QixDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNWLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM5QyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixRQUFRLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxHQUFHLEVBQUU7b0JBQ3hDLEdBQUcsSUFBSTtvQkFDUCxRQUFRLEVBQUUsT0FBTztvQkFDakIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO2lCQUMxQixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUM5QixNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN2RCxDQUFDO2dCQUNELGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDL0IsT0FBTyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLEVBQUU7WUFDSixPQUFPO1NBQ1IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLGNBQWMsR0FBaUMsY0FBYztZQUNqRSxDQUFDLENBQUMsZ0JBQWdCO1lBQ2xCLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNuRyxJQUFJLEtBQUssWUFBWSxzQkFBc0IsRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO2dCQUM5QyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUU7b0JBQ3ZELENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNoRCxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN6RCxjQUFjO2dCQUNkLEdBQUcsQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDeEQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQUUsTUFBTSxLQUFLLENBQUM7UUFDMUMsTUFBTSxJQUFJLHNCQUFzQixDQUM5QixPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU87WUFDckIsQ0FBQyxDQUFDLDRDQUE0QztZQUM5QyxDQUFDLENBQUMsK0NBQStDLEVBQ25EO1lBQ0UsY0FBYztZQUNkLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hELEdBQUcsQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDeEQsQ0FDRixDQUFDO0lBQ0osQ0FBQztZQUFTLENBQUM7UUFDVCxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEIsT0FBTyxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDOUQsVUFBVSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDOUQsVUFBVSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDakUsQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsUUFBUSxDQUNyQixHQUFXLEVBQ1gsSUFBYSxFQUNiLE9BQWtDO0lBRWxDLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNuQixNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtRQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7S0FDM0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsR0FBRyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUMvRixDQUFDO0FBRUQsS0FBSyxVQUFVLFFBQVEsQ0FDckIsR0FBVyxFQUNYLElBQXFCLEVBQ3JCLE9BQWtDO0lBRWxDLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNuQixNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxtQ0FBbUMsRUFBRTtRQUNoRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtLQUN0QixFQUFFLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0FBQy9GLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxFQUFVO0lBQ3ZCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsS0FBSyxVQUFVLGNBQWMsQ0FDM0IsWUFBb0IsRUFDcEIsT0FBNEM7SUFFNUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxhQUF1QyxDQUFDO1FBQzVDLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDakIsT0FBTyxDQUFDLEtBQU0sQ0FBQyxZQUFZLENBQUM7Z0JBQzVCLElBQUksT0FBTyxDQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFO29CQUN0QyxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyw0Q0FBNEMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUMvRixPQUFPLENBQUMsTUFBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDM0UsQ0FBQyxDQUFDO2FBQ0gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxhQUFhO2dCQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFDRCxPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDMUMsTUFBTSxPQUFPLEdBQUcsR0FBUyxFQUFFO1lBQ3pCLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQixPQUFPLENBQUMsTUFBTyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN0RCxNQUFNLENBQUMsU0FBUyxDQUFDLDRDQUE0QyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUM1QixPQUFPLENBQUMsTUFBTyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN0RCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqQixPQUFPLENBQUMsTUFBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNuRSxJQUFJLE9BQU8sQ0FBQyxNQUFPLENBQUMsT0FBTztZQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEdBQVc7SUFDbEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLHNCQUFzQixDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQTRCLENBQUM7SUFDMUUsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksc0JBQXNCLENBQUMsNkNBQThDLEtBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzVHLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEtBQWE7SUFDdkQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBd0MsQ0FBQztJQUNoRyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQXdDLENBQUM7SUFDMUYsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFakYsT0FBTztRQUNMLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQztRQUN6RSxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDO1FBQzFELGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztRQUN6RixnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLENBQUM7UUFDNUQsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLDBCQUEwQixLQUFLLElBQUk7UUFDbEUsU0FBUyxFQUFFLGdCQUFnQixLQUFLLFNBQVM7WUFDdkMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRTtZQUNqRCxDQUFDLENBQUMsU0FBUztRQUNiLE1BQU0sRUFBRSxLQUFLO0tBQ2QsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FDdEIsUUFBcUMsRUFDckMsaUJBQTJDLEVBQzNDLFVBQXFDLEVBQUU7SUFFdkMsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsb0JBQW9CLENBQUM7V0FDckYsaUJBQWlCLEVBQUUsV0FBVyxDQUFDO0lBQ3BDLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixDQUFDO1dBQ3ZGLGlCQUFpQixFQUFFLFlBQVksQ0FBQztJQUNyQyxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQztXQUM3RSxpQkFBaUIsRUFBRSxPQUFPLENBQUM7SUFDaEMsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM1QixLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3pELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztnQkFDeEUsTUFBTSxTQUFTLENBQUMsa0RBQWtELEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0UsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sU0FBUyxDQUFDLHVEQUF1RCxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsTUFBTSxTQUFTLENBQUMsd0RBQXdELEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUNELElBQUksU0FBa0MsQ0FBQztJQUN2QyxJQUFJLENBQUM7UUFDSCxTQUFTLEdBQUcsMkJBQTJCLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7WUFBRSxNQUFNLEtBQUssQ0FBQztRQUMxQyxNQUFNLFNBQVMsQ0FBQyxnREFBZ0QsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsT0FBTztRQUNMLFdBQVc7UUFDWCxZQUFZO1FBQ1osT0FBTztRQUNQLFNBQVMsRUFBRSxTQUFTLENBQUMsZ0JBQWdCO1FBQ3JDLFNBQVM7S0FDVixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsOEJBQThCLENBQ2xELFVBQXFDLEVBQUU7SUFFdkMsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDM0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsR0FBRyxNQUFNLG1DQUFtQyxFQUFFO1FBQzVFLFNBQVMsRUFBRSxXQUFXLEVBQUU7S0FDekIsRUFBRSxPQUFPLENBQTRCLENBQUM7SUFFdkMsT0FBTztRQUNMLGVBQWUsRUFBRSxHQUFHLE1BQU0sZUFBZTtRQUN6QyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDO1FBQ2pGLFlBQVksRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUM7UUFDMUUsZUFBZSxFQUFFLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO0tBQy9ELENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSwyQkFBMkIsQ0FDL0MsVUFBb0MsRUFDcEMsVUFBK0MsRUFBRTtJQUVqRCxNQUFNLE1BQU0sR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUMzQixNQUFNLE9BQU8sR0FBRyxHQUFHLE1BQU0sZ0NBQWdDLENBQUM7SUFDMUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxzQkFBc0IsQ0FBQztJQUM5RCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxzQkFBc0IsRUFBRSxDQUFDO1FBQzVGLE1BQU0sU0FBUyxDQUFDLGdEQUFnRCxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFDRCxJQUNFLGNBQWMsQ0FBQyxPQUFPLENBQUM7V0FDcEIsQ0FDRCxjQUFjLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLHlCQUF5QjtlQUNoRSxjQUFjLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLHlCQUF5QjtlQUMvRCxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztlQUNqRCxVQUFVLENBQUMsZUFBZSxHQUFHLENBQUM7ZUFDOUIsVUFBVSxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQ3BDLEVBQ0QsQ0FBQztRQUNELE1BQU0sU0FBUyxDQUFDLDhDQUE4QyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFN0IsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sc0JBQXNCLEdBQUcsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sVUFBVSxHQUFHLE1BQU0sUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUN6QyxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtZQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbkIsY0FBYyxFQUFFLFVBQVUsQ0FBQyxZQUFZO2dCQUN2QyxTQUFTLEVBQUUsVUFBVSxDQUFDLFFBQVE7YUFDL0IsQ0FBQztTQUNILEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLEVBQUU7WUFDN0MsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hCLE9BQU87b0JBQ0wsTUFBTSxFQUFFLFVBQW1CO29CQUMzQixJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsT0FBTyxFQUFFLEVBQUUsY0FBYyxDQUE0QjtpQkFDN0YsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3ZELE1BQU0sSUFBSSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLFNBQVMsQ0FBQyx5REFBeUQsUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLGNBQWMsRUFBRTtvQkFDM0csTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO29CQUN2QixJQUFJO2lCQUNMLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxNQUFNLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQWtCLEVBQUUsQ0FBQztRQUN4QyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXhDLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNyQyxPQUFPO2dCQUNMLGlCQUFpQixFQUFFLFFBQVEsQ0FDekIsVUFBVSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFDbEMsb0JBQW9CLEVBQ3BCLE9BQU8sRUFDUCxpQ0FBaUMsQ0FDbEM7Z0JBQ0QsYUFBYSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUM7Z0JBQ2xGLFlBQVksRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQzthQUNoRixDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUN2RCxNQUFNLGNBQWMsQ0FDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsZUFBZSxHQUFHLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUNuRSxPQUFPLENBQ1IsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFNBQVMsQ0FBQyw2Q0FBNkMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxzQ0FBc0MsQ0FDMUQsaUJBQWtELEVBQ2xELFVBQXFDLEVBQUU7SUFFdkMsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDM0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsR0FBRyxNQUFNLGNBQWMsRUFBRSxJQUFJLGVBQWUsQ0FBQztRQUMzRSxVQUFVLEVBQUUsb0JBQW9CO1FBQ2hDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUI7UUFDekMsWUFBWSxFQUFFLEdBQUcsTUFBTSxzQkFBc0I7UUFDN0MsU0FBUyxFQUFFLFdBQVcsRUFBRTtRQUN4QixhQUFhLEVBQUUsaUJBQWlCLENBQUMsWUFBWTtLQUM5QyxDQUFDLEVBQUUsT0FBTyxDQUFnQyxDQUFDO0lBRTVDLE9BQU8sZUFBZSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sVUFBVSxtQ0FBbUMsQ0FDakQsU0FBa0MsRUFDbEMsd0JBQWlDO0lBRWpDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQzlCLE9BQU87SUFDVCxDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLGdCQUFnQixLQUFLLHdCQUF3QixFQUFFLENBQUM7UUFDdEUsTUFBTSxJQUFJLHNCQUFzQixDQUFDLG1EQUFtRCx3QkFBd0IsR0FBRyxDQUFDLENBQUM7SUFDbkgsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLG9DQUFvQyxDQUN4RCxVQUFvQyxFQUNwQyxVQUFtRCxFQUFFO0lBRXJELE1BQU0saUJBQWlCLEdBQUcsTUFBTSwyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakYsTUFBTSxTQUFTLEdBQUcsTUFBTSxzQ0FBc0MsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzRixtQ0FBbUMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDakYsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsNkJBQTZCLENBQ2pELFNBQWtDLEVBQ2xDLFVBQXFDLEVBQUU7SUFFdkMsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDM0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsR0FBRyxNQUFNLGNBQWMsRUFBRTtRQUN2RCxTQUFTLEVBQUUsV0FBVyxFQUFFO1FBQ3hCLFVBQVUsRUFBRSxlQUFlO1FBQzNCLGFBQWEsRUFBRSxTQUFTLENBQUMsWUFBWTtLQUN0QyxFQUFFLE9BQU8sQ0FBZ0MsQ0FBQztJQUUzQyxPQUFPLGVBQWUsQ0FBQztRQUNyQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsT0FBTztRQUNoRCxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUMsV0FBVztRQUM1RCxhQUFhLEVBQUUsUUFBUSxDQUFDLGFBQWEsSUFBSSxTQUFTLENBQUMsWUFBWTtLQUNoRSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSx5QkFBeUIsR0FBRyxDQUNoQyxXQUFtQixFQUNuQixPQUFrQyxFQUMxQixFQUFFO0lBQ1YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sU0FBUyxDQUFDLHdEQUF3RCxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFDRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixNQUFNLHFCQUFxQixHQUFHLENBQzVCLEtBQWEsRUFDYixLQUFhLEVBQ2IsWUFBb0IsRUFDcEIsWUFBb0IsRUFDWixFQUFFO0lBQ1YsSUFDRSxPQUFPLEtBQUssS0FBSyxRQUFRO1dBQ3RCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztXQUM3QixLQUFLLENBQUMsTUFBTSxHQUFHLFlBQVk7V0FDM0IsS0FBSyxDQUFDLE1BQU0sR0FBRyxZQUFZLEVBQzlCLENBQUM7UUFDRCxNQUFNLElBQUksc0JBQXNCLENBQUMsa0JBQWtCLEtBQUssY0FBYyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFvQixFQUFVLEVBQUU7SUFDdkQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEtBQUssTUFBTSxJQUFJLElBQUksUUFBUTtRQUFFLE1BQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2pGLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUNBQXVDLENBQzNELE9BQWtEO0lBRWxELE1BQU0sTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO0lBQzNCLE1BQU0sV0FBVyxHQUFHLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUNwQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sU0FBUyxDQUFDLG1FQUFtRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFDRCxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEYsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxJQUFJLFVBQVUsQ0FDbEQsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUMzRSxDQUFDLENBQUM7SUFDSCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLGlDQUFpQyxDQUFDO0lBQzNFLElBQ0UsY0FBYyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUc7V0FDN0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQ3hDLENBQUM7UUFDRCxNQUFNLFNBQVMsQ0FBQywrQ0FBK0MsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsbUJBQW1CLElBQUksRUFBRSxDQUFDO0lBQzlELElBQ0UsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1dBQ2hDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxFQUFFO1dBQy9CLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FDbEMsT0FBTyxFQUFFLEtBQUssUUFBUTtlQUNuQixFQUFFLENBQUMsTUFBTSxLQUFLLENBQUM7ZUFDZixjQUFjLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRztlQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUNwQixDQUFDLEVBQ0YsQ0FBQztRQUNELE1BQU0sU0FBUyxDQUFDLG1EQUFtRCxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLE1BQU0sa0JBQWtCLENBQUMsQ0FBQztJQUNyRCxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDckQsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNoRCxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMxRCxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxRCxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvRCxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5RCxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ25ELElBQUksbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFDRCxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUN0RCxNQUFNLFNBQVMsQ0FBQyx3REFBd0QsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFDckUsQ0FBQztBQUVELE1BQU0sVUFBVSxpQ0FBaUMsQ0FDL0MsV0FBbUIsRUFDbkIsT0FBNkM7SUFFN0MsSUFDRSxPQUFPLFdBQVcsS0FBSyxRQUFRO1dBQzVCLGNBQWMsQ0FBQyxXQUFXLENBQUMsR0FBRyxrQkFBa0IsRUFDbkQsQ0FBQztRQUNELE1BQU0sSUFBSSxzQkFBc0IsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFDRCxNQUFNLG1CQUFtQixHQUFHLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2RixNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0YsSUFBSSxNQUFXLENBQUM7SUFDaEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxNQUFNLElBQUksc0JBQXNCLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNqRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyRixNQUFNLElBQUksc0JBQXNCLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUN6RixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDN0UsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3QyxJQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7V0FDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1dBQ3pDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsTUFBTSxFQUNyQyxDQUFDO1FBQ0QsTUFBTSxJQUFJLHNCQUFzQixDQUFDLHlEQUF5RCxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLElBQUksS0FBSyxLQUFLLGFBQWEsRUFBRSxDQUFDO1FBQzVCLE1BQU0sSUFBSSxzQkFBc0IsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFDRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RCxJQUFJLGFBQWEsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDbkQsTUFBTSxJQUFJLHNCQUFzQixDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxRCxJQUNFLENBQUMsaUJBQWlCO1dBQ2YsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsaUNBQWlDLEVBQ3hFLENBQUM7UUFDRCxNQUFNLElBQUksc0JBQXNCLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUN6RixDQUFDO0lBQ0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsNkNBQTZDLENBQ2pFLGlCQUF5QixFQUN6QixPQUE2QztJQUU3QyxNQUFNLE1BQU0sR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUMzQixNQUFNLFdBQVcsR0FBRyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVFLElBQ0UsT0FBTyxpQkFBaUIsS0FBSyxRQUFRO1dBQ2xDLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDO1dBQzlCLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLGlDQUFpQyxFQUN4RSxDQUFDO1FBQ0QsTUFBTSxTQUFTLENBQUMsdURBQXVELEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzRixNQUFNLFFBQVEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxHQUFHLE1BQU0sY0FBYyxFQUFFLElBQUksZUFBZSxDQUFDO1FBQzNFLFVBQVUsRUFBRSxvQkFBb0I7UUFDaEMsSUFBSSxFQUFFLGlCQUFpQjtRQUN2QixZQUFZLEVBQUUsV0FBVztRQUN6QixTQUFTLEVBQUUsV0FBVyxFQUFFO1FBQ3hCLGFBQWEsRUFBRSxZQUFZO0tBQzVCLENBQUMsRUFBRSxPQUFPLENBQWdDLENBQUM7SUFDNUMsT0FBTyxlQUFlLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FDNUMsS0FBYSxFQUNiLE9BQW9DO0lBRXBDLElBQ0UsT0FBTyxLQUFLLEtBQUssUUFBUTtXQUN0QixLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7V0FDbEIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLG9CQUFvQixDQUFDLEVBQzVFLENBQUM7UUFDRCxNQUFNLFNBQVMsQ0FBQyx5Q0FBeUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDM0IsTUFBTSxRQUFRLENBQUMsR0FBRyxNQUFNLGVBQWUsRUFBRTtRQUN2QyxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtRQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNuQixLQUFLO1lBQ0wsZUFBZSxFQUFFLE9BQU8sQ0FBQyxhQUFhO1lBQ3RDLFNBQVMsRUFBRSxXQUFXLEVBQUU7U0FDekIsQ0FBQztLQUNILEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLEVBQUU7UUFDN0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixNQUFNLFNBQVMsQ0FBQyxRQUFRLE1BQU0sb0NBQW9DLFFBQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxjQUFjLEVBQUU7Z0JBQ3BHLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtnQkFDdkIsSUFBSTthQUNMLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsbUNBQW1DLENBQUMsV0FBMEM7SUFLNUYsTUFBTSxnQkFBZ0IsR0FBRywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUUsSUFDRSxnQkFBZ0IsQ0FBQyxTQUFTLEtBQUssU0FBUztXQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFDdkQsQ0FBQztRQUNELE1BQU0sSUFBSSxzQkFBc0IsQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFDRCxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN6RCxJQUNFLFdBQVcsQ0FBQyxTQUFTLEtBQUssU0FBUztXQUNoQyxXQUFXLENBQUMsU0FBUyxLQUFLLGNBQWMsRUFDM0MsQ0FBQztRQUNELE1BQU0sSUFBSSxzQkFBc0IsQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFDRCxJQUNFLFdBQVcsQ0FBQyxTQUFTLEtBQUssU0FBUztXQUNoQyxDQUNELFdBQVcsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEtBQUssY0FBYztlQUN0RCxXQUFXLENBQUMsU0FBUyxDQUFDLHVCQUF1QixLQUFLLGdCQUFnQixDQUFDLHVCQUF1QixDQUM5RixFQUNELENBQUM7UUFDRCxNQUFNLElBQUksc0JBQXNCLENBQUMsMkVBQTJFLENBQUMsQ0FBQztJQUNoSCxDQUFDO0lBQ0QsSUFDRSxXQUFXLENBQUMsZ0JBQWdCLEtBQUssU0FBUztXQUN2QyxDQUNELE9BQU8sV0FBVyxDQUFDLGdCQUFnQixLQUFLLFNBQVM7ZUFDOUMsV0FBVyxDQUFDLGdCQUFnQixLQUFLLGdCQUFnQixDQUFDLHVCQUF1QixDQUM3RSxFQUNELENBQUM7UUFDRCxNQUFNLElBQUksc0JBQXNCLENBQUMsK0RBQStELENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDO0lBQ2pDLE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUM7SUFDbEUsTUFBTSxPQUFPLEdBQTJCO1FBQ3RDLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVSxJQUFJLGlDQUFpQztLQUN4RSxDQUFDO0lBRUYsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUN2QyxDQUFDO0lBRUQsT0FBTztRQUNMLE1BQU0sRUFBRSxXQUFXLENBQUMsV0FBVztRQUMvQixPQUFPLEVBQUUsNkJBQTZCO1FBQ3RDLE9BQU87S0FDUixDQUFDO0FBQ0osQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"author": "Task Venture Capital GmbH",
|
|
3
3
|
"license": "MIT",
|
|
4
4
|
"name": "@modelprofile.com/flexharness-providers",
|
|
5
|
-
"version": "
|
|
5
|
+
"version": "8.0.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"description": "Model providers, authentication, account management, media and research integrations in one package.",
|
|
8
8
|
"main": "./dist_ts_providers/index.js",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"@ai-sdk/provider": "^4.0.8",
|
|
76
76
|
"@ai-sdk/xai": "^4.0.44",
|
|
77
77
|
"@anthropic-ai/sdk": "0.95.2",
|
|
78
|
-
"@modelprofile.com/flexharness-models": "
|
|
78
|
+
"@modelprofile.com/flexharness-models": "8.0.0",
|
|
79
79
|
"ai": "^7.0.79",
|
|
80
80
|
"openai": "^6.37.0",
|
|
81
81
|
"proper-lockfile": "^4.1.2"
|
|
@@ -11,6 +11,58 @@ pnpm add @modelprofile.com/flexharness-providers
|
|
|
11
11
|
See the [toolbox usage and migration guide](https://code.foss.global/modelprofile.com/flexharness#readme)
|
|
12
12
|
for composition examples and the SmartAI/SmartAgent migration map.
|
|
13
13
|
|
|
14
|
+
## Authority-managed access
|
|
15
|
+
|
|
16
|
+
`OpenAiProviderAdapter.listModels()` and `getAccountRateLimits()` accept an
|
|
17
|
+
`IOpenAiChatGptAccessCredential` resolved by a separate account authority:
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import {
|
|
21
|
+
OpenAiProviderAdapter,
|
|
22
|
+
type IOpenAiChatGptAccessCredential,
|
|
23
|
+
} from '@modelprofile.com/flexharness-providers/accounts';
|
|
24
|
+
|
|
25
|
+
async function readAccount(grant: {
|
|
26
|
+
accessToken: string;
|
|
27
|
+
accountId: string;
|
|
28
|
+
isFedrampAccount: boolean;
|
|
29
|
+
}) {
|
|
30
|
+
const adapter = new OpenAiProviderAdapter();
|
|
31
|
+
const access: IOpenAiChatGptAccessCredential = {
|
|
32
|
+
kind: 'chatgptAccess',
|
|
33
|
+
providerId: 'openai',
|
|
34
|
+
accessToken: grant.accessToken,
|
|
35
|
+
accountId: grant.accountId,
|
|
36
|
+
isFedrampAccount: grant.isFedrampAccount,
|
|
37
|
+
};
|
|
38
|
+
try {
|
|
39
|
+
return {
|
|
40
|
+
models: await adapter.listModels(access),
|
|
41
|
+
usage: await adapter.getAccountRateLimits(access),
|
|
42
|
+
};
|
|
43
|
+
} finally {
|
|
44
|
+
await adapter.dispose();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The authority verifies the account ID and FedRAMP flag against the current token,
|
|
50
|
+
owns refresh, and supplies a fresh access grant before each operation. A rejected
|
|
51
|
+
token returns `CREDENTIAL_REFRESH_REQUIRED` to the caller; the adapter does not
|
|
52
|
+
refresh it. Access-only grants cannot be serialized as provider credential
|
|
53
|
+
envelopes. Login, refresh and logout still require the full OAuth credential.
|
|
54
|
+
|
|
55
|
+
For inference, `createOpenAiChatGptModelConnection()` from `/auth` accepts
|
|
56
|
+
`{ accessToken, accountId, isFedrampAccount }` without a refresh token.
|
|
57
|
+
|
|
58
|
+
`refreshCredential()` failures report `requestOutcome: 'notSent'` only when the
|
|
59
|
+
call was rejected before a fetch invocation. All failures after a fetch invocation,
|
|
60
|
+
including HTTP 429, timeout, and a malformed successful response, report
|
|
61
|
+
`outcomeUnknown`: the provider might have rotated the refresh token. A failure
|
|
62
|
+
may also contain a numeric `responseStatus` and a bounded `retryAfterMs` from an
|
|
63
|
+
observed HTTP response. These are scheduling facts, not permission to replay
|
|
64
|
+
the old refresh token. Provider response bodies are never returned in this API.
|
|
65
|
+
|
|
14
66
|
## Issue Reporting and Security
|
|
15
67
|
|
|
16
68
|
Report issues and security concerns through [community.foss.global](https://community.foss.global).
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { TOpenAiChatGptRequestOutcome } from '@modelprofile.com/flexharness-providers/auth';
|
|
2
|
+
|
|
1
3
|
export type TSmartAiProviderId = string;
|
|
2
4
|
export type TSmartAiProviderLoginFlow = 'browser' | 'device';
|
|
3
5
|
export type TSmartAiProviderInputModality = 'text' | 'image' | 'audio';
|
|
@@ -24,6 +26,21 @@ export interface IOpenAiChatGptOAuthCredential {
|
|
|
24
26
|
lastRefreshAt?: string;
|
|
25
27
|
}
|
|
26
28
|
|
|
29
|
+
/** A short-lived, authority-resolved access grant for read and inference operations. */
|
|
30
|
+
export interface IOpenAiChatGptAccessCredential {
|
|
31
|
+
kind: 'chatgptAccess';
|
|
32
|
+
providerId: 'openai';
|
|
33
|
+
accessToken: string;
|
|
34
|
+
/** The verified ChatGPT workspace/account ID, not an email address. */
|
|
35
|
+
accountId: string;
|
|
36
|
+
isFedrampAccount: boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Access grants are deliberately excluded from stored provider credential envelopes. */
|
|
40
|
+
export type TOpenAiChatGptReadCredential =
|
|
41
|
+
| IOpenAiChatGptOAuthCredential
|
|
42
|
+
| IOpenAiChatGptAccessCredential;
|
|
43
|
+
|
|
27
44
|
export type TSmartAiProviderCredential =
|
|
28
45
|
| ISmartAiProviderApiKeyCredential
|
|
29
46
|
| IOpenAiChatGptOAuthCredential;
|
|
@@ -117,6 +134,12 @@ export interface ISmartAiProviderRefreshFailure {
|
|
|
117
134
|
success: false;
|
|
118
135
|
credential: IOpenAiChatGptOAuthCredential;
|
|
119
136
|
errorCode: TSmartAiProviderCredentialOperationErrorCode | 'REFRESH_FAILED';
|
|
137
|
+
/** Never replay a rotating grant when this is outcomeUnknown. */
|
|
138
|
+
requestOutcome: TOpenAiChatGptRequestOutcome;
|
|
139
|
+
/** The response status, when an HTTP response was observed. */
|
|
140
|
+
responseStatus?: number;
|
|
141
|
+
/** Bounded Retry-After delay from the observed response. */
|
|
142
|
+
retryAfterMs?: number;
|
|
120
143
|
}
|
|
121
144
|
|
|
122
145
|
export type TSmartAiProviderRefreshResult =
|
|
@@ -201,11 +224,11 @@ export interface ISmartAiProviderAdapter {
|
|
|
201
224
|
options?: ISmartAiProviderOperationOptions,
|
|
202
225
|
): Promise<TSmartAiProviderRefreshResult>;
|
|
203
226
|
listModels(
|
|
204
|
-
credential:
|
|
227
|
+
credential: TOpenAiChatGptReadCredential,
|
|
205
228
|
options?: ISmartAiProviderModelListOptions,
|
|
206
229
|
): Promise<TSmartAiProviderModelListResult>;
|
|
207
230
|
getAccountRateLimits(
|
|
208
|
-
credential:
|
|
231
|
+
credential: TOpenAiChatGptReadCredential,
|
|
209
232
|
options?: ISmartAiProviderOperationOptions,
|
|
210
233
|
): Promise<TSmartAiProviderAccountRateLimitsResult>;
|
|
211
234
|
logoutCredential(
|
|
@@ -3,6 +3,7 @@ import * as plugins from './plugins.js';
|
|
|
3
3
|
import {
|
|
4
4
|
OPENAI_CHATGPT_CODEX_BASE_URL,
|
|
5
5
|
OPENAI_CHATGPT_DEFAULT_ORIGINATOR,
|
|
6
|
+
OpenAiChatGptAuthError,
|
|
6
7
|
completeOpenAiChatGptDeviceCodeLogin,
|
|
7
8
|
createOpenAiChatGptBrowserAuthorization,
|
|
8
9
|
exchangeOpenAiChatGptBrowserAuthorizationCode,
|
|
@@ -29,6 +30,7 @@ import type {
|
|
|
29
30
|
ISmartAiProviderOperationOptions,
|
|
30
31
|
ISmartAiProviderRateLimitDetails,
|
|
31
32
|
ISmartAiProviderRateLimitWindow,
|
|
33
|
+
TOpenAiChatGptReadCredential,
|
|
32
34
|
TSmartAiProviderCancelStatus,
|
|
33
35
|
TSmartAiProviderAccountRateLimitsResult,
|
|
34
36
|
TSmartAiProviderCredential,
|
|
@@ -183,6 +185,46 @@ const toTokenData = (credentialArg: IOpenAiChatGptOAuthCredential): IOpenAiChatG
|
|
|
183
185
|
};
|
|
184
186
|
};
|
|
185
187
|
|
|
188
|
+
interface IOpenAiChatGptReadAccess {
|
|
189
|
+
accessToken: string;
|
|
190
|
+
accountId?: string;
|
|
191
|
+
isFedrampAccount: boolean;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const toReadAccess = (
|
|
195
|
+
credentialArg: TOpenAiChatGptReadCredential,
|
|
196
|
+
): IOpenAiChatGptReadAccess => {
|
|
197
|
+
if (!isRecord(credentialArg)) throw createSmartAiProviderError('CREDENTIAL_INVALID');
|
|
198
|
+
if (credentialArg.kind === 'chatgptOAuth') {
|
|
199
|
+
const tokenData = toTokenData(credentialArg);
|
|
200
|
+
return {
|
|
201
|
+
accessToken: tokenData.accessToken,
|
|
202
|
+
accountId: tokenData.tokenInfo.chatgptAccountId,
|
|
203
|
+
isFedrampAccount: tokenData.tokenInfo.chatgptAccountIsFedramp,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
const access = credentialArg;
|
|
207
|
+
if (
|
|
208
|
+
access.kind !== 'chatgptAccess'
|
|
209
|
+
|| access.providerId !== 'openai'
|
|
210
|
+
|| typeof access.accessToken !== 'string'
|
|
211
|
+
|| access.accessToken.length === 0
|
|
212
|
+
|| plugins.Buffer.byteLength(access.accessToken, 'utf8') > maximumHeaderBytes
|
|
213
|
+
|| typeof access.accountId !== 'string'
|
|
214
|
+
|| access.accountId.length === 0
|
|
215
|
+
|| plugins.Buffer.byteLength(access.accountId, 'utf8') > maximumHeaderBytes
|
|
216
|
+
|| typeof access.isFedrampAccount !== 'boolean'
|
|
217
|
+
|| Object.keys(access).length !== 5
|
|
218
|
+
) {
|
|
219
|
+
throw createSmartAiProviderError('CREDENTIAL_INVALID');
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
accessToken: access.accessToken,
|
|
223
|
+
accountId: access.accountId,
|
|
224
|
+
isFedrampAccount: access.isFedrampAccount,
|
|
225
|
+
};
|
|
226
|
+
};
|
|
227
|
+
|
|
186
228
|
const toCredential = (
|
|
187
229
|
tokenDataArg: IOpenAiChatGptTokenData,
|
|
188
230
|
lastRefreshAtArg?: string,
|
|
@@ -849,6 +891,7 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
|
|
|
849
891
|
success: false,
|
|
850
892
|
credential: credentialArg,
|
|
851
893
|
errorCode: waitOperation.timedOut ? 'TIMEOUT' : 'ABORTED',
|
|
894
|
+
requestOutcome: 'notSent',
|
|
852
895
|
};
|
|
853
896
|
waitOperation.cleanup();
|
|
854
897
|
return failure;
|
|
@@ -888,6 +931,7 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
|
|
|
888
931
|
success: false,
|
|
889
932
|
credential: credentialArg,
|
|
890
933
|
errorCode: waitOperation.timedOut ? 'TIMEOUT' : 'ABORTED',
|
|
934
|
+
requestOutcome: 'outcomeUnknown',
|
|
891
935
|
});
|
|
892
936
|
waitOperation.signal.addEventListener('abort', onAbort, { once: true });
|
|
893
937
|
});
|
|
@@ -914,7 +958,12 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
|
|
|
914
958
|
const tokenChanged = refreshed.accessToken !== input.accessToken
|
|
915
959
|
|| refreshed.refreshToken !== input.refreshToken;
|
|
916
960
|
if (!tokenChanged || !refreshed.idToken) {
|
|
917
|
-
return {
|
|
961
|
+
return {
|
|
962
|
+
success: false,
|
|
963
|
+
credential: credentialArg,
|
|
964
|
+
errorCode: 'REFRESH_FAILED',
|
|
965
|
+
requestOutcome: 'outcomeUnknown',
|
|
966
|
+
};
|
|
918
967
|
}
|
|
919
968
|
const previous = credentialArg.lastRefreshAt === undefined
|
|
920
969
|
? 0
|
|
@@ -929,6 +978,15 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
|
|
|
929
978
|
success: false,
|
|
930
979
|
credential: credentialArg,
|
|
931
980
|
errorCode: classifyOperationError(errorArg, operation, 'REFRESH_FAILED'),
|
|
981
|
+
requestOutcome: errorArg instanceof OpenAiChatGptAuthError
|
|
982
|
+
? errorArg.requestOutcome ?? 'outcomeUnknown'
|
|
983
|
+
: 'outcomeUnknown',
|
|
984
|
+
...(errorArg instanceof OpenAiChatGptAuthError && errorArg.status !== undefined
|
|
985
|
+
? { responseStatus: errorArg.status }
|
|
986
|
+
: {}),
|
|
987
|
+
...(errorArg instanceof OpenAiChatGptAuthError && errorArg.retryAfterMs !== undefined
|
|
988
|
+
? { retryAfterMs: errorArg.retryAfterMs }
|
|
989
|
+
: {}),
|
|
932
990
|
};
|
|
933
991
|
} finally {
|
|
934
992
|
this.operations.delete(operation.controller);
|
|
@@ -937,11 +995,10 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
|
|
|
937
995
|
}
|
|
938
996
|
|
|
939
997
|
private async fetchCatalog(
|
|
940
|
-
|
|
998
|
+
accessArg: IOpenAiChatGptReadAccess,
|
|
941
999
|
signalArg: AbortSignal,
|
|
942
1000
|
): Promise<ISmartAiProviderModel[]> {
|
|
943
|
-
const
|
|
944
|
-
const accountId = tokenData.tokenInfo.chatgptAccountId;
|
|
1001
|
+
const accountId = accessArg.accountId;
|
|
945
1002
|
const url = `${OPENAI_CHATGPT_CODEX_BASE_URL}/models?client_version=${encodeURIComponent(defaultClientVersion)}`;
|
|
946
1003
|
let response: Response;
|
|
947
1004
|
let onAbort!: () => void;
|
|
@@ -952,9 +1009,9 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
|
|
|
952
1009
|
signal: signalArg,
|
|
953
1010
|
headers: {
|
|
954
1011
|
Accept: 'application/json',
|
|
955
|
-
Authorization: `Bearer ${
|
|
1012
|
+
Authorization: `Bearer ${accessArg.accessToken}`,
|
|
956
1013
|
...(accountId ? { 'ChatGPT-Account-ID': accountId } : {}),
|
|
957
|
-
...(
|
|
1014
|
+
...(accessArg.isFedrampAccount ? { 'X-OpenAI-Fedramp': 'true' } : {}),
|
|
958
1015
|
originator: this.originator,
|
|
959
1016
|
version: defaultClientVersion,
|
|
960
1017
|
},
|
|
@@ -1023,18 +1080,18 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
|
|
|
1023
1080
|
}
|
|
1024
1081
|
|
|
1025
1082
|
public async listModels(
|
|
1026
|
-
credentialArg:
|
|
1083
|
+
credentialArg: TOpenAiChatGptReadCredential,
|
|
1027
1084
|
optionsArg: ISmartAiProviderModelListOptions = {},
|
|
1028
1085
|
): Promise<TSmartAiProviderModelListResult> {
|
|
1029
1086
|
this.requireOpen();
|
|
1030
|
-
|
|
1087
|
+
const access = toReadAccess(credentialArg);
|
|
1031
1088
|
const options = normalizeModelListOptions(optionsArg);
|
|
1032
1089
|
const operation = createOperation(options, defaultOperationTimeoutMs);
|
|
1033
1090
|
this.operations.add(operation.controller);
|
|
1034
1091
|
try {
|
|
1035
1092
|
let catalog: ISmartAiProviderModel[];
|
|
1036
1093
|
try {
|
|
1037
|
-
catalog = await this.fetchCatalog(
|
|
1094
|
+
catalog = await this.fetchCatalog(access, operation.signal);
|
|
1038
1095
|
} catch (errorArg) {
|
|
1039
1096
|
if (!(errorArg instanceof ModelHttpError) || errorArg.status !== 401) throw errorArg;
|
|
1040
1097
|
return { success: false, errorCode: 'CREDENTIAL_REFRESH_REQUIRED' };
|
|
@@ -1084,11 +1141,10 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
|
|
|
1084
1141
|
}
|
|
1085
1142
|
|
|
1086
1143
|
private async fetchAccountRateLimits(
|
|
1087
|
-
|
|
1144
|
+
accessArg: IOpenAiChatGptReadAccess,
|
|
1088
1145
|
signalArg: AbortSignal,
|
|
1089
1146
|
): Promise<ISmartAiProviderAccountRateLimits> {
|
|
1090
|
-
const
|
|
1091
|
-
const accountId = tokenData.tokenInfo.chatgptAccountId;
|
|
1147
|
+
const accountId = accessArg.accountId;
|
|
1092
1148
|
let response: Response;
|
|
1093
1149
|
let onAbort!: () => void;
|
|
1094
1150
|
try {
|
|
@@ -1098,9 +1154,9 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
|
|
|
1098
1154
|
signal: signalArg,
|
|
1099
1155
|
headers: {
|
|
1100
1156
|
Accept: 'application/json',
|
|
1101
|
-
Authorization: `Bearer ${
|
|
1157
|
+
Authorization: `Bearer ${accessArg.accessToken}`,
|
|
1102
1158
|
...(accountId ? { 'ChatGPT-Account-Id': accountId } : {}),
|
|
1103
|
-
...(
|
|
1159
|
+
...(accessArg.isFedrampAccount ? { 'X-OpenAI-Fedramp': 'true' } : {}),
|
|
1104
1160
|
'User-Agent': this.originator,
|
|
1105
1161
|
},
|
|
1106
1162
|
});
|
|
@@ -1130,16 +1186,16 @@ export class OpenAiProviderAdapter implements ISmartAiProviderAdapter {
|
|
|
1130
1186
|
}
|
|
1131
1187
|
|
|
1132
1188
|
public async getAccountRateLimits(
|
|
1133
|
-
credentialArg:
|
|
1189
|
+
credentialArg: TOpenAiChatGptReadCredential,
|
|
1134
1190
|
optionsArg: ISmartAiProviderOperationOptions = {},
|
|
1135
1191
|
): Promise<TSmartAiProviderAccountRateLimitsResult> {
|
|
1136
1192
|
this.requireOpen();
|
|
1137
|
-
|
|
1193
|
+
const access = toReadAccess(credentialArg);
|
|
1138
1194
|
const operation = createOperation(optionsArg, defaultOperationTimeoutMs);
|
|
1139
1195
|
this.operations.add(operation.controller);
|
|
1140
1196
|
try {
|
|
1141
1197
|
try {
|
|
1142
|
-
const rateLimits = await this.fetchAccountRateLimits(
|
|
1198
|
+
const rateLimits = await this.fetchAccountRateLimits(access, operation.signal);
|
|
1143
1199
|
return { success: true, rateLimits };
|
|
1144
1200
|
} catch (errorArg) {
|
|
1145
1201
|
if (!(errorArg instanceof AccountRateLimitsHttpError) || errorArg.status !== 401) {
|
|
@@ -13,6 +13,8 @@ export interface IOpenAiChatGptAuthCredentials {
|
|
|
13
13
|
refreshToken?: string;
|
|
14
14
|
idToken?: string;
|
|
15
15
|
accountId?: string;
|
|
16
|
+
/** Verified from the current access token when tokenInfo is not supplied. */
|
|
17
|
+
isFedrampAccount?: boolean;
|
|
16
18
|
tokenInfo?: IOpenAiChatGptTokenInfo;
|
|
17
19
|
originator?: string;
|
|
18
20
|
}
|
|
@@ -37,6 +39,9 @@ export interface IOpenAiChatGptAuthOptions {
|
|
|
37
39
|
safeErrors?: boolean;
|
|
38
40
|
}
|
|
39
41
|
|
|
42
|
+
/** A failed refresh is replayable only when no request was handed to fetch. */
|
|
43
|
+
export type TOpenAiChatGptRequestOutcome = 'notSent' | 'outcomeUnknown';
|
|
44
|
+
|
|
40
45
|
export interface IOpenAiChatGptBrowserAuthorizationOptions extends IOpenAiChatGptAuthOptions {
|
|
41
46
|
redirectUri: string;
|
|
42
47
|
originator?: string;
|
|
@@ -86,4 +91,3 @@ export interface IOpenAiChatGptDeviceCodePollOptions extends IOpenAiChatGptAuthO
|
|
|
86
91
|
export interface IOpenAiChatGptCompleteDeviceCodeOptions extends IOpenAiChatGptDeviceCodePollOptions {
|
|
87
92
|
forcedChatGptWorkspaceId?: string;
|
|
88
93
|
}
|
|
89
|
-
|