lib-fints 1.0.2 → 1.0.3
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/client.js +24 -7
- package/dist/interactions/customerInteraction.js +3 -3
- package/dist/interactions/initDialogInteraction.js +17 -15
- package/dist/types/client.d.ts +1 -1
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/dialog.d.ts.map +1 -1
- package/dist/types/interactions/customerInteraction.d.ts +1 -1
- package/dist/types/interactions/customerInteraction.d.ts.map +1 -1
- package/dist/types/interactions/initDialogInteraction.d.ts +4 -3
- package/dist/types/interactions/initDialogInteraction.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/client.js
CHANGED
|
@@ -3,10 +3,10 @@ import { HKTAB } from './segments/HKTAB.js';
|
|
|
3
3
|
import { StatementInteraction } from './interactions/statementInteraction.js';
|
|
4
4
|
import { BalanceInteraction } from './interactions/balanceInteraction.js';
|
|
5
5
|
import { FinTSConfig } from './config.js';
|
|
6
|
-
import { InitDialogInteraction } from './interactions/initDialogInteraction.js';
|
|
7
6
|
import { TanMediaInteraction } from './interactions/tanMediaInteraction.js';
|
|
8
7
|
import { HKSAL } from './segments/HKSAL.js';
|
|
9
8
|
import { HKKAZ } from './segments/HKKAZ.js';
|
|
9
|
+
import { InitDialogInteraction } from './interactions/initDialogInteraction.js';
|
|
10
10
|
/**
|
|
11
11
|
* A client to communicate with a bank over the FinTS protocol
|
|
12
12
|
*/
|
|
@@ -130,7 +130,7 @@ export class FinTSClient {
|
|
|
130
130
|
}
|
|
131
131
|
async startCustomerOrderInteraction(interaction) {
|
|
132
132
|
const dialog = new Dialog(this.config);
|
|
133
|
-
const syncResponse = await this.initDialog(dialog);
|
|
133
|
+
const syncResponse = await this.initDialog(dialog, false, interaction);
|
|
134
134
|
if (!syncResponse.success || syncResponse.requiresTan) {
|
|
135
135
|
return syncResponse;
|
|
136
136
|
}
|
|
@@ -149,13 +149,30 @@ export class FinTSClient {
|
|
|
149
149
|
throw new Error('No open customer interaction found for TAN reference: ' + tanReference);
|
|
150
150
|
}
|
|
151
151
|
const dialog = interaction.dialog;
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
let responseMessage = await dialog.sendTanMessage(interaction.segId, tanReference, tan);
|
|
153
|
+
let clientResponse = interaction.getClientResponse(responseMessage);
|
|
154
154
|
this.openCustomerInteractions.delete(tanReference);
|
|
155
|
-
|
|
155
|
+
if (!clientResponse.success) {
|
|
156
|
+
await dialog.end();
|
|
157
|
+
return clientResponse;
|
|
158
|
+
}
|
|
159
|
+
if (clientResponse.requiresTan) {
|
|
160
|
+
this.openCustomerInteractions.set(clientResponse.tanReference, interaction);
|
|
161
|
+
return clientResponse;
|
|
162
|
+
}
|
|
163
|
+
const initDialogInteraction = interaction;
|
|
164
|
+
if (initDialogInteraction.followUpInteraction) {
|
|
165
|
+
clientResponse = await dialog.startCustomerOrderInteraction(initDialogInteraction.followUpInteraction);
|
|
166
|
+
if (clientResponse.requiresTan) {
|
|
167
|
+
this.openCustomerInteractions.set(clientResponse.tanReference, initDialogInteraction.followUpInteraction);
|
|
168
|
+
return clientResponse;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
await dialog.end();
|
|
172
|
+
return clientResponse;
|
|
156
173
|
}
|
|
157
|
-
async initDialog(dialog, syncSystemId = false) {
|
|
158
|
-
const interaction = new InitDialogInteraction(this.config, syncSystemId);
|
|
174
|
+
async initDialog(dialog, syncSystemId = false, followUpInteraction) {
|
|
175
|
+
const interaction = new InitDialogInteraction(this.config, syncSystemId, followUpInteraction);
|
|
159
176
|
const initResponse = await dialog.initialize(interaction);
|
|
160
177
|
if (initResponse.requiresTan) {
|
|
161
178
|
this.openCustomerInteractions.set(initResponse.tanReference, interaction);
|
|
@@ -9,10 +9,10 @@ export class CustomerInteraction {
|
|
|
9
9
|
getSegments(init) {
|
|
10
10
|
return this.createSegments(init);
|
|
11
11
|
}
|
|
12
|
-
getClientResponse(
|
|
13
|
-
const clientResponse = this.handleBaseResponse(
|
|
12
|
+
getClientResponse(message) {
|
|
13
|
+
const clientResponse = this.handleBaseResponse(message);
|
|
14
14
|
if (clientResponse.success && !clientResponse.requiresTan) {
|
|
15
|
-
this.handleResponse(
|
|
15
|
+
this.handleResponse(message, clientResponse);
|
|
16
16
|
}
|
|
17
17
|
return clientResponse;
|
|
18
18
|
}
|
|
@@ -13,12 +13,14 @@ import { finTsAccountTypeToEnum } from '../bankAccount.js';
|
|
|
13
13
|
import { HIKIM } from '../segments/HIKIM.js';
|
|
14
14
|
import { HIUPD } from '../segments/HIUPD.js';
|
|
15
15
|
export class InitDialogInteraction extends CustomerInteraction {
|
|
16
|
-
|
|
16
|
+
config;
|
|
17
17
|
syncSystemId;
|
|
18
|
-
|
|
18
|
+
followUpInteraction;
|
|
19
|
+
constructor(config, syncSystemId = false, followUpInteraction) {
|
|
19
20
|
super(HKIDN.Id);
|
|
20
|
-
this.
|
|
21
|
+
this.config = config;
|
|
21
22
|
this.syncSystemId = syncSystemId;
|
|
23
|
+
this.followUpInteraction = followUpInteraction;
|
|
22
24
|
}
|
|
23
25
|
createSegments(init) {
|
|
24
26
|
const segments = [];
|
|
@@ -27,7 +29,7 @@ export class InitDialogInteraction extends CustomerInteraction {
|
|
|
27
29
|
bank: { country: init.countryCode, bankId: init.bankId },
|
|
28
30
|
customerId: init.customerId ?? init.userId ?? '9999999999',
|
|
29
31
|
systemId: init.bankingInformation.systemId,
|
|
30
|
-
systemIdRequired: this.
|
|
32
|
+
systemIdRequired: this.config.userId ? 1 : 0,
|
|
31
33
|
};
|
|
32
34
|
segments.push(hkidn);
|
|
33
35
|
const hkvvb = {
|
|
@@ -39,7 +41,7 @@ export class InitDialogInteraction extends CustomerInteraction {
|
|
|
39
41
|
productVersion: init.productVersion,
|
|
40
42
|
};
|
|
41
43
|
segments.push(hkvvb);
|
|
42
|
-
if (this.syncSystemId && this.
|
|
44
|
+
if (this.syncSystemId && this.config.userId && init.bankingInformation.systemId === '0') {
|
|
43
45
|
const hksyn = {
|
|
44
46
|
header: { segId: HKSYN.Id, segNr: 0, version: HKSYN.Version },
|
|
45
47
|
mode: SyncMode.NewSystemId,
|
|
@@ -49,10 +51,10 @@ export class InitDialogInteraction extends CustomerInteraction {
|
|
|
49
51
|
return segments;
|
|
50
52
|
}
|
|
51
53
|
handleResponse(response, clientResponse) {
|
|
52
|
-
const currentBankingInformationSnapshot = JSON.stringify(this.
|
|
54
|
+
const currentBankingInformationSnapshot = JSON.stringify(this.config.bankingInformation);
|
|
53
55
|
const hisyn = response.findSegment(HISYN.Id);
|
|
54
56
|
if (hisyn && hisyn.systemId) {
|
|
55
|
-
this.
|
|
57
|
+
this.config.bankingInformation.systemId = hisyn.systemId;
|
|
56
58
|
}
|
|
57
59
|
const bankAnswers = clientResponse.bankAnswers;
|
|
58
60
|
const hibpa = response.findSegment(HIBPA.Id);
|
|
@@ -69,7 +71,7 @@ export class InitDialogInteraction extends CustomerInteraction {
|
|
|
69
71
|
tanMediaRequirement: t.tanMediaRequired,
|
|
70
72
|
})) ?? []));
|
|
71
73
|
});
|
|
72
|
-
let bankingUrl = this.
|
|
74
|
+
let bankingUrl = this.config.bankingUrl;
|
|
73
75
|
const hikom = response.findSegment(HIKOM.Id);
|
|
74
76
|
if (hikom) {
|
|
75
77
|
bankingUrl = hikom?.comParams.address;
|
|
@@ -111,12 +113,12 @@ export class InitDialogInteraction extends CustomerInteraction {
|
|
|
111
113
|
availableTanMethodIds: [],
|
|
112
114
|
allowedTransactions: bankTransactions,
|
|
113
115
|
};
|
|
114
|
-
this.
|
|
116
|
+
this.config.bankingInformation.bpd = bpd;
|
|
115
117
|
}
|
|
116
118
|
const tanMethodMessaqe = bankAnswers.find((answer) => answer.code === 3920);
|
|
117
119
|
let availableTanMethodIds = [];
|
|
118
|
-
if (tanMethodMessaqe && this.
|
|
119
|
-
this.
|
|
120
|
+
if (tanMethodMessaqe && this.config.bankingInformation.bpd) {
|
|
121
|
+
this.config.bankingInformation.bpd.availableTanMethodIds =
|
|
120
122
|
tanMethodMessaqe.params?.map((p) => Number.parseInt(p)) ?? [];
|
|
121
123
|
}
|
|
122
124
|
const hiupa = response.findSegment(HIUPA.Id);
|
|
@@ -143,13 +145,13 @@ export class InitDialogInteraction extends CustomerInteraction {
|
|
|
143
145
|
usage: hiupa.updUsage,
|
|
144
146
|
bankAccounts: accounts,
|
|
145
147
|
};
|
|
146
|
-
this.
|
|
148
|
+
this.config.bankingInformation.upd = upd;
|
|
147
149
|
}
|
|
148
150
|
const hikimSegments = response.findAllSegments(HIKIM.Id);
|
|
149
151
|
const bankMessages = hikimSegments.map((s) => ({ subject: s.subject, text: s.text }));
|
|
150
|
-
this.
|
|
151
|
-
clientResponse.bankingInformation = this.
|
|
152
|
+
this.config.bankingInformation.bankMessages = bankMessages;
|
|
153
|
+
clientResponse.bankingInformation = this.config.bankingInformation;
|
|
152
154
|
clientResponse.bankingInformationUpdated =
|
|
153
|
-
currentBankingInformationSnapshot !== JSON.stringify(this.
|
|
155
|
+
currentBankingInformationSnapshot !== JSON.stringify(this.config.bankingInformation);
|
|
154
156
|
}
|
|
155
157
|
}
|
package/dist/types/client.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { StatementResponse } from './interactions/statementInteraction.js';
|
|
2
2
|
import { AccountBalanceResponse } from './interactions/balanceInteraction.js';
|
|
3
3
|
import { FinTSConfig } from './config.js';
|
|
4
|
-
import { InitResponse } from './interactions/initDialogInteraction.js';
|
|
5
4
|
import { TanMethod } from './tanMethod.js';
|
|
5
|
+
import { InitResponse } from './interactions/initDialogInteraction.js';
|
|
6
6
|
export interface SynchronizeResponse extends InitResponse {
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAwB,MAAM,wCAAwC,CAAC;AACjG,OAAO,EAAE,sBAAsB,EAAsB,MAAM,sCAAsC,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAwB,MAAM,wCAAwC,CAAC;AACjG,OAAO,EAAE,sBAAsB,EAAsB,MAAM,sCAAsC,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAyB,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAE9F,MAAM,WAAW,mBAAoB,SAAQ,YAAY;CAAG;AAE5D;;GAEG;AACH,qBAAa,WAAW;IAOJ,MAAM,EAAE,WAAW;IANtC,OAAO,CAAC,wBAAwB,CAA0C;IAE1E;;;OAGG;gBACgB,MAAM,EAAE,WAAW;IAUtC;;;;OAIG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS;IAK/C;;;OAGG;IACH,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAI1C;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAwBjD;;;;;OAKG;IACG,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAIzF;;;;OAIG;IACH,oBAAoB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO;IAMrD;;;;OAIG;IACG,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAI/E;;;;;OAKG;IACG,wBAAwB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAIlG;;;;OAIG;IACH,uBAAuB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO;IAMxD;;;;;;OAMG;IACG,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIrG;;;;;OAKG;IACG,2BAA2B,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAIlF,6BAA6B;YAqB7B,kCAAkC;YA0ClC,UAAU;CAcxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAyC,OAAO,EAAE,MAAM,cAAc,CAAC;AAQ9E,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAyC,OAAO,EAAE,MAAM,cAAc,CAAC;AAQ9E,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAEjG,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAE9F,qBAAa,MAAM;IAOC,MAAM,EAAE,WAAW;IANtC,QAAQ,EAAE,MAAM,CAAO;IACvB,iBAAiB,SAAK;IACtB,aAAa,UAAS;IACtB,QAAQ,UAAS;IACjB,UAAU,EAAE,UAAU,CAAC;gBAEJ,MAAM,EAAE,WAAW;IAQhC,UAAU,CAAC,WAAW,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC;IA0DrE,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;IAuCvB,6BAA6B,CAAC,eAAe,SAAS,cAAc,EACzE,WAAW,EAAE,wBAAwB,GACnC,OAAO,CAAC,eAAe,CAAC;IA+FrB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmDhG,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,aAAa;CAOrB"}
|
|
@@ -29,7 +29,7 @@ export declare abstract class CustomerInteraction {
|
|
|
29
29
|
dialog?: Dialog;
|
|
30
30
|
constructor(segId: string);
|
|
31
31
|
getSegments(init: FinTSConfig): Segment[];
|
|
32
|
-
getClientResponse<TResponse extends ClientResponse>(
|
|
32
|
+
getClientResponse<TResponse extends ClientResponse>(message: Message): TResponse;
|
|
33
33
|
protected abstract createSegments(init: FinTSConfig): Segment[];
|
|
34
34
|
protected abstract handleResponse(response: Message, clientResponse: ClientResponse): void;
|
|
35
35
|
private handleBaseResponse;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customerInteraction.d.ts","sourceRoot":"","sources":["../../../src/interactions/customerInteraction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAIxC;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAc;
|
|
1
|
+
{"version":3,"file":"customerInteraction.d.ts","sourceRoot":"","sources":["../../../src/interactions/customerInteraction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAIxC;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,yBAAyB,EAAE,OAAO,CAAC;IACnC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,8BAAsB,mBAAmB;IAGrB,KAAK,EAAE,MAAM;IAFhC,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEG,KAAK,EAAE,MAAM;IAEhC,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,EAAE;IAIzC,iBAAiB,CAAC,SAAS,SAAS,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS;IAUhF,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,EAAE;IAC/D,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI;IAE1F,OAAO,CAAC,kBAAkB;CA8B1B;AAED,8BAAsB,wBAAyB,SAAQ,mBAAmB;IACvC,aAAa,EAAE,MAAM;gBAA3C,KAAK,EAAE,MAAM,EAAS,aAAa,EAAE,MAAM;CAGvD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ClientResponse, CustomerInteraction } from './customerInteraction.js';
|
|
1
|
+
import { ClientResponse, CustomerInteraction, CustomerOrderInteraction } from './customerInteraction.js';
|
|
2
2
|
import { Message } from '../message.js';
|
|
3
3
|
import { Segment } from '../segment.js';
|
|
4
4
|
import { FinTSConfig } from '../config.js';
|
|
@@ -7,9 +7,10 @@ export interface InitResponse extends ClientResponse {
|
|
|
7
7
|
bankingInformation?: BankingInformation;
|
|
8
8
|
}
|
|
9
9
|
export declare class InitDialogInteraction extends CustomerInteraction {
|
|
10
|
-
|
|
10
|
+
config: FinTSConfig;
|
|
11
11
|
syncSystemId: boolean;
|
|
12
|
-
|
|
12
|
+
followUpInteraction?: CustomerOrderInteraction | undefined;
|
|
13
|
+
constructor(config: FinTSConfig, syncSystemId?: boolean, followUpInteraction?: CustomerOrderInteraction | undefined);
|
|
13
14
|
createSegments(init: FinTSConfig): Segment[];
|
|
14
15
|
handleResponse(response: Message, clientResponse: InitResponse): void;
|
|
15
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initDialogInteraction.d.ts","sourceRoot":"","sources":["../../../src/interactions/initDialogInteraction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"initDialogInteraction.d.ts","sourceRoot":"","sources":["../../../src/interactions/initDialogInteraction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAe,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAiB3E,MAAM,WAAW,YAAa,SAAQ,cAAc;IACnD,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;CACxC;AAED,qBAAa,qBAAsB,SAAQ,mBAAmB;IAErD,MAAM,EAAE,WAAW;IACnB,YAAY;IACZ,mBAAmB,CAAC;gBAFpB,MAAM,EAAE,WAAW,EACnB,YAAY,UAAQ,EACpB,mBAAmB,CAAC,sCAA0B;IAKtD,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,EAAE;IAoC5C,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY;CA8H9D"}
|