@substrat-run/contract-tests 0.140.0 → 0.142.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/attachment-text-suite.d.ts.map +1 -1
- package/dist/attachment-text-suite.js +12 -4
- package/dist/attachment-text-suite.js.map +1 -1
- package/dist/become-mint-suite.d.ts +12 -0
- package/dist/become-mint-suite.d.ts.map +1 -0
- package/dist/become-mint-suite.js +457 -0
- package/dist/become-mint-suite.js.map +1 -0
- package/dist/capability-attachment-suite.d.ts.map +1 -1
- package/dist/capability-attachment-suite.js +84 -4
- package/dist/capability-attachment-suite.js.map +1 -1
- package/dist/capability-expiry-suite.d.ts.map +1 -1
- package/dist/capability-expiry-suite.js +6 -2
- package/dist/capability-expiry-suite.js.map +1 -1
- package/dist/capability-suite.d.ts.map +1 -1
- package/dist/capability-suite.js +4 -0
- package/dist/capability-suite.js.map +1 -1
- package/dist/directory-restore-suite.js +1 -1
- package/dist/directory-restore-suite.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/job-run-suite.d.ts.map +1 -1
- package/dist/job-run-suite.js +29 -15
- package/dist/job-run-suite.js.map +1 -1
- package/dist/modules.d.ts.map +1 -1
- package/dist/modules.js +13 -1
- package/dist/modules.js.map +1 -1
- package/dist/permission-suite.js +2 -2
- package/dist/permission-suite.js.map +1 -1
- package/dist/schedule-suite.d.ts +4 -1
- package/dist/schedule-suite.d.ts.map +1 -1
- package/dist/schedule-suite.js +150 -2
- package/dist/schedule-suite.js.map +1 -1
- package/dist/scope-host-suite.d.ts.map +1 -1
- package/dist/scope-host-suite.js +494 -1
- package/dist/scope-host-suite.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract suite for a PRINCIPAL's `become` capability (#1686) — the host verbs a member invite
|
|
3
|
+
* runs: `mintBecomeCapabilityBounded` and `revokeBecomeCapability`.
|
|
4
|
+
*
|
|
5
|
+
* What it pins, in one sentence: **a principal mints a `become` capability for someone only when
|
|
6
|
+
* it already holds everything that someone holds there — node-level and entity-narrowed alike —
|
|
7
|
+
* and the capability then yields exactly that principal, once, in that scope only, until it is
|
|
8
|
+
* revoked; the mint is on the spine as `capability.become-minted` with the minter as actor.**
|
|
9
|
+
*
|
|
10
|
+
* Every refusal is paired with the allow beside it, so a bound that refused everything cannot
|
|
11
|
+
* pass, and every refusal is checked to have written nothing:
|
|
12
|
+
*
|
|
13
|
+
* 1. **The node-level bound.** A reader mints for a reader and is refused for a writer, naming
|
|
14
|
+
* the key it lacks; the owner mints for the writer.
|
|
15
|
+
* 2. **The narrowed bound.** A target's entity-narrowed grant must be one the minter can
|
|
16
|
+
* exercise on that entity: a minter holding the key on the entity's ancestor passes, one
|
|
17
|
+
* holding nothing or holding it on a sibling is refused. And narrowing never launders: a
|
|
18
|
+
* minter holding the key only on one entity is refused for a target holding it scope-wide.
|
|
19
|
+
* 3. **The record and the spine.** The capability names the minter, the principal, one use
|
|
20
|
+
* and no expiry; the event names the minter as actor and the capability as its entity.
|
|
21
|
+
* 4. **The exchange.** It yields the principal once; a share-link (`act`) exchange of it is
|
|
22
|
+
* refused without spending the use; another scope never knows the secret.
|
|
23
|
+
* 5. **The revoke.** Revoking it refuses the exchange and records the revoker. It revokes only
|
|
24
|
+
* a principal-minted `become` — never an `act` share, never the platform's own `become`.
|
|
25
|
+
* 6. **Tenant isolation.** Another tenant's name for the scope is refused, writing nothing.
|
|
26
|
+
* 7. **The target's holdings reach as the checker's do.** A key the target holds only at the
|
|
27
|
+
* TENANT node, and an entity-narrowed grant it holds only through an ORG, both count: a
|
|
28
|
+
* minter short of them is refused, one holding them passes.
|
|
29
|
+
* 8. **A seat already taken.** A target some `become` link has been exchanged into in this
|
|
30
|
+
* scope (a principal's or the platform's) is refused another link; never-exchanged links,
|
|
31
|
+
* open or revoked, leave it untaken, and a seat taken in another scope is not taken here.
|
|
32
|
+
* 9. **The link dies when its principal's holdings change.** The mint records a digest of what
|
|
33
|
+
* the target holds — role keys as assigned, direct and narrowed grants — and the exchange
|
|
34
|
+
* recomputes it: a link whose principal was given (i) another scope-level role, (ii) a
|
|
35
|
+
* tenant-level role, or (iii) an org that holds more is revoked — with no revoker — and
|
|
36
|
+
* refused, its use untaken. Its twins: nothing changed (another principal raised meanwhile),
|
|
37
|
+
* and (iv) a role it holds redefined to carry more — a role's definition is the vertical's
|
|
38
|
+
* code, not the inviter's doing — and the link exchanges.
|
|
39
|
+
* 10. **Nothing to become.** A target holding nothing at the node is refused outright, whoever
|
|
40
|
+
* mints — the bound is evaluated at mint, and an empty set would cover trivially. Its twin:
|
|
41
|
+
* the same principal, once it holds a role, is minted for.
|
|
42
|
+
*/
|
|
43
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
44
|
+
import { BECOME_LINK_STATES_MAX_IDS, CAPABILITY_BECOME_MINTED, capabilityId, CAPABILITY_SECRET_PREFIX, capabilityBecomeMintedPayload, orgId, permissionKey, platformActorId, principalId, scopeId, tenantId, } from '@substrat-run/contracts';
|
|
45
|
+
import { ulid } from '@substrat-run/kernel';
|
|
46
|
+
import { capMod } from './modules.js';
|
|
47
|
+
const READ = permissionKey.parse('cap:read');
|
|
48
|
+
const WRITE = permissionKey.parse('cap:write');
|
|
49
|
+
const ADMIN = permissionKey.parse('cap:admin');
|
|
50
|
+
const folder = (id) => ({ entityType: 'folder', entityId: id });
|
|
51
|
+
const doc = (id) => ({ entityType: 'doc', entityId: id });
|
|
52
|
+
export function becomeMintContractSuite(adapterName, makeFixture) {
|
|
53
|
+
describe(`a principal's become capability (#1686): ${adapterName}`, () => {
|
|
54
|
+
let fixture;
|
|
55
|
+
let host;
|
|
56
|
+
const t1 = tenantId.parse(ulid());
|
|
57
|
+
const t2 = tenantId.parse(ulid());
|
|
58
|
+
const s1 = scopeId.parse(ulid());
|
|
59
|
+
const s2 = scopeId.parse(ulid()); // same tenant, a second scope
|
|
60
|
+
const staff = platformActorId.parse(ulid());
|
|
61
|
+
const p = () => principalId.parse(ulid());
|
|
62
|
+
const owner = p(); // owner at s1: read + write + admin
|
|
63
|
+
const reader = p(); // reader at s1
|
|
64
|
+
const nobody = p(); // holds nothing
|
|
65
|
+
const folderReader = p(); // member, plus cap:read on folder F only (d1 lies beneath it)
|
|
66
|
+
const siblingReader = p(); // member, plus cap:read on doc d2 only
|
|
67
|
+
const writerTarget = p(); // writer at s1
|
|
68
|
+
const readerTarget = p(); // reader at s1
|
|
69
|
+
const narrowTarget = p(); // member, plus cap:read on doc d1 only
|
|
70
|
+
const emptyTarget = p(); // holds nothing — until the last case grants it reader
|
|
71
|
+
const node = (scope = s1) => ({ tenantId: t1, scopeId: scope });
|
|
72
|
+
const mint = (caller, principal, scope = s1, tenant = t1) => fixture.verbs.mintBecomeCapabilityBounded(tenant, scope, caller, { principal, maxUses: 1, label: 'member invite' });
|
|
73
|
+
const minted = async (caller, principal) => {
|
|
74
|
+
const out = await mint(caller, principal);
|
|
75
|
+
if (!out.ok)
|
|
76
|
+
throw new Error(`expected a mint, refused: ${JSON.stringify(out)}`);
|
|
77
|
+
return out.minted;
|
|
78
|
+
};
|
|
79
|
+
const records = async (scope = s1) => (await host.admin.listCapabilities(staff, t1, scope, { includeRevoked: true })).entries;
|
|
80
|
+
const outbox = async () => (await host.getScope(owner, t1, s1)).invoke('cap/outbox');
|
|
81
|
+
/** What a refusal must not have changed: the capability directory and the spine. */
|
|
82
|
+
const snapshot = async () => ({ caps: (await records()).length, events: (await outbox()).length });
|
|
83
|
+
/** A fresh reader at s1 — a seat for a case that exchanges its link, since a claimed seat refuses another. */
|
|
84
|
+
const seat = async () => {
|
|
85
|
+
const who = p();
|
|
86
|
+
await host.admin.assignRole(staff, { principalId: who, roleKey: 'reader', node: node() });
|
|
87
|
+
return who;
|
|
88
|
+
};
|
|
89
|
+
beforeAll(async () => {
|
|
90
|
+
fixture = await makeFixture();
|
|
91
|
+
host = fixture.host;
|
|
92
|
+
host.registerModule(capMod);
|
|
93
|
+
await host.admin.createTenant(staff, { id: t1, slug: 'become-tenant', name: 'Become Tenant' });
|
|
94
|
+
await host.admin.createTenant(staff, { id: t2, slug: 'become-other', name: 'Become Other' });
|
|
95
|
+
for (const t of [t1, t2])
|
|
96
|
+
await host.admin.grantEntitlement(staff, t, 'cap');
|
|
97
|
+
for (const s of [s1, s2]) {
|
|
98
|
+
await host.provisionScope(staff, { tenantId: t1, scopeId: s, vertical: 'cap-vertical' });
|
|
99
|
+
await host.admin.activateScope(staff, t1, s);
|
|
100
|
+
}
|
|
101
|
+
await host.admin.defineRole(staff, t1, { key: 'owner', permissions: [READ, WRITE, ADMIN], source: 'vertical' });
|
|
102
|
+
await host.admin.defineRole(staff, t1, { key: 'writer', permissions: [READ, WRITE], source: 'vertical' });
|
|
103
|
+
await host.admin.defineRole(staff, t1, { key: 'reader', permissions: [READ], source: 'vertical' });
|
|
104
|
+
await host.admin.defineRole(staff, t1, { key: 'member', permissions: [ADMIN], source: 'vertical' });
|
|
105
|
+
const assign = (principalId, roleKey) => host.admin.assignRole(staff, { principalId, roleKey, node: node() });
|
|
106
|
+
await assign(owner, 'owner');
|
|
107
|
+
await assign(reader, 'reader');
|
|
108
|
+
await assign(writerTarget, 'writer');
|
|
109
|
+
await assign(readerTarget, 'reader');
|
|
110
|
+
for (const m of [folderReader, siblingReader, narrowTarget])
|
|
111
|
+
await assign(m, 'member');
|
|
112
|
+
// The tree in s1: F ─┬─ d1
|
|
113
|
+
// └─ d2
|
|
114
|
+
const stub = await host.getScope(owner, t1, s1);
|
|
115
|
+
await stub.invoke('cap/link', { child: doc('d1'), parent: folder('F') });
|
|
116
|
+
await stub.invoke('cap/link', { child: doc('d2'), parent: folder('F') });
|
|
117
|
+
const narrow = (principal, entity) => host.admin.grant(staff, { principalId: principal, permission: READ, node: node(), entity, grantedBy: owner });
|
|
118
|
+
await narrow(folderReader, folder('F'));
|
|
119
|
+
await narrow(siblingReader, doc('d2'));
|
|
120
|
+
await narrow(narrowTarget, doc('d1'));
|
|
121
|
+
});
|
|
122
|
+
afterAll(async () => {
|
|
123
|
+
await fixture.cleanup();
|
|
124
|
+
});
|
|
125
|
+
describe('the node-level bound', () => {
|
|
126
|
+
it('a reader mints for a reader…', async () => {
|
|
127
|
+
const out = await mint(reader, readerTarget);
|
|
128
|
+
expect(out.ok).toBe(true);
|
|
129
|
+
});
|
|
130
|
+
it('…and is refused for a writer, naming what it lacks — nothing recorded, nothing on the spine', async () => {
|
|
131
|
+
const before = await snapshot();
|
|
132
|
+
expect(await mint(reader, writerTarget)).toEqual({ ok: false, coverage: { covered: false, missing: [WRITE] } });
|
|
133
|
+
expect(await snapshot()).toEqual(before);
|
|
134
|
+
});
|
|
135
|
+
it('the owner, who holds all of it, mints for the writer', async () => {
|
|
136
|
+
expect((await mint(owner, writerTarget)).ok).toBe(true);
|
|
137
|
+
});
|
|
138
|
+
it('a principal holding nothing is refused for anyone who holds something', async () => {
|
|
139
|
+
const before = await snapshot();
|
|
140
|
+
const out = await mint(nobody, readerTarget);
|
|
141
|
+
expect(out).toEqual({ ok: false, coverage: { covered: false, missing: [READ] } });
|
|
142
|
+
expect(await snapshot()).toEqual(before);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
describe('the narrowed bound', () => {
|
|
146
|
+
it('a minter holding the key on the entity\'s ancestor passes for a target holding it on the entity', async () => {
|
|
147
|
+
expect((await mint(folderReader, narrowTarget)).ok).toBe(true);
|
|
148
|
+
});
|
|
149
|
+
it('a minter holding it on a sibling is refused — and so is one holding nothing', async () => {
|
|
150
|
+
const before = await snapshot();
|
|
151
|
+
expect(await mint(siblingReader, narrowTarget)).toEqual({ ok: false, coverage: { covered: false, missing: [READ] } });
|
|
152
|
+
expect(await mint(nobody, narrowTarget)).toEqual({ ok: false, coverage: { covered: false, missing: [ADMIN, READ] } });
|
|
153
|
+
expect(await snapshot()).toEqual(before);
|
|
154
|
+
});
|
|
155
|
+
it('narrowing never launders: a key held on one entity does not cover a target holding it scope-wide', async () => {
|
|
156
|
+
const before = await snapshot();
|
|
157
|
+
expect(await mint(folderReader, readerTarget)).toEqual({ ok: false, coverage: { covered: false, missing: [READ] } });
|
|
158
|
+
expect(await snapshot()).toEqual(before);
|
|
159
|
+
});
|
|
160
|
+
it('the scope-wide holder covers the narrowed target too', async () => {
|
|
161
|
+
expect((await mint(owner, narrowTarget)).ok).toBe(true);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe('the record and the spine', () => {
|
|
165
|
+
let cap;
|
|
166
|
+
beforeAll(async () => {
|
|
167
|
+
cap = await minted(owner, readerTarget);
|
|
168
|
+
});
|
|
169
|
+
it('hands back a prefixed secret, once, with no expiry', () => {
|
|
170
|
+
expect(cap.secret.startsWith(CAPABILITY_SECRET_PREFIX)).toBe(true);
|
|
171
|
+
expect(cap.expiresAt).toBeNull();
|
|
172
|
+
});
|
|
173
|
+
it('records the minter, the principal, one use and no expiry — and never the secret', async () => {
|
|
174
|
+
const record = (await records()).find((r) => r.id === cap.id);
|
|
175
|
+
expect(record).toMatchObject({
|
|
176
|
+
mode: 'become',
|
|
177
|
+
principal: readerTarget,
|
|
178
|
+
mintedBy: owner,
|
|
179
|
+
label: 'member invite',
|
|
180
|
+
expiresAt: null,
|
|
181
|
+
maxUses: 1,
|
|
182
|
+
uses: 0,
|
|
183
|
+
revokedAt: null,
|
|
184
|
+
});
|
|
185
|
+
expect(JSON.stringify(record)).not.toContain(cap.secret);
|
|
186
|
+
});
|
|
187
|
+
it('is on the spine as capability.become-minted, the minter its actor and the capability its entity', async () => {
|
|
188
|
+
const rows = (await outbox()).filter((r) => r.type === CAPABILITY_BECOME_MINTED && r.entity_id === cap.id);
|
|
189
|
+
expect(rows).toHaveLength(1);
|
|
190
|
+
const [row] = rows;
|
|
191
|
+
expect(row).toMatchObject({ actor: JSON.stringify(owner), operation: 'capabilities.mint-become', entity_type: 'capability' });
|
|
192
|
+
expect(capabilityBecomeMintedPayload.parse(JSON.parse(row.payload))).toEqual({
|
|
193
|
+
capabilityId: cap.id,
|
|
194
|
+
principal: readerTarget,
|
|
195
|
+
expiresAt: null,
|
|
196
|
+
maxUses: 1,
|
|
197
|
+
label: 'member invite',
|
|
198
|
+
mintedBy: owner,
|
|
199
|
+
});
|
|
200
|
+
expect(row.payload).not.toContain(cap.secret);
|
|
201
|
+
});
|
|
202
|
+
it('refuses an expiry in the past, writing nothing', async () => {
|
|
203
|
+
const before = await snapshot();
|
|
204
|
+
await expect(fixture.verbs.mintBecomeCapabilityBounded(t1, s1, owner, {
|
|
205
|
+
principal: readerTarget,
|
|
206
|
+
maxUses: 1,
|
|
207
|
+
expiresAt: new Date(Date.now() - 60_000).toISOString(),
|
|
208
|
+
})).rejects.toThrow(/not in the future/);
|
|
209
|
+
expect(await snapshot()).toEqual(before);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
describe('the exchange', () => {
|
|
213
|
+
it('yields the principal once; the second exchange is refused', async () => {
|
|
214
|
+
const target = await seat();
|
|
215
|
+
const cap = await minted(owner, target);
|
|
216
|
+
expect(await host.exchangeCapability(t1, s1, cap.secret, { mode: 'become' })).toEqual({
|
|
217
|
+
kind: 'principal',
|
|
218
|
+
capabilityId: cap.id,
|
|
219
|
+
principal: target,
|
|
220
|
+
});
|
|
221
|
+
expect(await host.exchangeCapability(t1, s1, cap.secret, { mode: 'become' })).toBeNull();
|
|
222
|
+
});
|
|
223
|
+
it('a share-link exchange of it is refused without spending the use', async () => {
|
|
224
|
+
const cap = await minted(owner, await seat());
|
|
225
|
+
expect(await host.exchangeCapability(t1, s1, cap.secret, { mode: 'act' })).toBeNull();
|
|
226
|
+
expect((await records()).find((r) => r.id === cap.id)?.uses).toBe(0);
|
|
227
|
+
expect((await host.exchangeCapability(t1, s1, cap.secret, { mode: 'become' }))?.kind).toBe('principal');
|
|
228
|
+
});
|
|
229
|
+
it('another scope of the same tenant never knows the secret', async () => {
|
|
230
|
+
const cap = await minted(owner, await seat());
|
|
231
|
+
expect(await host.exchangeCapability(t1, s2, cap.secret, { mode: 'become' })).toBeNull();
|
|
232
|
+
expect((await host.exchangeCapability(t1, s1, cap.secret, { mode: 'become' }))?.kind).toBe('principal');
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
describe('the revoke', () => {
|
|
236
|
+
it('refuses the exchange after it, records the revoker, and is idempotent', async () => {
|
|
237
|
+
const cap = await minted(owner, await seat());
|
|
238
|
+
expect(await fixture.verbs.revokeBecomeCapability(t1, s1, cap.id, owner)).toEqual({ ok: true, revoked: true });
|
|
239
|
+
expect(await host.exchangeCapability(t1, s1, cap.secret, { mode: 'become' })).toBeNull();
|
|
240
|
+
expect((await records()).find((r) => r.id === cap.id)).toMatchObject({ revokedBy: owner, uses: 0, revokedReason: null });
|
|
241
|
+
expect(await fixture.verbs.becomeLinkStates(t1, s1, [cap.id])).toEqual([{ state: 'revoked', reason: null }]);
|
|
242
|
+
expect(await fixture.verbs.revokeBecomeCapability(t1, s1, cap.id, owner)).toEqual({ ok: true, revoked: false });
|
|
243
|
+
});
|
|
244
|
+
it('is bounded in the kernel: a revoker short of what the link\'s principal holds is refused, writing nothing', async () => {
|
|
245
|
+
const cap = await minted(owner, writerTarget);
|
|
246
|
+
expect(await fixture.verbs.revokeBecomeCapability(t1, s1, cap.id, reader)).toEqual({
|
|
247
|
+
ok: false,
|
|
248
|
+
coverage: { covered: false, missing: [WRITE] },
|
|
249
|
+
});
|
|
250
|
+
expect((await records()).find((r) => r.id === cap.id)?.revokedAt).toBeNull();
|
|
251
|
+
expect((await host.exchangeCapability(t1, s1, cap.secret, { mode: 'become' }))?.kind).toBe('principal');
|
|
252
|
+
});
|
|
253
|
+
it('…while one who holds all of it may revoke a link someone else minted', async () => {
|
|
254
|
+
const cap = await minted(owner, await seat());
|
|
255
|
+
expect(await fixture.verbs.revokeBecomeCapability(t1, s1, cap.id, reader)).toEqual({ ok: true, revoked: true });
|
|
256
|
+
expect((await records()).find((r) => r.id === cap.id)).toMatchObject({ revokedBy: reader });
|
|
257
|
+
});
|
|
258
|
+
it('…and the minter may always revoke its own link', async () => {
|
|
259
|
+
const cap = await minted(reader, await seat());
|
|
260
|
+
expect(await fixture.verbs.revokeBecomeCapability(t1, s1, cap.id, reader)).toEqual({ ok: true, revoked: true });
|
|
261
|
+
});
|
|
262
|
+
it('…its live twin reads as open, then as used once exchanged', async () => {
|
|
263
|
+
const cap = await minted(owner, await seat());
|
|
264
|
+
expect(await fixture.verbs.becomeLinkStates(t1, s1, [cap.id])).toEqual([{ state: 'open', reason: null }]);
|
|
265
|
+
expect((await host.exchangeCapability(t1, s1, cap.secret, { mode: 'become' }))?.kind).toBe('principal');
|
|
266
|
+
expect(await fixture.verbs.becomeLinkStates(t1, s1, [cap.id])).toEqual([{ state: 'used', reason: null }]);
|
|
267
|
+
});
|
|
268
|
+
it('never revokes an act share, which keeps working', async () => {
|
|
269
|
+
const share = await (await host.getScope(owner, t1, s1)).invoke('cap/share', {
|
|
270
|
+
entity: folder('F'),
|
|
271
|
+
permissions: [READ],
|
|
272
|
+
});
|
|
273
|
+
expect(await fixture.verbs.revokeBecomeCapability(t1, s1, share.id, owner)).toEqual({ ok: true, revoked: false });
|
|
274
|
+
expect((await host.exchangeCapability(t1, s1, share.secret, { mode: 'act' }))?.kind).toBe('session');
|
|
275
|
+
});
|
|
276
|
+
it('never revokes the platform\'s own become (a claim link), which keeps working', async () => {
|
|
277
|
+
const platform = await host.admin.mintCapability(staff, t1, s1, {
|
|
278
|
+
principal: await seat(),
|
|
279
|
+
maxUses: 1,
|
|
280
|
+
expiresAt: new Date(Date.now() + 60_000).toISOString(),
|
|
281
|
+
});
|
|
282
|
+
expect(await fixture.verbs.revokeBecomeCapability(t1, s1, platform.id, owner)).toEqual({ ok: true, revoked: false });
|
|
283
|
+
expect((await host.exchangeCapability(t1, s1, platform.secret, { mode: 'become' }))?.kind).toBe('principal');
|
|
284
|
+
});
|
|
285
|
+
it('another scope cannot revoke it', async () => {
|
|
286
|
+
const cap = await minted(owner, await seat());
|
|
287
|
+
expect(await fixture.verbs.revokeBecomeCapability(t1, s2, cap.id, owner)).toEqual({ ok: true, revoked: false });
|
|
288
|
+
expect((await host.exchangeCapability(t1, s1, cap.secret, { mode: 'become' }))?.kind).toBe('principal');
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
describe('the link dies when its principal\'s holdings change', () => {
|
|
292
|
+
/** The link is refused, revoked by the kernel (no revoker), and its use never taken. */
|
|
293
|
+
const expectDead = async (cap) => {
|
|
294
|
+
expect(await host.exchangeCapability(t1, s1, cap.secret, { mode: 'become' })).toBeNull();
|
|
295
|
+
expect((await records()).find((r) => r.id === cap.id)).toMatchObject({
|
|
296
|
+
uses: 0,
|
|
297
|
+
revokedBy: null,
|
|
298
|
+
revokedAt: expect.any(String),
|
|
299
|
+
revokedReason: 'holdings-changed',
|
|
300
|
+
});
|
|
301
|
+
// …and a pending-invite list reads it as revoked, with the reason — never as open.
|
|
302
|
+
expect(await fixture.verbs.becomeLinkStates(t1, s1, [cap.id])).toEqual([{ state: 'revoked', reason: 'holdings-changed' }]);
|
|
303
|
+
};
|
|
304
|
+
it('a changed principal\'s link lists as revoked / holdings-changed before anyone tries it — the read writes nothing', async () => {
|
|
305
|
+
const target = await seat();
|
|
306
|
+
const cap = await minted(owner, target);
|
|
307
|
+
await host.admin.assignRole(staff, { principalId: target, roleKey: 'writer', node: node() });
|
|
308
|
+
expect(await fixture.verbs.becomeLinkStates(t1, s1, [cap.id])).toEqual([{ state: 'revoked', reason: 'holdings-changed' }]);
|
|
309
|
+
expect((await records()).find((r) => r.id === cap.id)).toMatchObject({ revokedAt: null, uses: 0 });
|
|
310
|
+
});
|
|
311
|
+
it('(i) a scope-level role raised', async () => {
|
|
312
|
+
const target = await seat();
|
|
313
|
+
const cap = await minted(owner, target);
|
|
314
|
+
await host.admin.assignRole(staff, { principalId: target, roleKey: 'writer', node: node() });
|
|
315
|
+
await expectDead(cap);
|
|
316
|
+
});
|
|
317
|
+
it('(ii) a tenant-level role raised', async () => {
|
|
318
|
+
const target = await seat();
|
|
319
|
+
const cap = await minted(owner, target);
|
|
320
|
+
await host.admin.assignRole(staff, { principalId: target, roleKey: 'writer', node: { tenantId: t1, scopeId: null } });
|
|
321
|
+
await expectDead(cap);
|
|
322
|
+
});
|
|
323
|
+
it('(iii) an org joined that holds more', async () => {
|
|
324
|
+
const target = await seat();
|
|
325
|
+
const org = orgId.parse(ulid());
|
|
326
|
+
await host.admin.createOrg(staff, { id: org, tenantId: t1, slug: `raise-${ulid().toLowerCase()}`, name: 'Raise Org' });
|
|
327
|
+
await host.admin.grantToOrg(staff, org, WRITE, node());
|
|
328
|
+
const cap = await minted(owner, target);
|
|
329
|
+
await host.admin.addMember(staff, t1, target, org);
|
|
330
|
+
await expectDead(cap);
|
|
331
|
+
});
|
|
332
|
+
it('(iv) a role it holds redefined to carry more does NOT kill it: role definitions are the vertical\'s code', async () => {
|
|
333
|
+
const target = p();
|
|
334
|
+
const key = `widening-${ulid().toLowerCase()}`;
|
|
335
|
+
await host.admin.defineRole(staff, t1, { key, permissions: [READ], source: 'vertical' });
|
|
336
|
+
await host.admin.assignRole(staff, { principalId: target, roleKey: key, node: node() });
|
|
337
|
+
const cap = await minted(owner, target);
|
|
338
|
+
await host.admin.defineRole(staff, t1, { key, permissions: [READ, WRITE], source: 'vertical' });
|
|
339
|
+
expect((await host.exchangeCapability(t1, s1, cap.secret, { mode: 'become' }))?.kind).toBe('principal');
|
|
340
|
+
expect((await records()).find((r) => r.id === cap.id)).toMatchObject({ uses: 1, revokedAt: null });
|
|
341
|
+
});
|
|
342
|
+
it('(v) a direct node-level grant added', async () => {
|
|
343
|
+
const target = await seat();
|
|
344
|
+
const cap = await minted(owner, target);
|
|
345
|
+
await host.admin.grant(staff, { principalId: target, permission: WRITE, node: node(), grantedBy: owner });
|
|
346
|
+
await expectDead(cap);
|
|
347
|
+
});
|
|
348
|
+
it('the twin: nothing about its principal changed — another raised meanwhile — and the link exchanges', async () => {
|
|
349
|
+
const target = await seat();
|
|
350
|
+
const bystander = await seat();
|
|
351
|
+
const cap = await minted(owner, target);
|
|
352
|
+
await host.admin.assignRole(staff, { principalId: bystander, roleKey: 'writer', node: node() });
|
|
353
|
+
expect((await host.exchangeCapability(t1, s1, cap.secret, { mode: 'become' }))?.kind).toBe('principal');
|
|
354
|
+
expect((await records()).find((r) => r.id === cap.id)).toMatchObject({ uses: 1, revokedAt: null });
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
describe('a seat already taken', () => {
|
|
358
|
+
it('a target some become link has been exchanged into is refused another — nothing recorded, nothing on the spine', async () => {
|
|
359
|
+
const target = await seat();
|
|
360
|
+
const first = await minted(owner, target);
|
|
361
|
+
expect((await host.exchangeCapability(t1, s1, first.secret, { mode: 'become' }))?.kind).toBe('principal');
|
|
362
|
+
const before = await snapshot();
|
|
363
|
+
expect(await mint(owner, target)).toEqual({ ok: false, refused: 'target-already-claimed' });
|
|
364
|
+
expect(await snapshot()).toEqual(before);
|
|
365
|
+
});
|
|
366
|
+
it('…so is one the platform\'s own become was exchanged into (a claimed owner seat)', async () => {
|
|
367
|
+
const target = await seat();
|
|
368
|
+
const platform = await host.admin.mintCapability(staff, t1, s1, {
|
|
369
|
+
principal: target,
|
|
370
|
+
maxUses: 1,
|
|
371
|
+
expiresAt: new Date(Date.now() + 60_000).toISOString(),
|
|
372
|
+
});
|
|
373
|
+
expect((await host.exchangeCapability(t1, s1, platform.secret, { mode: 'become' }))?.kind).toBe('principal');
|
|
374
|
+
expect(await mint(owner, target)).toEqual({ ok: false, refused: 'target-already-claimed' });
|
|
375
|
+
});
|
|
376
|
+
it('the twin: links never exchanged — open, or revoked — leave the seat untaken, and another is minted', async () => {
|
|
377
|
+
const target = await seat();
|
|
378
|
+
await minted(owner, target);
|
|
379
|
+
const revoked = await minted(owner, target);
|
|
380
|
+
expect(await fixture.verbs.revokeBecomeCapability(t1, s1, revoked.id, owner)).toEqual({ ok: true, revoked: true });
|
|
381
|
+
expect((await mint(owner, target)).ok).toBe(true);
|
|
382
|
+
});
|
|
383
|
+
it('a seat taken in another scope of the tenant is not taken here', async () => {
|
|
384
|
+
const target = await seat();
|
|
385
|
+
await host.admin.assignRole(staff, { principalId: target, roleKey: 'reader', node: node(s2) });
|
|
386
|
+
const there = (await fixture.verbs.mintBecomeCapabilityBounded(t1, s2, owner, { principal: target, maxUses: 1 }));
|
|
387
|
+
// owner holds nothing at s2, so the s2 link is the platform's instead.
|
|
388
|
+
expect(there.ok).toBe(false);
|
|
389
|
+
const platform = await host.admin.mintCapability(staff, t1, s2, {
|
|
390
|
+
principal: target,
|
|
391
|
+
maxUses: 1,
|
|
392
|
+
expiresAt: new Date(Date.now() + 60_000).toISOString(),
|
|
393
|
+
});
|
|
394
|
+
expect((await host.exchangeCapability(t1, s2, platform.secret, { mode: 'become' }))?.kind).toBe('principal');
|
|
395
|
+
expect((await mint(owner, target)).ok).toBe(true);
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
describe('the target\'s holdings reach as the checker\'s do', () => {
|
|
399
|
+
it('a key held only at the tenant node counts: a scope reader is refused, the owner passes', async () => {
|
|
400
|
+
const tenantTarget = p();
|
|
401
|
+
await host.admin.assignRole(staff, { principalId: tenantTarget, roleKey: 'writer', node: { tenantId: t1, scopeId: null } });
|
|
402
|
+
const before = await snapshot();
|
|
403
|
+
expect(await mint(reader, tenantTarget)).toEqual({ ok: false, coverage: { covered: false, missing: [WRITE] } });
|
|
404
|
+
expect(await snapshot()).toEqual(before);
|
|
405
|
+
expect((await mint(owner, tenantTarget)).ok).toBe(true);
|
|
406
|
+
});
|
|
407
|
+
it('an entity-narrowed grant held only through an org counts: the sibling holder is refused, the ancestor holder passes', async () => {
|
|
408
|
+
const orgTarget = p();
|
|
409
|
+
const org = orgId.parse(ulid());
|
|
410
|
+
await host.admin.createOrg(staff, { id: org, tenantId: t1, slug: `become-${ulid().toLowerCase()}`, name: 'Become Org' });
|
|
411
|
+
await host.admin.addMember(staff, t1, orgTarget, org);
|
|
412
|
+
await host.admin.grantToOrg(staff, org, READ, node(), doc('d1'));
|
|
413
|
+
await host.admin.assignRole(staff, { principalId: orgTarget, roleKey: 'member', node: node() });
|
|
414
|
+
const before = await snapshot();
|
|
415
|
+
expect(await mint(siblingReader, orgTarget)).toEqual({ ok: false, coverage: { covered: false, missing: [READ] } });
|
|
416
|
+
expect(await snapshot()).toEqual(before);
|
|
417
|
+
expect((await mint(folderReader, orgTarget)).ok).toBe(true);
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
describe('nothing to become', () => {
|
|
421
|
+
it('a target holding nothing at the node is refused, even by the owner — nothing recorded, nothing on the spine', async () => {
|
|
422
|
+
const before = await snapshot();
|
|
423
|
+
expect(await mint(owner, emptyTarget)).toEqual({ ok: false, refused: 'target-holds-nothing' });
|
|
424
|
+
expect(await mint(nobody, emptyTarget)).toEqual({ ok: false, refused: 'target-holds-nothing' });
|
|
425
|
+
expect(await snapshot()).toEqual(before);
|
|
426
|
+
});
|
|
427
|
+
it('…and so is one holding only an entity-narrowed grant: the node-level set is what must be there', async () => {
|
|
428
|
+
const narrowOnly = p();
|
|
429
|
+
await host.admin.grant(staff, { principalId: narrowOnly, permission: READ, node: node(), entity: doc('d1'), grantedBy: owner });
|
|
430
|
+
expect(await mint(owner, narrowOnly)).toEqual({ ok: false, refused: 'target-holds-nothing' });
|
|
431
|
+
});
|
|
432
|
+
it('the twin: once it holds a role, the same principal is minted for', async () => {
|
|
433
|
+
await host.admin.assignRole(staff, { principalId: emptyTarget, roleKey: 'reader', node: node() });
|
|
434
|
+
expect((await mint(owner, emptyTarget)).ok).toBe(true);
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
describe('the link-state read is capped', () => {
|
|
438
|
+
const ids = (n) => Array.from({ length: n }, () => capabilityId.parse(ulid()));
|
|
439
|
+
it(`answers ${BECOME_LINK_STATES_MAX_IDS} ids — the cap — one state each`, async () => {
|
|
440
|
+
const states = await fixture.verbs.becomeLinkStates(t1, s1, ids(BECOME_LINK_STATES_MAX_IDS));
|
|
441
|
+
expect(states).toHaveLength(BECOME_LINK_STATES_MAX_IDS);
|
|
442
|
+
expect(new Set(states.map((s) => s.state))).toEqual(new Set(['revoked']));
|
|
443
|
+
});
|
|
444
|
+
it('refuses one over the cap rather than truncate', async () => {
|
|
445
|
+
await expect(fixture.verbs.becomeLinkStates(t1, s1, ids(BECOME_LINK_STATES_MAX_IDS + 1))).rejects.toThrow(/ask in pages/);
|
|
446
|
+
});
|
|
447
|
+
});
|
|
448
|
+
describe('tenant isolation', () => {
|
|
449
|
+
it('another tenant\'s name for the scope is refused, writing nothing', async () => {
|
|
450
|
+
const before = await snapshot();
|
|
451
|
+
await expect(mint(owner, readerTarget, s1, t2)).rejects.toThrow();
|
|
452
|
+
expect(await snapshot()).toEqual(before);
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
//# sourceMappingURL=become-mint-suite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"become-mint-suite.js","sourceRoot":"","sources":["../src/become-mint-suite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,YAAY,EACZ,wBAAwB,EACxB,6BAA6B,EAC7B,KAAK,EACL,aAAa,EACb,eAAe,EACf,WAAW,EACX,OAAO,EACP,QAAQ,GAaT,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,IAAI,EAAkB,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AActC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAC/C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAC/C,MAAM,MAAM,GAAG,CAAC,EAAU,EAAa,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AACnF,MAAM,GAAG,GAAG,CAAC,EAAU,EAAa,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AAW7E,MAAM,UAAU,uBAAuB,CACrC,WAAmB,EACnB,WAAyE;IAEzE,QAAQ,CAAC,4CAA4C,WAAW,EAAE,EAAE,GAAG,EAAE;QACvE,IAAI,OAAsD,CAAC;QAC3D,IAAI,IAAe,CAAC;QACpB,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,8BAA8B;QAChE,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,oCAAoC;QACvD,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,eAAe;QACnC,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,gBAAgB;QACpC,MAAM,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC,8DAA8D;QACxF,MAAM,aAAa,GAAG,CAAC,EAAE,CAAC,CAAC,uCAAuC;QAClE,MAAM,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC,eAAe;QACzC,MAAM,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC,eAAe;QACzC,MAAM,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC,uCAAuC;QACjE,MAAM,WAAW,GAAG,CAAC,EAAE,CAAC,CAAC,uDAAuD;QAEhF,MAAM,IAAI,GAAG,CAAC,KAAK,GAAY,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,CAAC,MAAmB,EAAE,SAAsB,EAAE,KAAK,GAAY,EAAE,EAAE,MAAM,GAAa,EAAE,EAAE,EAAE,CACvG,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;QACtH,MAAM,MAAM,GAAG,KAAK,EAAE,MAAmB,EAAE,SAAsB,EAA6B,EAAE;YAC9F,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjF,OAAO,GAAG,CAAC,MAAM,CAAC;QACpB,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,KAAK,EAAE,KAAK,GAAY,EAAE,EAA+B,EAAE,CACzE,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1F,MAAM,MAAM,GAAG,KAAK,IAA0B,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAc,YAAY,CAAC,CAAC;QACxH,oFAAoF;QACpF,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACnG,8GAA8G;QAC9G,MAAM,IAAI,GAAG,KAAK,IAA0B,EAAE;YAC5C,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1F,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QAEF,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;YAC9B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YACpB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC5B,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;YAC/F,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;YAC7F,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;gBAAE,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7E,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;gBACzF,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YAChH,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1G,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACnG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACpG,MAAM,MAAM,GAAG,CAAC,WAAwB,EAAE,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACnI,MAAM,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7B,MAAM,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC/B,MAAM,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YACrC,MAAM,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YACrC,KAAK,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC;gBAAE,MAAM,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACvF,4BAA4B;YAC5B,4BAA4B;YAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAChD,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzE,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzE,MAAM,MAAM,GAAG,CAAC,SAAsB,EAAE,MAAiB,EAAE,EAAE,CAC3D,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YAChH,MAAM,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,MAAM,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACvC,MAAM,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;YAClB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;YACpC,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;gBAC5C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;gBAC7C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;gBAC3G,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChH,MAAM,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;gBACpE,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;gBACrF,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;gBAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClF,MAAM,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;YAClC,EAAE,CAAC,iGAAiG,EAAE,KAAK,IAAI,EAAE;gBAC/G,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;gBAC3F,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtH,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtH,MAAM,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,kGAAkG,EAAE,KAAK,IAAI,EAAE;gBAChH,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrH,MAAM,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;gBACpE,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACxC,IAAI,GAAqB,CAAC;YAC1B,SAAS,CAAC,KAAK,IAAI,EAAE;gBACnB,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;gBAC5D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;YACnC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;gBAC/F,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;oBAC3B,IAAI,EAAE,QAAQ;oBACd,SAAS,EAAE,YAAY;oBACvB,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,eAAe;oBACtB,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,CAAC;oBACV,IAAI,EAAE,CAAC;oBACP,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iGAAiG,EAAE,KAAK,IAAI,EAAE;gBAC/G,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAwB,IAAI,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC3G,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACnB,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;gBAC9H,MAAM,CAAC,6BAA6B,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAI,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;oBAC7E,YAAY,EAAE,GAAG,CAAC,EAAE;oBACpB,SAAS,EAAE,YAAY;oBACvB,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,CAAC;oBACV,KAAK,EAAE,eAAe;oBACtB,QAAQ,EAAE,KAAK;iBAChB,CAAC,CAAC;gBACH,MAAM,CAAC,GAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;gBAC9D,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;gBAChC,MAAM,MAAM,CACV,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE;oBACvD,SAAS,EAAE,YAAY;oBACvB,OAAO,EAAE,CAAC;oBACV,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAa;iBAClE,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;gBACvC,MAAM,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;YAC5B,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;gBACzE,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACxC,MAAM,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;oBACpF,IAAI,EAAE,WAAW;oBACjB,YAAY,EAAE,GAAG,CAAC,EAAE;oBACpB,SAAS,EAAE,MAAM;iBAClB,CAAC,CAAC;gBACH,MAAM,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC3F,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;gBAC/E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC9C,MAAM,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACtF,MAAM,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACrE,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1G,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;gBACvE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC9C,MAAM,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACzF,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1G,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;YAC1B,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;gBACrF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC9C,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/G,MAAM,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACzF,MAAM,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzH,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC7G,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAClH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,2GAA2G,EAAE,KAAK,IAAI,EAAE;gBACzH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;gBAC9C,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;oBACjF,EAAE,EAAE,KAAK;oBACT,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE;iBAC/C,CAAC,CAAC;gBACH,MAAM,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC7E,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1G,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;gBACpF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC9C,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChH,MAAM,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9F,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;gBAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC/C,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAClH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;gBACzE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC9C,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC1G,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxG,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5G,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;gBAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAmB,WAAW,EAAE;oBAC7F,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC;oBACnB,WAAW,EAAE,CAAC,IAAI,CAAC;iBACpB,CAAC,CAAC;gBACH,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClH,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;gBAC5F,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;oBAC9D,SAAS,EAAE,MAAM,IAAI,EAAE;oBACvB,OAAO,EAAE,CAAC;oBACV,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAa;iBAClE,CAAC,CAAC;gBACH,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBACrH,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/G,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;gBAC9C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC9C,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAChH,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1G,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,qDAAqD,EAAE,GAAG,EAAE;YACnE,wFAAwF;YACxF,MAAM,UAAU,GAAG,KAAK,EAAE,GAAqB,EAAE,EAAE;gBACjD,MAAM,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACzF,MAAM,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;oBACnE,IAAI,EAAE,CAAC;oBACP,SAAS,EAAE,IAAI;oBACf,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;oBAC7B,aAAa,EAAE,kBAAkB;iBAClC,CAAC,CAAC;gBACH,mFAAmF;gBACnF,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;YAC7H,CAAC,CAAC;YAEF,EAAE,CAAC,kHAAkH,EAAE,KAAK,IAAI,EAAE;gBAChI,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC7F,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;gBAC3H,MAAM,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACrG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;gBAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC7F,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;gBAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBACtH,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;gBACnD,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;gBACvH,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;gBACnD,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,0GAA0G,EAAE,KAAK,IAAI,EAAE;gBACxH,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,GAAG,GAAG,YAAY,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;gBACzF,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBACxF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;gBAChG,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxG,MAAM,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;gBACnD,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1G,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,mGAAmG,EAAE,KAAK,IAAI,EAAE;gBACjH,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG,MAAM,IAAI,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBAChG,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxG,MAAM,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrG,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;YACpC,EAAE,CAAC,+GAA+G,EAAE,KAAK,IAAI,EAAE;gBAC7H,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC1C,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC1G,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;gBAC5F,MAAM,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;gBAC/F,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;oBAC9D,SAAS,EAAE,MAAM;oBACjB,OAAO,EAAE,CAAC;oBACV,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAa;iBAClE,CAAC,CAAC;gBACH,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC7G,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;YAC9F,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oGAAoG,EAAE,KAAK,IAAI,EAAE;gBAClH,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;gBAC5B,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC5B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC5C,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnH,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;gBAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;gBAC5B,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC/F,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClH,uEAAuE;gBACvE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;oBAC9D,SAAS,EAAE,MAAM;oBACjB,OAAO,EAAE,CAAC;oBACV,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAa;iBAClE,CAAC,CAAC;gBACH,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC7G,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;YACjE,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;gBACtG,MAAM,YAAY,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC5H,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChH,MAAM,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACzC,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qHAAqH,EAAE,KAAK,IAAI,EAAE;gBACnI,MAAM,SAAS,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;gBACzH,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;gBACtD,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjE,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBAChG,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnH,MAAM,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACzC,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;YACjC,EAAE,CAAC,6GAA6G,EAAE,KAAK,IAAI,EAAE;gBAC3H,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;gBAC/F,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;gBAChG,MAAM,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gGAAgG,EAAE,KAAK,IAAI,EAAE;gBAC9G,MAAM,UAAU,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBAChI,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;YAChG,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;gBAChF,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBAClG,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;YAC7C,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACvF,EAAE,CAAC,WAAW,0BAA0B,iCAAiC,EAAE,KAAK,IAAI,EAAE;gBACpF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;gBAC7F,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAAC;gBACxD,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;gBAC7D,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,0BAA0B,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC5H,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;YAChC,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;gBAChF,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;gBAChC,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClE,MAAM,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-attachment-suite.d.ts","sourceRoot":"","sources":["../src/capability-attachment-suite.ts"],"names":[],"mappings":"AA6CA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAwB9D,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAC3C,IAAI,
|
|
1
|
+
{"version":3,"file":"capability-attachment-suite.d.ts","sourceRoot":"","sources":["../src/capability-attachment-suite.ts"],"names":[],"mappings":"AA6CA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAwB9D,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAC3C,IAAI,CAqZN"}
|