@nangohq/runner-sdk 0.70.6 → 0.70.8

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.
@@ -1,182 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
- function makeProps() {
3
- // Only the fields used by the base constructor are required for these tests.
4
- return {
5
- connectionId: 'connection-id',
6
- team: { id: 1, name: 'test-team' },
7
- environmentId: 1,
8
- providerConfigKey: 'provider-config-key',
9
- activityLogId: 'activity-log-id',
10
- runnerFlags: {},
11
- scriptType: 'action',
12
- isCLI: false
13
- };
14
- }
15
- async function makeActionInstance() {
16
- const mod = await import('./action.js');
17
- const { NangoActionBase } = mod;
18
- class TestAction extends NangoActionBase {
19
- // minimal shape for places that may touch user agent
20
- nango = { userAgent: 'runner-sdk-test' };
21
- proxy() {
22
- throw new Error('not implemented');
23
- }
24
- log() {
25
- return;
26
- }
27
- triggerSync() {
28
- throw new Error('not implemented');
29
- }
30
- startSync() {
31
- throw new Error('not implemented');
32
- }
33
- tryAcquireLock() {
34
- return Promise.resolve(false);
35
- }
36
- async releaseLock() {
37
- return Promise.resolve(false);
38
- }
39
- async releaseAllLocks() {
40
- return Promise.resolve();
41
- }
42
- async getCheckpoint() {
43
- return Promise.resolve(null);
44
- }
45
- async saveCheckpoint() {
46
- return Promise.resolve();
47
- }
48
- async clearCheckpoint() {
49
- return Promise.resolve();
50
- }
51
- }
52
- return { action: new TestAction(makeProps()) };
53
- }
54
- describe('uncontrolledFetch', () => {
55
- beforeEach(() => {
56
- vi.resetModules();
57
- delete process.env['NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST'];
58
- delete process.env['AWS_LAMBDA_RUNTIME_API'];
59
- });
60
- afterEach(() => {
61
- vi.restoreAllMocks();
62
- vi.unstubAllGlobals();
63
- delete process.env['NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST'];
64
- delete process.env['AWS_LAMBDA_RUNTIME_API'];
65
- });
66
- it('rejects redirects to non-HTTP(S) schemes', async () => {
67
- const fetchMock = vi.fn().mockResolvedValue(new Response(null, { status: 302, headers: { Location: 'data:text/plain,hello' } }));
68
- vi.stubGlobal('fetch', fetchMock);
69
- const { action } = await makeActionInstance();
70
- await expect(action.uncontrolledFetch({ url: new URL('https://example.com/start') })).rejects.toMatchObject({
71
- type: 'action_script_runtime_error',
72
- payload: { code: 'invalid_redirect' }
73
- });
74
- });
75
- it('blocks a redirect hop to a denylisted host', async () => {
76
- process.env['NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST'] = JSON.stringify(['metadata.google.internal']);
77
- const fetchMock = vi
78
- .fn()
79
- .mockResolvedValue(new Response(null, { status: 302, headers: { Location: 'https://metadata.google.internal/latest/meta-data/' } }));
80
- vi.stubGlobal('fetch', fetchMock);
81
- const { action } = await makeActionInstance();
82
- await expect(action.uncontrolledFetch({
83
- url: new URL('https://example.com/start')
84
- })).rejects.toMatchObject({ type: 'action_script_runtime_error', payload: { code: 'url_not_allowed' } });
85
- expect(fetchMock).toHaveBeenCalledTimes(1);
86
- });
87
- it('strips sensitive headers when redirecting to a different origin', async () => {
88
- const fetchMock = vi
89
- .fn()
90
- .mockResolvedValueOnce(new Response(null, { status: 302, headers: { Location: 'https://b.example/next' } }))
91
- .mockResolvedValueOnce(new Response('ok', { status: 200 }));
92
- vi.stubGlobal('fetch', fetchMock);
93
- const { action } = await makeActionInstance();
94
- const res = await action.uncontrolledFetch({
95
- url: new URL('https://a.example/start'),
96
- headers: { Authorization: 'Bearer secret', 'X-Test': '1' }
97
- });
98
- expect(await res.text()).toBe('ok');
99
- expect(fetchMock).toHaveBeenCalledTimes(2);
100
- const secondCallInit = fetchMock.mock.calls[1][1];
101
- const headers = secondCallInit.headers;
102
- expect(headers.get('authorization')).toBeNull();
103
- expect(headers.get('cookie')).toBeNull();
104
- expect(headers.get('proxy-authorization')).toBeNull();
105
- expect(headers.get('x-test')).toBe('1');
106
- });
107
- it('preserves redirect response body when status is 3xx without Location', async () => {
108
- const fetchMock = vi.fn().mockResolvedValue(new Response('diagnostic payload', { status: 302 }));
109
- vi.stubGlobal('fetch', fetchMock);
110
- const { action } = await makeActionInstance();
111
- const res = await action.uncontrolledFetch({ url: new URL('https://example.com/redirect-without-location') });
112
- expect(res.status).toBe(302);
113
- expect(await res.text()).toBe('diagnostic payload');
114
- expect(fetchMock).toHaveBeenCalledTimes(1);
115
- });
116
- it('preserves non-POST methods on 301/302 redirects (e.g. PUT)', async () => {
117
- const fetchMock = vi
118
- .fn()
119
- .mockResolvedValueOnce(new Response(null, { status: 301, headers: { Location: 'https://example.com/next' } }))
120
- .mockResolvedValueOnce(new Response('ok', { status: 200 }));
121
- vi.stubGlobal('fetch', fetchMock);
122
- const { action } = await makeActionInstance();
123
- const res = await action.uncontrolledFetch({
124
- url: new URL('https://example.com/start'),
125
- method: 'PUT',
126
- body: 'body',
127
- headers: { 'content-type': 'text/plain' }
128
- });
129
- expect(await res.text()).toBe('ok');
130
- const secondCallInit = fetchMock.mock.calls[1][1];
131
- expect(secondCallInit.method).toBe('PUT');
132
- expect(secondCallInit.body).toBe('body');
133
- expect(secondCallInit.headers.get('content-type')).toBe('text/plain');
134
- });
135
- it('rewrites POST to GET on 302 and drops request-body headers', async () => {
136
- const fetchMock = vi
137
- .fn()
138
- .mockResolvedValueOnce(new Response(null, { status: 302, headers: { Location: 'https://example.com/next' } }))
139
- .mockResolvedValueOnce(new Response('ok', { status: 200 }));
140
- vi.stubGlobal('fetch', fetchMock);
141
- const { action } = await makeActionInstance();
142
- const res = await action.uncontrolledFetch({
143
- url: new URL('https://example.com/start'),
144
- method: 'POST',
145
- body: 'hello',
146
- headers: {
147
- 'content-type': 'application/json',
148
- 'content-language': 'en',
149
- 'content-encoding': 'gzip',
150
- 'x-test': '1'
151
- }
152
- });
153
- expect(await res.text()).toBe('ok');
154
- const secondCallInit = fetchMock.mock.calls[1][1];
155
- expect(secondCallInit.method).toBe('GET');
156
- expect(secondCallInit.body).toBeUndefined();
157
- const headers = secondCallInit.headers;
158
- expect(headers.get('content-type')).toBeNull();
159
- expect(headers.get('content-language')).toBeNull();
160
- expect(headers.get('content-encoding')).toBeNull();
161
- expect(headers.get('x-test')).toBe('1');
162
- });
163
- it('preserves GET on 303 redirects (no forced rewrite)', async () => {
164
- const fetchMock = vi
165
- .fn()
166
- .mockResolvedValueOnce(new Response(null, { status: 303, headers: { Location: 'https://example.com/next' } }))
167
- .mockResolvedValueOnce(new Response(null, { status: 200 }));
168
- vi.stubGlobal('fetch', fetchMock);
169
- const { action } = await makeActionInstance();
170
- const res = await action.uncontrolledFetch({
171
- url: new URL('https://example.com/start'),
172
- method: 'GET',
173
- headers: { authorization: 'Bearer secret' }
174
- });
175
- expect(res.status).toBe(200);
176
- expect(fetchMock).toHaveBeenCalledTimes(2);
177
- const secondCallInit = fetchMock.mock.calls[1][1];
178
- expect(secondCallInit.method).toBe('GET');
179
- expect(secondCallInit.body).toBeUndefined();
180
- });
181
- });
182
- //# sourceMappingURL=action.uncontrolledFetch.unit.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"action.uncontrolledFetch.unit.test.js","sourceRoot":"","sources":["../lib/action.uncontrolledFetch.unit.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAIzE,SAAS,SAAS;IACd,6EAA6E;IAC7E,OAAO;QACH,YAAY,EAAE,eAAe;QAC7B,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE;QAClC,aAAa,EAAE,CAAC;QAChB,iBAAiB,EAAE,qBAAqB;QACxC,aAAa,EAAE,iBAAiB;QAChC,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,QAAQ;QACpB,KAAK,EAAE,KAAK;KACU,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC7B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACxC,MAAM,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;IAEhC,MAAM,UAAW,SAAQ,eAAe;QACpC,qDAAqD;QACrD,KAAK,GAAG,EAAE,SAAS,EAAE,iBAAiB,EAAS,CAAC;QAEhD,KAAK;YACD,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACvC,CAAC;QAED,GAAG;YACC,OAAO;QACX,CAAC;QAED,WAAW;YACP,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACvC,CAAC;QAED,SAAS;YACL,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACvC,CAAC;QAED,cAAc;YACV,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QAED,KAAK,CAAC,WAAW;YACb,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QAED,KAAK,CAAC,eAAe;YACjB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;QAED,KAAK,CAAC,aAAa;YACf,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QAED,KAAK,CAAC,cAAc;YAChB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;QAED,KAAK,CAAC,eAAe;YACjB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;KACJ;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;AACnD,CAAC;AAED,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,UAAU,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QAC7D,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QAC7D,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,uBAAuB,EAAE,EAAE,CAAC,CAAC,CAAC;QACjI,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAgB,CAAC,CAAC;QAEzC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAE9C,MAAM,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YACxG,IAAI,EAAE,6BAA6B;YACnC,OAAO,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QACxD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACrG,MAAM,SAAS,GAAG,EAAE;aACf,EAAE,EAAE;aACJ,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,oDAAoD,EAAE,EAAE,CAAC,CAAC,CAAC;QACzI,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAgB,CAAC,CAAC;QAEzC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAE9C,MAAM,MAAM,CACR,MAAM,CAAC,iBAAiB,CAAC;YACrB,GAAG,EAAE,IAAI,GAAG,CAAC,2BAA2B,CAAC;SAC5C,CAAC,CACL,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;QAEvG,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,SAAS,GAAG,EAAE;aACf,EAAE,EAAE;aACJ,qBAAqB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,wBAAwB,EAAE,EAAE,CAAC,CAAC;aAC3G,qBAAqB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAChE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAgB,CAAC,CAAC;QAEzC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAE9C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC;YACvC,GAAG,EAAE,IAAI,GAAG,CAAC,yBAAyB,CAAC;YACvC,OAAO,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,EAAE;SAC7D,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE3C,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAgB,CAAC;QAClE,MAAM,OAAO,GAAG,cAAc,CAAC,OAAkB,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACjG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAgB,CAAC,CAAC;QAEzC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,+CAA+C,CAAC,EAAE,CAAC,CAAC;QAE9G,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,SAAS,GAAG,EAAE;aACf,EAAE,EAAE;aACJ,qBAAqB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAC;aAC7G,qBAAqB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAChE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAgB,CAAC,CAAC;QAEzC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC;YACvC,GAAG,EAAE,IAAI,GAAG,CAAC,2BAA2B,CAAC;YACzC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE;SAC5C,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAgB,CAAC;QAClE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAE,cAAc,CAAC,OAAmB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,SAAS,GAAG,EAAE;aACf,EAAE,EAAE;aACJ,qBAAqB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAC;aAC7G,qBAAqB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAChE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAgB,CAAC,CAAC;QAEzC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC;YACvC,GAAG,EAAE,IAAI,GAAG,CAAC,2BAA2B,CAAC;YACzC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO;YACb,OAAO,EAAE;gBACL,cAAc,EAAE,kBAAkB;gBAClC,kBAAkB,EAAE,IAAI;gBACxB,kBAAkB,EAAE,MAAM;gBAC1B,QAAQ,EAAE,GAAG;aAChB;SACJ,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAgB,CAAC;QAClE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,OAAO,GAAG,cAAc,CAAC,OAAkB,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,SAAS,GAAG,EAAE;aACf,EAAE,EAAE;aACJ,qBAAqB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAC;aAC7G,qBAAqB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAChE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAgB,CAAC,CAAC;QAEzC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC;YACvC,GAAG,EAAE,IAAI,GAAG,CAAC,2BAA2B,CAAC;YACzC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE;SAC9C,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE3C,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAgB,CAAC;QAClE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}