agl 40.4.0 → 40.5.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/changelog.md +27 -0
- package/dist_serve/bundle.js +2228 -2177
- package/dist_serve/bundle.js.map +2 -2
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/aglapi/aglapisurface.document.js +2 -2
- package/dist_ts/classes.accountsactions.d.ts +11 -1
- package/dist_ts/classes.accountsactions.js +59 -2
- package/dist_ts/classes.controller.js +5 -5
- package/dist_ts/classes.flexaccountaccess.js +3 -2
- package/dist_ts/classes.harnessreleases.d.ts +14 -4
- package/dist_ts/classes.harnessreleases.js +28 -4
- package/dist_ts/classes.inferencegateway.d.ts +28 -3
- package/dist_ts/classes.inferencegateway.js +177 -61
- package/dist_ts/classes.inferenceplacement.d.ts +5 -3
- package/dist_ts/classes.inferenceplacement.js +2 -2
- package/dist_ts/classes.inferencerouter.d.ts +349 -91
- package/dist_ts/classes.inferencerouter.js +804 -297
- package/dist_ts/classes.inferenceservice.d.ts +14 -2
- package/dist_ts/classes.inferenceservice.js +53 -14
- package/dist_ts/classes.inferencespend.d.ts +339 -0
- package/dist_ts/classes.inferencespend.js +815 -0
- package/dist_ts/classes.inferenceusagecache.d.ts +8 -0
- package/dist_ts/classes.inferenceusagecache.js +9 -5
- package/dist_ts/classes.inferenceusagetap.d.ts +50 -9
- package/dist_ts/classes.inferenceusagetap.js +185 -31
- package/dist_ts/classes.proxycontrol.d.ts +3 -2
- package/dist_ts/classes.proxycontrol.js +1 -2
- package/dist_ts/classes.proxydaemon.js +3 -2
- package/dist_ts/classes.proxystore.d.ts +6 -0
- package/dist_ts/classes.proxystore.js +11 -2
- package/dist_ts/fleet/classes.claudeworkers.d.ts +5 -4
- package/dist_ts/fleet/classes.claudeworkers.js +10 -9
- package/dist_ts/functions.claudecoderelease.d.ts +12 -6
- package/dist_ts/functions.claudecoderelease.js +13 -7
- package/dist_ts/functions.inferencecli.js +12 -8
- package/dist_ts/interfaces.auth.d.ts +1 -1
- package/dist_ts/interfaces.auth.js +3 -1
- package/dist_ts/plugins.d.ts +3 -1
- package/dist_ts/plugins.js +7 -2
- package/dist_ts_authswitch/authority-apikeys.d.ts +32 -0
- package/dist_ts_authswitch/authority-apikeys.js +65 -0
- package/dist_ts_authswitch/authority-contract.d.ts +142 -28
- package/dist_ts_authswitch/authority-contract.js +48 -1
- package/dist_ts_authswitch/authority-overview.js +8 -1
- package/dist_ts_authswitch/authority-placement.d.ts +7 -2
- package/dist_ts_authswitch/authority-placement.js +10 -3
- package/dist_ts_authswitch/authority-runtime-contract.d.ts +2 -2
- package/dist_ts_authswitch/authority-spend.d.ts +103 -0
- package/dist_ts_authswitch/authority-spend.js +110 -0
- package/dist_ts_authswitch/authority-subscription.d.ts +12 -1
- package/dist_ts_authswitch/authority-subscription.js +24 -1
- package/dist_ts_authswitch/authority-usagelimit.d.ts +7 -4
- package/dist_ts_authswitch/authority-usagelimit.js +89 -39
- package/dist_ts_authswitch/authority-usagewindows.d.ts +4 -1
- package/dist_ts_authswitch/authority-usagewindows.js +41 -16
- package/dist_ts_authswitch/classes.authoritybroker.d.ts +30 -19
- package/dist_ts_authswitch/classes.authoritybroker.js +152 -61
- package/dist_ts_authswitch/classes.authoritycli.d.ts +9 -4
- package/dist_ts_authswitch/classes.authoritycli.js +94 -29
- package/dist_ts_authswitch/classes.authorityclient.d.ts +24 -7
- package/dist_ts_authswitch/classes.authorityclient.js +31 -11
- package/dist_ts_authswitch/classes.authoritydaemon.js +39 -12
- package/dist_ts_authswitch/classes.authoritydatabase.d.ts +28 -5
- package/dist_ts_authswitch/classes.authoritydatabase.js +171 -9
- package/dist_ts_authswitch/classes.authorityimport.js +2 -2
- package/dist_ts_authswitch/classes.authoritymodels.d.ts +71 -3
- package/dist_ts_authswitch/classes.authoritymodels.js +249 -20
- package/dist_ts_authswitch/classes.authorityregistry.js +4 -2
- package/dist_ts_authswitch/classes.authorityusage.d.ts +69 -7
- package/dist_ts_authswitch/classes.authorityusage.js +118 -4
- package/dist_ts_authswitch/classes.claudenative.d.ts +16 -7
- package/dist_ts_authswitch/classes.claudenative.js +29 -16
- package/dist_ts_authswitch/classes.claudesignin.js +5 -2
- package/dist_ts_authswitch/testsupport.d.ts +24 -5
- package/dist_ts_authswitch/testsupport.js +56 -12
- package/dist_ts_authswitch/ts_migration/0011_account_api_key_fields.d.ts +12 -0
- package/dist_ts_authswitch/ts_migration/0011_account_api_key_fields.js +21 -0
- package/dist_ts_authswitch/ts_migration/index.js +3 -1
- package/dist_ts_interfaces/functions.authorityscope.d.ts +18 -7
- package/dist_ts_interfaces/functions.authorityscope.js +35 -8
- package/dist_ts_interfaces/interfaces.d.ts +1 -1
- package/dist_ts_interfaces/interfaces.js +1 -1
- package/dist_ts_interfaces/plugins.d.ts +2 -1
- package/dist_ts_interfaces/plugins.js +7 -4
- package/dist_ts_interfaces/requests.accounts.d.ts +56 -0
- package/dist_ts_interfaces/requests.accounts.js +11 -1
- package/dist_ts_interfaces/requests.d.ts +2 -2
- package/dist_ts_interfaces/requests.js +1 -1
- package/docs/authswitch.md +75 -12
- package/package.json +5 -5
- package/readme.md +198 -21
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/aglapi/aglapisurface.document.ts +2 -2
- package/ts/classes.accountsactions.ts +75 -1
- package/ts/classes.controller.ts +4 -4
- package/ts/classes.flexaccountaccess.ts +2 -1
- package/ts/classes.harnessreleases.ts +25 -4
- package/ts/classes.inferencegateway.ts +184 -64
- package/ts/classes.inferenceplacement.ts +6 -4
- package/ts/classes.inferencerouter.ts +1026 -314
- package/ts/classes.inferenceservice.ts +56 -13
- package/ts/classes.inferencespend.ts +870 -0
- package/ts/classes.inferenceusagecache.ts +16 -4
- package/ts/classes.inferenceusagetap.ts +159 -34
- package/ts/classes.proxycontrol.ts +3 -3
- package/ts/classes.proxydaemon.ts +2 -1
- package/ts/classes.proxystore.ts +11 -1
- package/ts/fleet/classes.claudeworkers.ts +9 -8
- package/ts/functions.claudecoderelease.ts +13 -6
- package/ts/functions.inferencecli.ts +11 -7
- package/ts/interfaces.auth.ts +2 -0
- package/ts/plugins.ts +7 -0
- package/ts_authswitch/authority-apikeys.ts +85 -0
- package/ts_authswitch/authority-contract.ts +167 -29
- package/ts_authswitch/authority-overview.ts +7 -0
- package/ts_authswitch/authority-placement.ts +12 -4
- package/ts_authswitch/authority-runtime-contract.ts +2 -2
- package/ts_authswitch/authority-spend.ts +168 -0
- package/ts_authswitch/authority-subscription.ts +28 -1
- package/ts_authswitch/authority-usagelimit.ts +95 -40
- package/ts_authswitch/authority-usagewindows.ts +42 -17
- package/ts_authswitch/classes.authoritybroker.ts +161 -68
- package/ts_authswitch/classes.authoritycli.ts +108 -32
- package/ts_authswitch/classes.authorityclient.ts +41 -10
- package/ts_authswitch/classes.authoritydaemon.ts +43 -13
- package/ts_authswitch/classes.authoritydatabase.ts +178 -8
- package/ts_authswitch/classes.authorityimport.ts +1 -1
- package/ts_authswitch/classes.authoritymodels.ts +165 -19
- package/ts_authswitch/classes.authorityregistry.ts +3 -0
- package/ts_authswitch/classes.authorityusage.ts +171 -10
- package/ts_authswitch/classes.claudenative.ts +28 -15
- package/ts_authswitch/classes.claudesignin.ts +4 -1
- package/ts_authswitch/native-contracts.md +81 -20
- package/ts_authswitch/readme.md +1 -1
- package/ts_authswitch/testsupport.ts +58 -11
- package/ts_authswitch/ts_migration/0011_account_api_key_fields.ts +20 -0
- package/ts_authswitch/ts_migration/index.ts +2 -0
- package/ts_interfaces/functions.authorityscope.ts +43 -8
- package/ts_interfaces/interfaces.ts +1 -1
- package/ts_interfaces/plugins.ts +6 -3
- package/ts_interfaces/requests.accounts.ts +48 -0
- package/ts_interfaces/requests.ts +4 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/accounts.plugins.ts +3 -1
- package/ts_web/accounts.templates.ts +20 -11
- package/ts_web/classes.accountsreadmodel.ts +322 -70
- package/ts_web/elements.accounts.ts +219 -20
- package/ts_web/elements.codexconnections.ts +3 -1
- package/ts_web/plugins.ts +4 -2
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { ITypedRequest } from '@api.global/typedrequest-interfaces';
|
|
2
|
-
import type { IAuthSwitchUsageRecheck, IAuthSwitchUsageSnapshot } from './classes.authorityusage.js';
|
|
2
|
+
import type { IAuthSwitchUsageRecheck, IAuthSwitchUsageSnapshot, TAuthSwitchPaymentProblemCause } from './classes.authorityusage.js';
|
|
3
3
|
import type { IAuthSwitchCodexAppServerDetail, TAuthSwitchCodexAppServerRestart } from './authority-import-contract.js';
|
|
4
|
-
export type { IAuthSwitchPaymentProblem, IAuthSwitchUsageRecheck, IAuthSwitchUsageSnapshot, TAuthSwitchRecheckOutcome } from './classes.authorityusage.js';
|
|
4
|
+
export type { IAuthSwitchPaymentProblem, IAuthSwitchUsageRecheck, IAuthSwitchUsageSnapshot, TAuthSwitchPaymentProblemCause, TAuthSwitchRecheckOutcome } from './classes.authorityusage.js';
|
|
5
5
|
import type { TAuthSwitchUsageObservation } from './authority-usageheaders.js';
|
|
6
6
|
export type { TAuthSwitchUsageObservation } from './authority-usageheaders.js';
|
|
7
7
|
import type { IAuthSwitchTokenUsage } from './authority-usagetokens.js';
|
|
8
8
|
export type { IAuthSwitchTokenUsage } from './authority-usagetokens.js';
|
|
9
|
+
export type { IAuthSwitchSpendPeriod, IAuthSwitchSpendReading } from './authority-spend.js';
|
|
9
10
|
/**
|
|
10
11
|
* Why the authority declined, as a closed set a client branches on without reading the text.
|
|
11
12
|
*
|
|
@@ -73,8 +74,9 @@ export type TAuthSwitchRefusalCode = 'authority_closing' | 'not_found' | 'accoun
|
|
|
73
74
|
*/
|
|
74
75
|
| 'claude_home_unreadable'
|
|
75
76
|
/**
|
|
76
|
-
*
|
|
77
|
-
*
|
|
77
|
+
* The provider of the API key offered for an account -- Anthropic or OpenAI -- rejected it (401), accepted it without
|
|
78
|
+
* letting it read the model list (OpenAI's 403, a restricted key), or could not be asked: nothing was stored, and the
|
|
79
|
+
* instruction says which of the three it was and what to do, never repeating the provider's words.
|
|
78
80
|
*/
|
|
79
81
|
| 'api_key_unverified';
|
|
80
82
|
/** The marker the importer has published since 8.1.0; it keeps its own value on the wire. */
|
|
@@ -115,6 +117,17 @@ export declare class AuthSwitchRefusal extends Error {
|
|
|
115
117
|
* refusal that release could answer with -- which is why it is read rather than treated as a fault.
|
|
116
118
|
*/
|
|
117
119
|
export declare const asAuthSwitchRefusal: (error: unknown) => IAuthSwitchRefusal | null;
|
|
120
|
+
/**
|
|
121
|
+
* The text the authority answers a malformed request with -- a member missing or unknown, a value of the wrong shape,
|
|
122
|
+
* a spend report naming an answer twice -- and no refusal beside it: the caller's own bug, never an instruction for an
|
|
123
|
+
* owner.
|
|
124
|
+
*/
|
|
125
|
+
export declare const authSwitchMalformedRequestText = "Invalid authswitch authority request.";
|
|
126
|
+
/**
|
|
127
|
+
* Whether an error answer is the authority's answer to a malformed request (`authSwitchMalformedRequestText`): its text
|
|
128
|
+
* alone, with no refusal marker. The same request is answered the same way every time it is sent.
|
|
129
|
+
*/
|
|
130
|
+
export declare const isAuthSwitchMalformedRequest: (error: unknown) => boolean;
|
|
118
131
|
/** The longest account label, in UTF-16 code units. */
|
|
119
132
|
export declare const authSwitchAccountLabelMaxLength = 128;
|
|
120
133
|
/**
|
|
@@ -123,6 +136,10 @@ export declare const authSwitchAccountLabelMaxLength = 128;
|
|
|
123
136
|
* restating it; the authority answers a label that breaks it with the `invalid_input` refusal.
|
|
124
137
|
*/
|
|
125
138
|
export declare const isAuthSwitchAccountLabel: (value: unknown) => value is string;
|
|
139
|
+
/** An API key account's `keyHint`: `…` and the key's last four characters, which tell keys apart and reveal nothing usable. */
|
|
140
|
+
export declare const authSwitchKeyHint: (apiKey: string) => string;
|
|
141
|
+
/** Whether a value is a key hint as `authSwitchKeyHint` makes one: `…` and four printable characters. */
|
|
142
|
+
export declare const isAuthSwitchKeyHint: (value: unknown) => value is string;
|
|
126
143
|
/** The range of an account's usage threshold, in whole percent of each counted usage window. */
|
|
127
144
|
export declare const authSwitchMaxUsageRange: Readonly<{
|
|
128
145
|
min: number;
|
|
@@ -144,7 +161,7 @@ export declare const isAuthSwitchMaxUsagePercent: (value: unknown) => value is n
|
|
|
144
161
|
*/
|
|
145
162
|
export declare const isAuthSwitchLapsesAt: (value: unknown) => value is string;
|
|
146
163
|
/** Credential-free account management contract. Safe to import in browser code. */
|
|
147
|
-
export type TAuthSwitchLoginPurpose = 'openai_managed' | 'claude_host_native' | 'claude_container_setup' | 'opencode_native' | 'anthropic_api_key';
|
|
164
|
+
export type TAuthSwitchLoginPurpose = 'openai_managed' | 'claude_host_native' | 'claude_container_setup' | 'opencode_native' | 'anthropic_api_key' | 'openai_api_key';
|
|
148
165
|
export type TAuthSwitchLoginHealth = 'ready' | 'refreshing' | 'retry_wait' | 'needs_reauth' | 'unverified' | 'pending_handoff' | 'handoff_quarantined' | 'removed';
|
|
149
166
|
export interface IAuthSwitchAccount {
|
|
150
167
|
id: string;
|
|
@@ -158,7 +175,7 @@ export interface IAuthSwitchAccount {
|
|
|
158
175
|
* - `anthropic`: the organization UUID, Claude Code's `oauthAccount.organizationUuid` and the `orgId` of
|
|
159
176
|
* `claude auth status --json`; for an account on an Anthropic API key, which names no organization, `api-key`.
|
|
160
177
|
* - `openai`: the ChatGPT account id (the `chatgpt_account_id` claim, a personal or team ChatGPT workspace),
|
|
161
|
-
* which is not an OpenAI API organization
|
|
178
|
+
* which is not an OpenAI API organization; for an account on an OpenAI API key, `api-key`.
|
|
162
179
|
*
|
|
163
180
|
* Every daemon from 10.3.0 on states it; an older daemon leaves it out.
|
|
164
181
|
*/
|
|
@@ -179,6 +196,17 @@ export interface IAuthSwitchAccount {
|
|
|
179
196
|
* request. Clearing the date makes it active again. See `authority-placement.ts`.
|
|
180
197
|
*/
|
|
181
198
|
lapsesAt: string | null;
|
|
199
|
+
/**
|
|
200
|
+
* An API key account's spend limit per calendar month in UTC, in micro-dollars (`isAuthSwitchSpendLimitMicroUsd`);
|
|
201
|
+
* `null` for none, and always for an account on a sign-in. The limit counts what AGL's inference proxy relayed on the
|
|
202
|
+
* key, nothing else: at it, the proxy places nothing more on the key until the month ends.
|
|
203
|
+
*/
|
|
204
|
+
spendLimitMicroUsd: number | null;
|
|
205
|
+
/**
|
|
206
|
+
* How an API key account's key ends, `…` and its last four characters, so the owner tells keys apart; `null` for an
|
|
207
|
+
* account on a sign-in, and for an Anthropic key the accounts service held before it kept hints.
|
|
208
|
+
*/
|
|
209
|
+
keyHint: string | null;
|
|
182
210
|
removed: boolean;
|
|
183
211
|
revision: number;
|
|
184
212
|
statusObservedAt: string;
|
|
@@ -220,8 +248,8 @@ export interface IAuthSwitchLogin {
|
|
|
220
248
|
* `canBind`: a bind of this login is accepted now, decided by the conditions the bind checks. That is a ready,
|
|
221
249
|
* daemon-held login an account that is not removed has selected, of the account's own provider: its ChatGPT login
|
|
222
250
|
* for every runtime; its Claude login, with a verified import receipt and while the daemon's Claude renewer
|
|
223
|
-
* runs, for the `gateway` runtime alone; or its Anthropic API key (`anthropic_api_key`),
|
|
224
|
-
* alone as well.
|
|
251
|
+
* runs, for the `gateway` runtime alone; or its Anthropic or OpenAI API key (`anthropic_api_key`, `openai_api_key`),
|
|
252
|
+
* for the `gateway` runtime alone as well.
|
|
225
253
|
*/
|
|
226
254
|
capabilities: {
|
|
227
255
|
canReauthenticate: boolean;
|
|
@@ -236,7 +264,7 @@ export interface IAuthSwitchBinding {
|
|
|
236
264
|
* The runtime a login backs. `flex`, `opencode`, `claude` and `gateway` bindings are held and released by their
|
|
237
265
|
* caller over the runtime socket; `codex` is the daemon's own managed Codex. A ChatGPT login backs every runtime;
|
|
238
266
|
* a Claude login backs `gateway` alone, AGL's inference proxy, which sends Claude Code's own requests to the
|
|
239
|
-
* account, and so does an Anthropic API key, on which the proxy
|
|
267
|
+
* account, and so does an Anthropic or OpenAI API key, on which the proxy relays requests at API prices. `gateway` bindings are preemptible: removing the account, switching this host's Codex to its login, or
|
|
240
268
|
* moving its Claude login into a container home releases them in the same transaction instead of refusing, so a
|
|
241
269
|
* login the authority hands to a native tool never has a second renewer.
|
|
242
270
|
*/
|
|
@@ -633,9 +661,11 @@ export interface IAuthSwitchPreuseOperation {
|
|
|
633
661
|
export type TAuthSwitchClaudeProofFailure = 'unsupported_release' | 'override' | 'profile' | 'profile_unreadable' | 'settings' | 'subscription' | 'running_session';
|
|
634
662
|
/**
|
|
635
663
|
* What a Claude sign-in shows the person signing in: a command to run in a terminal, and the private Claude home
|
|
636
|
-
* it signs in to. `command` is `claude auth login` with `CLAUDE_CONFIG_DIR`
|
|
637
|
-
* shell; a caller that starts Claude Code itself runs `claude` with
|
|
638
|
-
*
|
|
664
|
+
* it signs in to. `command` is `claude auth login` with `CLAUDE_CONFIG_DIR` and `CLAUDE_SECURESTORAGE_CONFIG_DIR` both
|
|
665
|
+
* set to `directory`, quoted for a POSIX shell; a caller that starts Claude Code itself runs `claude` with
|
|
666
|
+
* `authSwitchClaudeSignInArguments` and those two variables instead. The second keeps the credential store in the home:
|
|
667
|
+
* inherited, it would send the new login to another store. The directory is a local path of the authority's user,
|
|
668
|
+
* like a managed Codex socket path.
|
|
639
669
|
*/
|
|
640
670
|
export interface IAuthSwitchClaudeSignInPrompt {
|
|
641
671
|
flow: 'terminal';
|
|
@@ -1220,12 +1250,16 @@ export interface IReq_AuthSwitchObserveUsage extends ITypedRequest {
|
|
|
1220
1250
|
};
|
|
1221
1251
|
}
|
|
1222
1252
|
/**
|
|
1223
|
-
* Management-only:
|
|
1224
|
-
* `billing_error`)
|
|
1225
|
-
* (`IAuthSwitchPaymentProblem`)
|
|
1226
|
-
*
|
|
1227
|
-
*
|
|
1228
|
-
*
|
|
1253
|
+
* Management-only: the provider refused an inference request on the login for money at `observedAt`. On a Claude login
|
|
1254
|
+
* that is a billing error (HTTP 402, `billing_error`): the authority holds the login with the payment problem on its usage
|
|
1255
|
+
* record (`IAuthSwitchPaymentProblem`) until a usage read shows its subscription changed or a re-check reads it healthy.
|
|
1256
|
+
* On an API key's login `cause` names the refusal (`TAuthSwitchPaymentProblemCause`; absent means `billing`): the
|
|
1257
|
+
* authority holds the key with it, a `spend_cap` until 00:00 UTC on the first of the next month (`until`), any other
|
|
1258
|
+
* cause until a re-check. Either way it answers the held usage, which then carries the problem, and the proxy routes
|
|
1259
|
+
* nothing to the account while it is held. Refused (`login_unavailable`) for any other login, for a Claude login with
|
|
1260
|
+
* no usage record of its sign-in, and for a Claude login with a cause other than `billing`. The provider is not asked.
|
|
1261
|
+
* An authority of 40.2.0 or older does not know the method, and one of 40.3.0 refuses `cause` and every API key's
|
|
1262
|
+
* login; the proxy then holds the account out of rotation itself, for as long as it runs.
|
|
1229
1263
|
*/
|
|
1230
1264
|
export interface IReq_AuthSwitchReportPaymentProblem extends ITypedRequest {
|
|
1231
1265
|
method: 'authswitch.authority.usage.paymentProblem';
|
|
@@ -1233,6 +1267,59 @@ export interface IReq_AuthSwitchReportPaymentProblem extends ITypedRequest {
|
|
|
1233
1267
|
accountId: string;
|
|
1234
1268
|
loginId: string;
|
|
1235
1269
|
observedAt: string;
|
|
1270
|
+
cause?: TAuthSwitchPaymentProblemCause;
|
|
1271
|
+
};
|
|
1272
|
+
response: {
|
|
1273
|
+
usage: IAuthSwitchUsageSnapshot;
|
|
1274
|
+
};
|
|
1275
|
+
}
|
|
1276
|
+
/** Whether a value is a payment problem's cause (`TAuthSwitchPaymentProblemCause`). */
|
|
1277
|
+
export declare const isAuthSwitchPaymentProblemCause: (value: unknown) => value is TAuthSwitchPaymentProblemCause;
|
|
1278
|
+
/**
|
|
1279
|
+
* One answer AGL's inference proxy relayed on an API key, as it reports the answer's cost to the authority
|
|
1280
|
+
* (`authswitch.authority.usage.spend`). The proxy prices the answer once, by the model that answered and the service
|
|
1281
|
+
* tier the provider reported, and sends the same report until the authority acknowledged it.
|
|
1282
|
+
*/
|
|
1283
|
+
export interface IAuthSwitchSpendAnswer {
|
|
1284
|
+
/** The proxy's id of the answer, a UUID: the same on every send of it, and the answer's identity in the ledger. */
|
|
1285
|
+
answerId: string;
|
|
1286
|
+
/** When the answer ended, ISO 8601 UTC; its calendar month in UTC is the period its cost counts in. */
|
|
1287
|
+
endedAt: string;
|
|
1288
|
+
/** The model that answered, as the provider named it (`isAuthSwitchModelId`). */
|
|
1289
|
+
model: string;
|
|
1290
|
+
/** The service tier the provider reported for the answer; null when it reported none. */
|
|
1291
|
+
serviceTier: string | null;
|
|
1292
|
+
/**
|
|
1293
|
+
* What the answer cost, in whole micro-dollars (at most `authSwitchSpendAnswerMaxMicroUsd`); null when the proxy
|
|
1294
|
+
* could not price it. An unpriced answer stops a key with a spend limit until the month ends or the limit is removed.
|
|
1295
|
+
*/
|
|
1296
|
+
microUsd: number | null;
|
|
1297
|
+
/** The price entry the answer was priced by (its checked date); null exactly when `microUsd` is null. */
|
|
1298
|
+
priceSource: string | null;
|
|
1299
|
+
}
|
|
1300
|
+
/** The most answers one spend report carries. */
|
|
1301
|
+
export declare const authSwitchSpendAnswerBatchLimit = 64;
|
|
1302
|
+
/** The most one answer may cost, in micro-dollars: ten thousand dollars, far above any one answer's price. */
|
|
1303
|
+
export declare const authSwitchSpendAnswerMaxMicroUsd = 10000000000;
|
|
1304
|
+
/** Whether a value is one spend report answer as the authority accepts it: the check it applies to every answer. */
|
|
1305
|
+
export declare const isAuthSwitchSpendAnswer: (value: unknown) => value is IAuthSwitchSpendAnswer;
|
|
1306
|
+
/** Whether a value is a spend report's answers: one to `authSwitchSpendAnswerBatchLimit` valid answers, each id once. */
|
|
1307
|
+
export declare const isAuthSwitchSpendAnswerBatch: (value: unknown) => value is IAuthSwitchSpendAnswer[];
|
|
1308
|
+
/**
|
|
1309
|
+
* Management-only: what answers AGL's inference proxy relayed on an API key's login cost (`IAuthSwitchSpendAnswer`).
|
|
1310
|
+
* The authority records the whole batch in one transaction in the key's monthly ledger and answers the key's usage,
|
|
1311
|
+
* its spend reading included, once it committed. An answer it recorded already is no change, so the proxy sends a
|
|
1312
|
+
* report again until it is acknowledged; an answer by a recorded id with other content refuses the whole batch
|
|
1313
|
+
* (`invalid_input`, naming the id). Spend is recorded for a removed key too, whose ledger stays. Refused
|
|
1314
|
+
* (`login_unavailable`) for any login but an API key's. An authority of 40.3.0 or older does not know the method; the
|
|
1315
|
+
* proxy then serves no key with a spend limit.
|
|
1316
|
+
*/
|
|
1317
|
+
export interface IReq_AuthSwitchRecordSpend extends ITypedRequest {
|
|
1318
|
+
method: 'authswitch.authority.usage.spend';
|
|
1319
|
+
request: {
|
|
1320
|
+
accountId: string;
|
|
1321
|
+
loginId: string;
|
|
1322
|
+
answers: IAuthSwitchSpendAnswer[];
|
|
1236
1323
|
};
|
|
1237
1324
|
response: {
|
|
1238
1325
|
usage: IAuthSwitchUsageSnapshot;
|
|
@@ -1279,21 +1366,28 @@ export interface IReq_AuthSwitchBeginAdd extends ITypedRequest {
|
|
|
1279
1366
|
operation: IAuthSwitchOperation;
|
|
1280
1367
|
};
|
|
1281
1368
|
}
|
|
1369
|
+
/** The providers whose API keys the authority holds as accounts. */
|
|
1370
|
+
export type TAuthSwitchApiKeyProvider = 'anthropic' | 'openai';
|
|
1282
1371
|
/**
|
|
1283
|
-
* Adds an account on an
|
|
1284
|
-
*
|
|
1285
|
-
* (`
|
|
1286
|
-
*
|
|
1287
|
-
*
|
|
1288
|
-
*
|
|
1289
|
-
*
|
|
1372
|
+
* Adds an account on an API key, served on the MANAGEMENT socket alone: an Anthropic key from the Claude Console or an
|
|
1373
|
+
* OpenAI key from the OpenAI platform. A key that starts the way the other provider's keys do is refused before any
|
|
1374
|
+
* request (`invalid_input`). The authority then asks the provider for the key's models and stores nothing unless the
|
|
1375
|
+
* provider accepts the key (`api_key_unverified`; an OpenAI key that may not read models is refused with what to grant
|
|
1376
|
+
* it); it seals the key like every login it holds and never answers it again, here or anywhere else, and keeps only
|
|
1377
|
+
* how the key ends (`keyHint`). The account's subject is a digest of the key, so the same key is one account: offered
|
|
1378
|
+
* again while held, it is refused (`invalid_input`); offered after its removal or after the provider rejected it, it
|
|
1379
|
+
* brings the account back, with its month's spend. `spendLimitMicroUsd` sets the key's monthly spend limit
|
|
1380
|
+
* (`isAuthSwitchSpendLimitMicroUsd`); left out, a new key has none and a returning key keeps the one it had. The login's
|
|
1381
|
+
* purpose is `anthropic_api_key` or `openai_api_key`: it backs the `gateway` runtime alone, where AGL's inference
|
|
1382
|
+
* proxy relays requests on it, and nothing renews or revokes it -- the key is revoked at the provider.
|
|
1290
1383
|
*/
|
|
1291
1384
|
export interface IReq_AuthSwitchAddApiKey extends ITypedRequest {
|
|
1292
1385
|
method: 'authswitch.authority.apikey.add';
|
|
1293
1386
|
request: {
|
|
1294
|
-
providerId:
|
|
1387
|
+
providerId: TAuthSwitchApiKeyProvider;
|
|
1295
1388
|
apiKey: string;
|
|
1296
1389
|
label?: string;
|
|
1390
|
+
spendLimitMicroUsd?: number;
|
|
1297
1391
|
};
|
|
1298
1392
|
response: {
|
|
1299
1393
|
account: IAuthSwitchAccount;
|
|
@@ -1395,7 +1489,8 @@ export interface IReq_AuthSwitchRenameAccount extends ITypedRequest {
|
|
|
1395
1489
|
/**
|
|
1396
1490
|
* Sets an account's usage threshold (`maxUsagePercent`, see `isAuthSwitchMaxUsagePercent`), or clears it with `null`.
|
|
1397
1491
|
* `expectedRevision` is the revision the caller read, so a change of an account that changed meanwhile is refused as
|
|
1398
|
-
* `account_changed`; a value that breaks the rule is
|
|
1492
|
+
* `account_changed`; a value that breaks the rule, and any threshold on an API key account, whose limit is its spend
|
|
1493
|
+
* limit (`authswitch.authority.spendlimit`), is refused as `invalid_input`.
|
|
1399
1494
|
*/
|
|
1400
1495
|
export interface IReq_AuthSwitchSetAccountMaxUsage extends ITypedRequest {
|
|
1401
1496
|
method: 'authswitch.authority.maxusage';
|
|
@@ -1408,7 +1503,26 @@ export interface IReq_AuthSwitchSetAccountMaxUsage extends ITypedRequest {
|
|
|
1408
1503
|
account: IAuthSwitchAccount;
|
|
1409
1504
|
};
|
|
1410
1505
|
}
|
|
1411
|
-
/**
|
|
1506
|
+
/**
|
|
1507
|
+
* Sets an API key account's monthly spend limit (`spendLimitMicroUsd`, see `isAuthSwitchSpendLimitMicroUsd`), or clears
|
|
1508
|
+
* it with `null`. Refused (`invalid_input`) for an account on a sign-in, and for a value that breaks the rule; a change
|
|
1509
|
+
* of an account that changed since `expectedRevision` is refused as `account_changed`.
|
|
1510
|
+
*/
|
|
1511
|
+
export interface IReq_AuthSwitchSetAccountSpendLimit extends ITypedRequest {
|
|
1512
|
+
method: 'authswitch.authority.spendlimit';
|
|
1513
|
+
request: {
|
|
1514
|
+
accountId: string;
|
|
1515
|
+
expectedRevision: number;
|
|
1516
|
+
spendLimitMicroUsd: number | null;
|
|
1517
|
+
};
|
|
1518
|
+
response: {
|
|
1519
|
+
account: IAuthSwitchAccount;
|
|
1520
|
+
};
|
|
1521
|
+
}
|
|
1522
|
+
/**
|
|
1523
|
+
* Lift only the saved reserve for whole hours 1..24, using the authority clock and expected revision. Refused
|
|
1524
|
+
* (`invalid_input`) for an API key account, which has a spend limit instead of a reserve.
|
|
1525
|
+
*/
|
|
1412
1526
|
export interface IReq_AuthSwitchLiftAccountReserve extends ITypedRequest {
|
|
1413
1527
|
method: 'authswitch.authority.reserve.lift';
|
|
1414
1528
|
request: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isAuthSwitchModelId } from './authority-usagetokens.js';
|
|
1
2
|
/** The marker the importer has published since 8.1.0; it keeps its own value on the wire. */
|
|
2
3
|
export const authSwitchImportRefusalMarker = 'authswitch_import_refusal';
|
|
3
4
|
export const authSwitchRefusalReason = 'authswitch_refusal';
|
|
@@ -56,6 +57,18 @@ export const asAuthSwitchRefusal = (error) => {
|
|
|
56
57
|
return null;
|
|
57
58
|
return { code, instruction };
|
|
58
59
|
};
|
|
60
|
+
/**
|
|
61
|
+
* The text the authority answers a malformed request with -- a member missing or unknown, a value of the wrong shape,
|
|
62
|
+
* a spend report naming an answer twice -- and no refusal beside it: the caller's own bug, never an instruction for an
|
|
63
|
+
* owner.
|
|
64
|
+
*/
|
|
65
|
+
export const authSwitchMalformedRequestText = 'Invalid authswitch authority request.';
|
|
66
|
+
/**
|
|
67
|
+
* Whether an error answer is the authority's answer to a malformed request (`authSwitchMalformedRequestText`): its text
|
|
68
|
+
* alone, with no refusal marker. The same request is answered the same way every time it is sent.
|
|
69
|
+
*/
|
|
70
|
+
export const isAuthSwitchMalformedRequest = (error) => typeof error === 'object' && error !== null
|
|
71
|
+
&& 'errorText' in error && error.errorText === authSwitchMalformedRequestText && asAuthSwitchRefusal(error) === null;
|
|
59
72
|
/** The longest account label, in UTF-16 code units. */
|
|
60
73
|
export const authSwitchAccountLabelMaxLength = 128;
|
|
61
74
|
/**
|
|
@@ -66,6 +79,11 @@ export const authSwitchAccountLabelMaxLength = 128;
|
|
|
66
79
|
export const isAuthSwitchAccountLabel = (value) => typeof value === 'string'
|
|
67
80
|
&& value.trim() === value && value.length > 0 && value.length <= authSwitchAccountLabelMaxLength
|
|
68
81
|
&& !/[\u0000-\u001f\u007f]/.test(value);
|
|
82
|
+
/** An API key account's `keyHint`: `…` and the key's last four characters, which tell keys apart and reveal nothing usable. */
|
|
83
|
+
export const authSwitchKeyHint = (apiKey) => `\u2026${apiKey.slice(-4)}`;
|
|
84
|
+
/** Whether a value is a key hint as `authSwitchKeyHint` makes one: `…` and four printable characters. */
|
|
85
|
+
export const isAuthSwitchKeyHint = (value) => typeof value === 'string'
|
|
86
|
+
&& /^\u2026[\x21-\x7e]{4}$/.test(value);
|
|
69
87
|
/** The range of an account's usage threshold, in whole percent of each counted usage window. */
|
|
70
88
|
export const authSwitchMaxUsageRange = Object.freeze({ min: 1, max: 100 });
|
|
71
89
|
/** A lift duration must be an explicit whole number of hours, from one through twenty-four. */
|
|
@@ -98,5 +116,34 @@ export const isAuthSwitchLapsesAt = (value) => {
|
|
|
98
116
|
export const authSwitchPreemptibleRuntimes = ['gateway'];
|
|
99
117
|
/** The arguments a Claude sign-in runs Claude Code with, in the home its prompt names. */
|
|
100
118
|
export const authSwitchClaudeSignInArguments = ['auth', 'login'];
|
|
119
|
+
/** Whether a value is a payment problem's cause (`TAuthSwitchPaymentProblemCause`). */
|
|
120
|
+
export const isAuthSwitchPaymentProblemCause = (value) => value === 'billing' || value === 'spend_cap' || value === 'quota';
|
|
121
|
+
/** The most answers one spend report carries. */
|
|
122
|
+
export const authSwitchSpendAnswerBatchLimit = 64;
|
|
123
|
+
/** The most one answer may cost, in micro-dollars: ten thousand dollars, far above any one answer's price. */
|
|
124
|
+
export const authSwitchSpendAnswerMaxMicroUsd = 10_000_000_000;
|
|
125
|
+
const spendAnswerKeys = ['answerId', 'endedAt', 'model', 'serviceTier', 'microUsd', 'priceSource'];
|
|
126
|
+
/** Whether a value is one spend report answer as the authority accepts it: the check it applies to every answer. */
|
|
127
|
+
export const isAuthSwitchSpendAnswer = (value) => {
|
|
128
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
129
|
+
return false;
|
|
130
|
+
const answer = value;
|
|
131
|
+
return Object.keys(answer).length === spendAnswerKeys.length && spendAnswerKeys.every((key) => Object.hasOwn(answer, key))
|
|
132
|
+
&& typeof answer.answerId === 'string'
|
|
133
|
+
&& /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(answer.answerId)
|
|
134
|
+
&& typeof answer.endedAt === 'string' && Number.isFinite(Date.parse(answer.endedAt))
|
|
135
|
+
&& new Date(answer.endedAt).toISOString() === answer.endedAt
|
|
136
|
+
&& isAuthSwitchModelId(answer.model)
|
|
137
|
+
&& (answer.serviceTier === null || (typeof answer.serviceTier === 'string'
|
|
138
|
+
&& /^[a-z][a-z0-9_-]{0,63}$/.test(answer.serviceTier)))
|
|
139
|
+
&& (answer.microUsd === null ? answer.priceSource === null
|
|
140
|
+
: Number.isSafeInteger(answer.microUsd) && answer.microUsd >= 0
|
|
141
|
+
&& answer.microUsd <= authSwitchSpendAnswerMaxMicroUsd
|
|
142
|
+
&& typeof answer.priceSource === 'string' && /^[\x21-\x7e](?:[\x20-\x7e]{0,126}[\x21-\x7e])?$/.test(answer.priceSource));
|
|
143
|
+
};
|
|
144
|
+
/** Whether a value is a spend report's answers: one to `authSwitchSpendAnswerBatchLimit` valid answers, each id once. */
|
|
145
|
+
export const isAuthSwitchSpendAnswerBatch = (value) => Array.isArray(value)
|
|
146
|
+
&& value.length >= 1 && value.length <= authSwitchSpendAnswerBatchLimit && value.every(isAuthSwitchSpendAnswer)
|
|
147
|
+
&& new Set(value.map((answer) => answer.answerId)).size === value.length;
|
|
101
148
|
/** Runtime capability is returned only to trusted backend callers; do not expose this response in a browser API. */
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXR5LWNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfYXV0aHN3aXRjaC9hdXRob3JpdHktY29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFzRmpFLDZGQUE2RjtBQUM3RixNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRywyQkFBMkIsQ0FBQztBQUN6RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxvQkFBb0IsQ0FBQztBQWlCNUQsTUFBTSxZQUFZLEdBQXdCLElBQUksR0FBRyxDQUF5QjtJQUN4RSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsY0FBYztJQUNuRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSwwQkFBMEIsRUFBRSwwQkFBMEI7SUFDbkcsd0JBQXdCLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCO0lBQ3BFLG1CQUFtQixFQUFFLGVBQWU7SUFDcEMsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUscUJBQXFCO0lBQy9HLHNCQUFzQixFQUFFLHFCQUFxQixFQUFFLHlCQUF5QixFQUFFLHVCQUF1QjtJQUNqRyw4QkFBOEIsRUFBRSx5QkFBeUIsRUFBRSxvQkFBb0IsRUFBRSwwQkFBMEIsRUFBRSx3QkFBd0IsRUFBRSxvQkFBb0I7SUFDM0osd0JBQXdCLEVBQUUsb0JBQW9CO0NBQy9DLENBQUMsQ0FBQztBQUVILE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBYyxFQUFtQyxFQUFFLENBQ3hFLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXZELCtGQUErRjtBQUMvRixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQTRCLEVBQTRCLEVBQUUsQ0FDMUUsSUFBSSxLQUFLLGdCQUFnQixDQUFDLENBQUMs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
|
|
@@ -9,6 +9,7 @@ import { authSwitchUsageLimit, authSwitchUsageLimitText } from './authority-usag
|
|
|
9
9
|
import { authSwitchPlacement } from './authority-placement.js';
|
|
10
10
|
import { authSwitchSubscriptionFacts } from './authority-subscription.js';
|
|
11
11
|
import { plainText } from './formatting.js';
|
|
12
|
+
import { authSwitchUsdText } from './authority-spend.js';
|
|
12
13
|
import { asOfTime, compactUntil } from './timetext.js';
|
|
13
14
|
const nativeTools = ['codex', 'claude_code', 'opencode'];
|
|
14
15
|
const runtimes = ['flex', 'codex', 'opencode', 'claude', 'gateway'];
|
|
@@ -155,6 +156,12 @@ const usageCell = (accountArg, nowArg) => {
|
|
|
155
156
|
const lines = accountArg.windows.map((windowArg) => `${plainText(windowName(windowArg))} `
|
|
156
157
|
+ `${windowPercentText(windowArg)} · ${compactUntil(windowArg.resetAt, nowArg)}`);
|
|
157
158
|
const usage = accountArg.usage;
|
|
159
|
+
// A key's month in dollars, which its window, a percent of its limit, does not say -- nor anything without a limit.
|
|
160
|
+
if (usage?.reading?.kind === 'spend') {
|
|
161
|
+
const spend = usage.reading.spend;
|
|
162
|
+
lines.push(spend.limitMicroUsd === null ? `${authSwitchUsdText(spend.spentMicroUsd)} this month · no limit`
|
|
163
|
+
: `${authSwitchUsdText(spend.spentMicroUsd)} of ${authSwitchUsdText(spend.limitMicroUsd)} this month`);
|
|
164
|
+
}
|
|
158
165
|
if (usage?.reading && usage.observedAt !== null)
|
|
159
166
|
lines.push(`as of ${asOfTime(usage.observedAt, nowArg)}`);
|
|
160
167
|
if (usage?.lastReadError?.rateLimited) {
|
|
@@ -250,4 +257,4 @@ export const renderAuthSwitchLimitList = async (outArg, limitsArg, nowArg) => {
|
|
|
250
257
|
groups: { divider: account, colorLine: (rowArg) => rowArg.providerId },
|
|
251
258
|
});
|
|
252
259
|
};
|
|
253
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXR5LW92ZXJ2aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfYXV0aHN3aXRjaC9hdXRob3JpdHktb3ZlcnZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLG1CQUFtQixFQUVNLE1BQU0seUJBQXlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLDRCQUE0QixFQUFFLHNCQUFzQixFQUNyRixNQUFNLDZCQUE2QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsRUFDekIsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQStELE1BQU0sMEJBQTBCLENBQUM7QUFDNUgsT0FBTyxFQUFFLDJCQUEyQixFQUFvQyxNQUFNLDZCQUE2QixDQUFDO0FBRTVHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQTZGdkQsTUFBTSxXQUFXLEdBQXlDLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUMvRixNQUFNLFFBQVEsR0FBNkMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFFOUc7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxXQUFnQyxFQUFFLFlBQW9CLEVBQTJCLEVBQUUsQ0FBQyxDQUN2SCxXQUFXLENBQUMsTUFBTTtLQUNmLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxZQUFZLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFT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
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXR5LW92ZXJ2aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfYXV0aHN3aXRjaC9hdXRob3JpdHktb3ZlcnZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLG1CQUFtQixFQUVNLE1BQU0seUJBQXlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLDRCQUE0QixFQUFFLHNCQUFzQixFQUNyRixNQUFNLDZCQUE2QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsRUFDekIsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQStELE1BQU0sMEJBQTBCLENBQUM7QUFDNUgsT0FBTyxFQUFFLDJCQUEyQixFQUFvQyxNQUFNLDZCQUE2QixDQUFDO0FBRTVHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQTZGdkQsTUFBTSxXQUFXLEdBQXlDLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUMvRixNQUFNLFFBQVEsR0FBNkMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFFOUc7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxXQUFnQyxFQUFFLFlBQW9CLEVBQTJCLEVBQUUsQ0FBQyxDQUN2SCxXQUFXLENBQUMsTUFBTTtLQUNmLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxZQUFZLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUM7S0FDMUYsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQ3BILENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLFdBQWdDLEVBQUUsWUFBb0IsRUFBMkIsRUFBRTtJQUN0RyxNQUFNLElBQUksR0FBNEIsV0FBVyxDQUFDLGlCQUFpQjtTQUNoRSxNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEtBQUssWUFBWSxDQUFDO1NBQ25FLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRLElBQUksTUFBTTtRQUM3RyxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0UsS0FBSyxNQUFNLEtBQUssSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkMsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLFlBQVksSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFBRSxTQUFTO1FBQ3pHLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMzRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7SUFDSCxDQUFDO0lBQ0QsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMvQixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUTthQUNsQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEtBQUssWUFBWSxJQUFJLFVBQVUsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDO2FBQy9GLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLElBQUksUUFBUSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLENBQUMsQ0FBQztBQUVGLE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBNkIsRUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRO0lBQ2xGLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUU3Rjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxLQUFLLEVBQUUsV0FBZ0MsRUFDbEYsV0FBNEYsRUFDNUYsTUFBYyxFQUEyQyxFQUFFO0lBQzNELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztJQUNwQixNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVE7U0FDcEQsTUFBTSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7U0FDM0MsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQXVDLEVBQUU7UUFDN0QsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvRCxNQUFNLElBQUksR0FBRztZQUNYLFNBQVMsRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztZQUM3RyxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksSUFBSTtZQUN2RyxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sSUFBSSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksSUFBSTtZQUN4RSxlQUFlLEVBQUUsVUFBVSxDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7WUFDMUUsU0FBUyxFQUFFLG1CQUFtQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQVM7U0FDckksQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLENBQUMsVUFBK0MsRUFBd0IsRUFBRSxDQUMxRixtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4SCxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNuQixPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxrREFBa0Q7Z0JBQ3JHLFlBQVksRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN0RixDQUFDO1FBQ0QsSUFBSSxLQUErQixDQUFDO1FBQ3BDLElBQUksQ0FBQztZQUNILEtBQUssR0FBRyxNQUFNLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQUMsT0FBTyxRQUFRLEVBQUUsQ0FBQztZQUNsQixRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ2pCLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRSxFQUFFO2dCQUNuRyxjQUFjLEVBQUUsSUFBSTtnQkFDcEIsT0FBTyxFQUFFLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLG9EQUFvRCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0csQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTztZQUMvRyxZQUFZLEVBQUUsMkJBQTJCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxJQUFJLElBQUk7WUFDdEcsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixDQUFDO1lBQzNJLFNBQVMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNOLE9BQU8sRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRTtRQUNuRixnQkFBZ0IsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO0FBQzlGLENBQUMsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFzQixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNqRSxNQUFNLFlBQVksR0FBRyxDQUFDLGFBQXFCLEVBQVUsRUFBRTtJQUNyRCxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDbkQsQ0FBQyxDQUFDO0FBQ0YsTUFBTSxRQUFRLEdBQUcsQ0FBQyxVQUF1RCxFQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUM7QUFDM0gscUdBQXFHO0FBQ3JHLE1BQU0sWUFBWSxHQUFHLENBQUMsT0FBbUMsRUFBRSxRQUFvQyxFQUFVLEVBQUUsQ0FBQyxDQUMxRyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO09BQ2pFLE9BQU8sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7T0FDckQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7T0FDbkQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUN2RCxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUM7QUFFN0MsMkZBQTJGO0FBQzNGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsV0FBMkMsRUFBd0IsRUFBRSxDQUFDLENBQUM7SUFDekcsSUFBSSxFQUFFLG1CQUFtQjtJQUN6QixXQUFXLEVBQUUsV0FBVyxDQUFDLFdBQVc7SUFDcEMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLGdCQUFnQjtJQUM5QyxRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVE7SUFDOUIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUF5QixFQUFFO1FBQ3pFLE1BQU0sSUFBSSxHQUFHLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFDOUcsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87WUFDL0YsZUFBZSxFQUFFLFVBQVUsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLElBQUk7WUFDMUYsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSztZQUMxRyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzNELElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEMsT0FBTyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJO29CQUMvRyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QseUZBQXlGO1FBQ3pGLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzRSxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDbkYsYUFBYSxFQUFFLFNBQVMsQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXO1lBQzVFLG9CQUFvQixFQUFFLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87WUFDaEYsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQyxDQUFDO0NBQ0gsQ0FBQyxDQUFDO0FBRUgsTUFBTSxhQUFhLEdBQUcsQ0FBQyxhQUFxQixFQUFVLEVBQUUsQ0FBQyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTO0lBQzdGLENBQUMsQ0FBQyxhQUFhLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUN4RSxNQUFNLFNBQVMsR0FBRyxDQUFDLE9BQWtDLEVBQVUsRUFBRSxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU87SUFDN0YsQ0FBQyxDQUFDLE9BQU8sS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQzNELE1BQU0sWUFBWSxHQUFHLENBQUMsVUFBeUMsRUFBVSxFQUFFLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTTtJQUN4RyxDQUFDLENBQUMsVUFBVSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVO1FBQ3pFLENBQUMsQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztBQUU1RCxrR0FBa0c7QUFDbEcsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUE2QixFQUFVLEVBQUU7SUFDeEQsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzlCLE9BQU8sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNqSSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsYUFBYSxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDO0lBQy9HLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjO1FBQ3pELENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNyRSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLENBQUM7QUFDeEQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxVQUFrQixFQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztBQUNqRixNQUFNLFlBQVksR0FBRyxDQUFDLFVBQXlCLEVBQUUsV0FBVyxHQUFHLEtBQUssRUFBK0MsRUFBRSxDQUNuSCxVQUFVLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBRXZILHVGQUF1RjtBQUN2RixNQUFNLGlCQUFpQixHQUFHLENBQUMsU0FBaUMsRUFBVSxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsNEJBQTRCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtNQUM5SCxHQUFHLFNBQVMsQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7QUFFaEU7OztHQUdHO0FBQ0gsTUFBTSxTQUFTLEdBQUcsQ0FBQyxVQUFzQyxFQUFFLE1BQWMsRUFBVSxFQUFFO0lBQ25GLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRztVQUN0RixHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxNQUFNLFlBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwRixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQy9CLG9IQUFvSDtJQUNwSCxJQUFJLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0I7WUFDekcsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDM0csQ0FBQztJQUNELElBQUksS0FBSyxFQUFFLE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLElBQUk7UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNHLElBQUksS0FBSyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxRQUFRLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxPQUFPLEtBQUssSUFBSTtRQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ3RFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN6RCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQyxDQUFDO0FBRUYsbUdBQW1HO0FBQ25HLE1BQU0sVUFBVSxHQUFHLENBQUMsa0JBQWlDLEVBQUUsUUFBc0MsRUFDM0YsTUFBYyxFQUFZLEVBQUUsQ0FBQztJQUM3QixHQUFHLGtCQUFrQixLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsa0JBQWtCLEdBQUcsQ0FBQztJQUMxRSxHQUFHLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDekQsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDbEYsQ0FBQyxDQUFDLE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3hELENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLGNBQWMsR0FBRyxDQUFDLFVBQ0csRUFBRSxNQUFjLEVBQVksRUFBRSxDQUFDO0lBQ3hELEdBQUcsVUFBVSxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUM7UUFDakUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEtBQUssVUFBVSxJQUFJLFVBQVUsQ0FBQyxRQUFRLEtBQUssSUFBSTtZQUNuRSxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2hGLEdBQUcsVUFBVSxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDdkMsQ0FBQyxDQUFDLENBQUMsYUFBYSxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEdBQUcsVUFBVSxDQUFDLG9CQUFvQixLQUFLLGFBQWE7Z0JBQy9HLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDL0IsQ0FBQztBQUVGLHNHQUFzRztBQUN0RyxNQUFNLGtCQUFrQixHQUFHLENBQUMsUUFBdUIsRUFBVSxFQUFFLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVTtJQUM1RixDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFFdkU7OztHQUdHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsQ0FBQyxVQUFzQyxFQUFFLE1BQWMsRUFBVSxFQUFFLENBQUM7SUFDdEYsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvQixTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLE9BQU8sQ0FBQztJQUNyRixHQUFHLFVBQVUsQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQXlCLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQ3hILEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7SUFDbkUsR0FBRyxjQUFjLENBQUMsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7UUFDaEYsY0FBYyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxDQUFDO0lBQy9HLEdBQUcsVUFBVSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQy9DLENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN2QyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxXQUFXLEVBQUU7Z0JBQ2xDLEdBQUcsVUFBVSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksVUFBVSxDQUFDLFlBQVksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7Q0FDbEgsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFYixNQUFNLFVBQVUsR0FBcUM7SUFDbkQsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtDQUNsRSxDQUFDO0FBRUYsOENBQThDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLEtBQUssRUFBRSxNQUF5QyxFQUM3RixXQUEyQyxFQUFFLE1BQWMsRUFBaUIsRUFBRTtJQUM5RSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7UUFDdkIsT0FBTyxFQUFFO1lBQ1AsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFDdkYsT0FBTyxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2pGLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNwRixFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRTtZQUNoSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRTtTQUMzRjtRQUNELFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsNkJBQTZCLEVBQUUsS0FBSyxFQUFFLFVBQVU7UUFDL0YsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtLQUM1RixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixpRUFBaUU7QUFDakUsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsS0FBSyxFQUFFLE1BQXlDLEVBQ3ZGLFNBQStCLEVBQUUsTUFBYyxFQUFpQixFQUFFO0lBQ2xFLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDOUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUEyQixFQUFVLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3BHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7UUFDdkIsT0FBTyxFQUFFO1lBQ1AsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFDdkYsT0FBTyxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2pGLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztvQkFDL0UsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUM7b0JBQzdFLEdBQUcsTUFBTSxDQUFDLFlBQVksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNsSCxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO2lCQUNsQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRTtZQUMzRCxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSTtvQkFDdEUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzVFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVM7b0JBQ3hGLENBQUMsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsT0FBTztnQkFDN0gsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUM5RyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3pCLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVM7b0JBQzFGLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxlQUFlLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDM0csRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7Z0JBQzdILEtBQUssRUFBRSxPQUFPLEVBQUU7U0FDbkI7UUFDRCxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLDZCQUE2QixFQUFFLEtBQUssRUFBRSxVQUFVO1FBQy9GLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO0tBQ3ZFLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyJ9
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* command line and `agl proxy status` show it; an existing session keeps its account for the prompt cache and is never
|
|
5
5
|
* placed again by it.
|
|
6
6
|
*
|
|
7
|
-
* Besides types, the module imports only the limit rule of `authority-usagelimit.ts
|
|
8
|
-
* whose own imports carry nothing to a page, so it bundles for a browser with
|
|
7
|
+
* Besides types, the module imports only the limit rule of `authority-usagelimit.ts`, the window reader it uses and the
|
|
8
|
+
* spend month of `authority-spend.ts`, whose own imports carry nothing to a page, so it bundles for a browser with
|
|
9
|
+
* nothing behind it.
|
|
9
10
|
*/
|
|
10
11
|
import type { TAuthSwitchUsageReading } from './classes.authorityusage.js';
|
|
11
12
|
/**
|
|
@@ -41,6 +42,10 @@ export declare const authSwitchAccountLifecycle: (lapsesAtArg: string | null, no
|
|
|
41
42
|
* divided by the hours until the window's deadline: its reset, or the account's lapse when that comes first, and at
|
|
42
43
|
* least an hour. Usage that resets soon, or is lost when the account lapses, is worth more now than usage that stays for
|
|
43
44
|
* days; placing by it uses that first and spares the accounts that reset later.
|
|
45
|
+
*
|
|
46
|
+
* An API key's spend reading whose month ended (`authSwitchSpendMonthEnded`, as `authSwitchUsageLimit` judges it) says
|
|
47
|
+
* nothing about the current month, which starts with nothing spent: its window counts as 0% used, with the end of the
|
|
48
|
+
* current month (`authSwitchSpendPeriod`) as its reset.
|
|
44
49
|
*/
|
|
45
50
|
export declare const authSwitchPlacement: (readingArg: TAuthSwitchUsageReading | null, maxUsagePercentArg: number | null, lapsesAtArg: string | null, nowArg: number, reserveLiftUntilArg?: string | null) => IAuthSwitchPlacement;
|
|
46
51
|
/** An account as placement ranks it: its score, whether it is a last resort, and its headroom below its threshold. */
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { authSwitchCountedWindows, authSwitchEffectiveMaxUsage } from './authority-usagelimit.js';
|
|
2
2
|
import { authSwitchUsageWindowPercent } from './authority-usagewindows.js';
|
|
3
|
+
import { authSwitchSpendMonthEnded, authSwitchSpendPeriod } from './authority-spend.js';
|
|
3
4
|
/** How close to its lapse an account takes new sessions only as a last resort: a day. */
|
|
4
5
|
export const lapseHorizonMs = 86_400_000;
|
|
5
6
|
/** The shortest time a window's headroom is spread over, so a window about to reset does not score without bound. */
|
|
@@ -29,6 +30,10 @@ const windowResetAt = (windowArg, nowArg) => {
|
|
|
29
30
|
* divided by the hours until the window's deadline: its reset, or the account's lapse when that comes first, and at
|
|
30
31
|
* least an hour. Usage that resets soon, or is lost when the account lapses, is worth more now than usage that stays for
|
|
31
32
|
* days; placing by it uses that first and spares the accounts that reset later.
|
|
33
|
+
*
|
|
34
|
+
* An API key's spend reading whose month ended (`authSwitchSpendMonthEnded`, as `authSwitchUsageLimit` judges it) says
|
|
35
|
+
* nothing about the current month, which starts with nothing spent: its window counts as 0% used, with the end of the
|
|
36
|
+
* current month (`authSwitchSpendPeriod`) as its reset.
|
|
32
37
|
*/
|
|
33
38
|
export const authSwitchPlacement = (readingArg, maxUsagePercentArg, lapsesAtArg, nowArg, reserveLiftUntilArg = null) => {
|
|
34
39
|
const lifecycle = authSwitchAccountLifecycle(lapsesAtArg, nowArg);
|
|
@@ -37,9 +42,11 @@ export const authSwitchPlacement = (readingArg, maxUsagePercentArg, lapsesAtArg,
|
|
|
37
42
|
: lapsesAt - nowArg <= lapseHorizonMs ? 'last_resort' : 'normal';
|
|
38
43
|
const threshold = authSwitchEffectiveMaxUsage(maxUsagePercentArg, reserveLiftUntilArg, nowArg) ?? 100;
|
|
39
44
|
const windows = readingArg === null ? [] : authSwitchCountedWindows(readingArg, maxUsagePercentArg);
|
|
45
|
+
const spendMonthEnded = readingArg?.kind === 'spend' && authSwitchSpendMonthEnded(readingArg.spend, nowArg);
|
|
40
46
|
const scores = windows.map((windowArg) => {
|
|
41
|
-
const headroom = Math.max(0, threshold - authSwitchUsageWindowPercent(windowArg));
|
|
42
|
-
const
|
|
47
|
+
const headroom = spendMonthEnded ? threshold : Math.max(0, threshold - authSwitchUsageWindowPercent(windowArg));
|
|
48
|
+
const resetAt = spendMonthEnded ? Date.parse(authSwitchSpendPeriod(nowArg).end) : windowResetAt(windowArg, nowArg);
|
|
49
|
+
const deadline = Math.min(resetAt, lapsesAt);
|
|
43
50
|
return headroom / (Math.max(deadline - nowArg, minimumDeadlineMs) / 3_600_000);
|
|
44
51
|
});
|
|
45
52
|
return { lifecycle, eligibility, score: scores.length ? Math.min(...scores) : null };
|
|
@@ -57,4 +64,4 @@ export const authSwitchPlacementOrder = (inFlightArg) => (left, right) => Number
|
|
|
57
64
|
? right.score / (1 + inFlightArg(right.id)) - left.score / (1 + inFlightArg(left.id))
|
|
58
65
|
: inFlightArg(left.id) - inFlightArg(right.id))
|
|
59
66
|
|| right.headroom - left.headroom || left.id.localeCompare(right.id);
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXR5LXBsYWNlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2F1dGhzd2l0Y2gvYXV0aG9yaXR5LXBsYWNlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsNEJBQTRCLEVBQStCLE1BQU0sNkJBQTZCLENBQUM7QUFDeEcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFjeEYseUZBQXlGO0FBQ3pGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUM7QUFFekMscUhBQXFIO0FBQ3JILE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDO0FBYXBDLGlIQUFpSDtBQUNqSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFdBQTBCLEVBQUUsTUFBYyxFQUErQixFQUFFLENBQ3BILFdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBRTlGOzs7O0dBSUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxDQUFDLFNBQWlDLEVBQUUsTUFBYyxFQUFVLEVBQUU7SUFDbEYsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDbEQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFB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LENBQUMsQ0FDekYsSUFBOEIsRUFDOUIsS0FBK0IsRUFDdkIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7T0FDMUQsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDO09BQzFELENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxJQUFJO1FBQzdDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckYsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztPQUM5QyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDIn0=
|
|
@@ -18,9 +18,9 @@ export interface IReq_AuthSwitchBindAccount extends ITypedRequest {
|
|
|
18
18
|
loginId: string;
|
|
19
19
|
/**
|
|
20
20
|
* The login's purpose: `openai_managed` for a ChatGPT login, `claude_host_native` for a Claude login,
|
|
21
|
-
* `anthropic_api_key` for an Anthropic API key.
|
|
21
|
+
* `anthropic_api_key` for an Anthropic API key, `openai_api_key` for an OpenAI API key.
|
|
22
22
|
*/
|
|
23
|
-
purpose: 'openai_managed' | 'claude_host_native' | 'anthropic_api_key';
|
|
23
|
+
purpose: 'openai_managed' | 'claude_host_native' | 'anthropic_api_key' | 'openai_api_key';
|
|
24
24
|
runtime: IAuthSwitchBinding['runtime'];
|
|
25
25
|
scopeId: string;
|
|
26
26
|
incarnationId: string;
|