@pagopa/io-react-native-wallet 0.5.0 → 0.6.1

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.
Files changed (64) hide show
  1. package/README.md +52 -19
  2. package/lib/commonjs/index.js +34 -18
  3. package/lib/commonjs/index.js.map +1 -1
  4. package/lib/commonjs/pid/issuing.js +22 -28
  5. package/lib/commonjs/pid/issuing.js.map +1 -1
  6. package/lib/commonjs/rp/__test__/index.test.js +2 -2
  7. package/lib/commonjs/rp/__test__/index.test.js.map +1 -1
  8. package/lib/commonjs/rp/index.js +5 -19
  9. package/lib/commonjs/rp/index.js.map +1 -1
  10. package/lib/commonjs/rp/types.js +1 -21
  11. package/lib/commonjs/rp/types.js.map +1 -1
  12. package/lib/commonjs/trust/index.js +24 -5
  13. package/lib/commonjs/trust/index.js.map +1 -1
  14. package/lib/commonjs/trust/types.js +95 -4
  15. package/lib/commonjs/trust/types.js.map +1 -1
  16. package/lib/commonjs/wallet-instance-attestation/issuing.js +5 -13
  17. package/lib/commonjs/wallet-instance-attestation/issuing.js.map +1 -1
  18. package/lib/module/index.js +3 -5
  19. package/lib/module/index.js.map +1 -1
  20. package/lib/module/pid/issuing.js +16 -23
  21. package/lib/module/pid/issuing.js.map +1 -1
  22. package/lib/module/rp/__test__/index.test.js +2 -2
  23. package/lib/module/rp/__test__/index.test.js.map +1 -1
  24. package/lib/module/rp/index.js +2 -17
  25. package/lib/module/rp/index.js.map +1 -1
  26. package/lib/module/rp/types.js +0 -20
  27. package/lib/module/rp/types.js.map +1 -1
  28. package/lib/module/trust/index.js +19 -5
  29. package/lib/module/trust/index.js.map +1 -1
  30. package/lib/module/trust/types.js +94 -2
  31. package/lib/module/trust/types.js.map +1 -1
  32. package/lib/module/wallet-instance-attestation/issuing.js +5 -13
  33. package/lib/module/wallet-instance-attestation/issuing.js.map +1 -1
  34. package/lib/typescript/index.d.ts +3 -5
  35. package/lib/typescript/index.d.ts.map +1 -1
  36. package/lib/typescript/pid/issuing.d.ts +3 -12
  37. package/lib/typescript/pid/issuing.d.ts.map +1 -1
  38. package/lib/typescript/rp/index.d.ts +4 -12
  39. package/lib/typescript/rp/index.d.ts.map +1 -1
  40. package/lib/typescript/rp/types.d.ts +4 -1256
  41. package/lib/typescript/rp/types.d.ts.map +1 -1
  42. package/lib/typescript/trust/index.d.ts +806 -3
  43. package/lib/typescript/trust/index.d.ts.map +1 -1
  44. package/lib/typescript/trust/types.d.ts +8637 -5
  45. package/lib/typescript/trust/types.d.ts.map +1 -1
  46. package/lib/typescript/wallet-instance-attestation/issuing.d.ts +2 -1
  47. package/lib/typescript/wallet-instance-attestation/issuing.d.ts.map +1 -1
  48. package/lib/typescript/wallet-instance-attestation/types.d.ts +4 -4
  49. package/package.json +1 -1
  50. package/src/index.ts +19 -10
  51. package/src/pid/issuing.ts +24 -30
  52. package/src/rp/__test__/index.test.ts +2 -2
  53. package/src/rp/index.ts +8 -22
  54. package/src/rp/types.ts +0 -24
  55. package/src/trust/index.ts +106 -5
  56. package/src/trust/types.ts +114 -3
  57. package/src/wallet-instance-attestation/issuing.ts +10 -15
  58. package/lib/commonjs/pid/metadata.js +0 -52
  59. package/lib/commonjs/pid/metadata.js.map +0 -1
  60. package/lib/module/pid/metadata.js +0 -44
  61. package/lib/module/pid/metadata.js.map +0 -1
  62. package/lib/typescript/pid/metadata.d.ts +0 -1412
  63. package/lib/typescript/pid/metadata.d.ts.map +0 -1
  64. package/src/pid/metadata.ts +0 -51
@@ -5,6 +5,29 @@ import * as z from "zod";
5
5
  export const TrustMark = z.object({ id: z.string(), trust_mark: z.string() });
6
6
  export type TrustMark = z.infer<typeof TrustMark>;
7
7
 
8
+ // Display metadata for a credential, used by the issuer to
9
+ // instruct the Wallet Solution on how to render the credential correctly
10
+ type CredentialDisplayMetadata = z.infer<typeof CredentialDisplayMetadata>;
11
+ const CredentialDisplayMetadata = z.object({
12
+ name: z.string(),
13
+ locale: z.string(),
14
+ logo: z.object({
15
+ url: z.string(),
16
+ alt_text: z.string(),
17
+ }),
18
+ background_color: z.string(),
19
+ text_color: z.string(),
20
+ });
21
+
22
+ // Metadata for a credentia which i supported by a Issuer
23
+ type SupportedCredentialMetadata = z.infer<typeof SupportedCredentialMetadata>;
24
+ const SupportedCredentialMetadata = z.object({
25
+ format: z.literal("vc+sd-jwt"),
26
+ cryptographic_binding_methods_supported: z.array(z.string()),
27
+ cryptographic_suites_supported: z.array(z.string()),
28
+ display: z.array(CredentialDisplayMetadata),
29
+ });
30
+
8
31
  export type EntityStatement = z.infer<typeof EntityStatement>;
9
32
  export const EntityStatement = z.object({
10
33
  header: z.object({
@@ -31,8 +54,8 @@ export const EntityConfigurationHeader = z.object({
31
54
  kid: z.string(),
32
55
  });
33
56
 
34
- export type EntityConfiguration = z.infer<typeof EntityConfiguration>;
35
- export const EntityConfiguration = z.object({
57
+ // Structuire common to every Entity Configuration document
58
+ const BaseEntityConfiguration = z.object({
36
59
  header: EntityConfigurationHeader,
37
60
  payload: z
38
61
  .object({
@@ -65,7 +88,95 @@ export const EntityConfiguration = z.object({
65
88
  .passthrough(),
66
89
  });
67
90
 
91
+ // Entity configuration for a Trust Anchor (it has no specific metadata section)
68
92
  export type TrustAnchorEntityConfiguration = z.infer<
69
93
  typeof TrustAnchorEntityConfiguration
70
94
  >;
71
- export const TrustAnchorEntityConfiguration = EntityConfiguration;
95
+ export const TrustAnchorEntityConfiguration = BaseEntityConfiguration;
96
+
97
+ // Entity configuration for a Credential Issuer
98
+ export type CredentialIssuerEntityConfiguration = z.infer<
99
+ typeof CredentialIssuerEntityConfiguration
100
+ >;
101
+ export const CredentialIssuerEntityConfiguration = BaseEntityConfiguration.and(
102
+ z.object({
103
+ payload: z.object({
104
+ jwks: z.object({ keys: z.array(JWK) }),
105
+ metadata: z.object({
106
+ openid_credential_issuer: z.object({
107
+ credential_issuer: z.string(),
108
+ authorization_endpoint: z.string(),
109
+ token_endpoint: z.string(),
110
+ pushed_authorization_request_endpoint: z.string(),
111
+ dpop_signing_alg_values_supported: z.array(z.string()),
112
+ credential_endpoint: z.string(),
113
+ credentials_supported: z.array(SupportedCredentialMetadata),
114
+ jwks: z.object({ keys: z.array(JWK) }),
115
+ }),
116
+ }),
117
+ }),
118
+ })
119
+ );
120
+
121
+ // Entity configuration for a Wallet Provider
122
+ export type WalletProviderEntityConfiguration = z.infer<
123
+ typeof WalletProviderEntityConfiguration
124
+ >;
125
+ export const WalletProviderEntityConfiguration = BaseEntityConfiguration.and(
126
+ z.object({
127
+ payload: z.object({
128
+ metadata: z.object({
129
+ wallet_provider: z
130
+ .object({
131
+ token_endpoint: z.string(),
132
+ attested_security_context_values_supported: z
133
+ .array(z.string())
134
+ .optional(),
135
+ grant_types_supported: z.array(z.string()),
136
+ token_endpoint_auth_methods_supported: z.array(z.string()),
137
+ token_endpoint_auth_signing_alg_values_supported: z.array(
138
+ z.string()
139
+ ),
140
+ jwks: z.object({ keys: z.array(JWK) }),
141
+ })
142
+ .passthrough(),
143
+ }),
144
+ }),
145
+ })
146
+ );
147
+
148
+ // Entity configuration for a Relying Party
149
+ export type RelyingPartyEntityConfiguration = z.infer<
150
+ typeof RelyingPartyEntityConfiguration
151
+ >;
152
+ export const RelyingPartyEntityConfiguration = BaseEntityConfiguration.and(
153
+ z.object({
154
+ payload: z.object({
155
+ metadata: z.object({
156
+ wallet_relying_party: z
157
+ .object({
158
+ application_type: z.string().optional(),
159
+ client_id: z.string().optional(),
160
+ client_name: z.string().optional(),
161
+ jwks: z.array(JWK),
162
+ contacts: z.array(z.string()).optional(),
163
+ })
164
+ .passthrough(),
165
+ }),
166
+ }),
167
+ })
168
+ );
169
+
170
+ // Maps any entity configuration by the union of every possible shapes
171
+ export type EntityConfiguration = z.infer<typeof EntityConfiguration>;
172
+ export const EntityConfiguration = z.union(
173
+ [
174
+ WalletProviderEntityConfiguration,
175
+ CredentialIssuerEntityConfiguration,
176
+ TrustAnchorEntityConfiguration,
177
+ RelyingPartyEntityConfiguration,
178
+ ],
179
+ {
180
+ description: "Any kind of Entity Configuration allowed in the ecosystem",
181
+ }
182
+ );
@@ -8,10 +8,11 @@ import { JWK, fixBase64EncodingOnKey } from "../utils/jwk";
8
8
  import { WalletInstanceAttestationRequestJwt } from "./types";
9
9
  import uuid from "react-native-uuid";
10
10
  import { WalletInstanceAttestationIssuingError } from "../utils/errors";
11
+ import type { WalletProviderEntityConfiguration } from "../trust/types";
11
12
 
12
13
  async function getAttestationRequest(
13
14
  wiaCryptoContext: CryptoContext,
14
- walletProviderBaseUrl: string
15
+ walletProviderEntityConfiguration: WalletProviderEntityConfiguration
15
16
  ): Promise<string> {
16
17
  const jwk = await wiaCryptoContext.getPublicKey();
17
18
  const parsedJwk = JWK.parse(jwk);
@@ -21,7 +22,7 @@ async function getAttestationRequest(
21
22
  return new SignJWT(wiaCryptoContext)
22
23
  .setPayload({
23
24
  iss: keyThumbprint,
24
- aud: walletProviderBaseUrl,
25
+ aud: walletProviderEntityConfiguration.payload.iss,
25
26
  jti: `${uuid.v4()}`,
26
27
  nonce: `${uuid.v4()}`,
27
28
  cnf: {
@@ -32,16 +33,6 @@ async function getAttestationRequest(
32
33
  kid: publicKey.kid,
33
34
  typ: "wiar+jwt",
34
35
  })
35
- .setPayload({
36
- iss: keyThumbprint,
37
- sub: walletProviderBaseUrl,
38
- jti: `${uuid.v4()}`,
39
- type: "WalletInstanceAttestationRequest",
40
- cnf: {
41
- jwk: fixBase64EncodingOnKey(publicKey),
42
- },
43
- })
44
-
45
36
  .setIssuedAt()
46
37
  .setExpirationTime("1h")
47
38
  .sign();
@@ -63,10 +54,12 @@ export const getAttestation =
63
54
  wiaCryptoContext: CryptoContext;
64
55
  appFetch?: GlobalFetch["fetch"];
65
56
  }) =>
66
- async (walletProviderBaseUrl: string): Promise<string> => {
57
+ async (
58
+ walletProviderEntityConfiguration: WalletProviderEntityConfiguration
59
+ ): Promise<string> => {
67
60
  const signedAttestationRequest = await getAttestationRequest(
68
61
  wiaCryptoContext,
69
- walletProviderBaseUrl
62
+ walletProviderEntityConfiguration
70
63
  );
71
64
 
72
65
  const decodedRequest = decodeJwt(signedAttestationRequest);
@@ -78,7 +71,9 @@ export const getAttestation =
78
71
 
79
72
  await verifyJwt(signedAttestationRequest, publicKey);
80
73
 
81
- const tokenUrl = new URL("token", walletProviderBaseUrl).href;
74
+ const tokenUrl =
75
+ walletProviderEntityConfiguration.payload.metadata.wallet_provider
76
+ .token_endpoint;
82
77
  const requestBody = {
83
78
  grant_type:
84
79
  "urn:ietf:params:oauth:client-assertion-type:jwt-client-attestation",
@@ -1,52 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.PidIssuerEntityConfiguration = exports.PidDisplayMetadata = void 0;
7
- var _types = require("../trust/types");
8
- var _jwk = require("../utils/jwk");
9
- var _zod = require("zod");
10
- const PidDisplayMetadata = _zod.z.object({
11
- name: _zod.z.string(),
12
- locale: _zod.z.string(),
13
- logo: _zod.z.object({
14
- url: _zod.z.string(),
15
- alt_text: _zod.z.string()
16
- }),
17
- background_color: _zod.z.string(),
18
- text_color: _zod.z.string()
19
- });
20
- exports.PidDisplayMetadata = PidDisplayMetadata;
21
- const PidIssuerEntityConfiguration = _types.EntityConfiguration.and(_zod.z.object({
22
- payload: _zod.z.object({
23
- jwks: _zod.z.object({
24
- keys: _zod.z.array(_jwk.JWK)
25
- }),
26
- metadata: _zod.z.object({
27
- openid_credential_issuer: _zod.z.object({
28
- credential_issuer: _zod.z.string(),
29
- authorization_endpoint: _zod.z.string(),
30
- token_endpoint: _zod.z.string(),
31
- pushed_authorization_request_endpoint: _zod.z.string(),
32
- dpop_signing_alg_values_supported: _zod.z.array(_zod.z.string()),
33
- credential_endpoint: _zod.z.string(),
34
- credentials_supported: _zod.z.array(_zod.z.object({
35
- format: _zod.z.literal("vc+sd-jwt"),
36
- cryptographic_binding_methods_supported: _zod.z.array(_zod.z.string()),
37
- cryptographic_suites_supported: _zod.z.array(_zod.z.string()),
38
- display: _zod.z.array(PidDisplayMetadata)
39
- }))
40
- }),
41
- federation_entity: _zod.z.object({
42
- organization_name: _zod.z.string(),
43
- homepage_uri: _zod.z.string(),
44
- policy_uri: _zod.z.string(),
45
- tos_uri: _zod.z.string(),
46
- logo_uri: _zod.z.string()
47
- })
48
- })
49
- })
50
- }));
51
- exports.PidIssuerEntityConfiguration = PidIssuerEntityConfiguration;
52
- //# sourceMappingURL=metadata.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_types","require","_jwk","_zod","PidDisplayMetadata","z","object","name","string","locale","logo","url","alt_text","background_color","text_color","exports","PidIssuerEntityConfiguration","EntityConfiguration","and","payload","jwks","keys","array","JWK","metadata","openid_credential_issuer","credential_issuer","authorization_endpoint","token_endpoint","pushed_authorization_request_endpoint","dpop_signing_alg_values_supported","credential_endpoint","credentials_supported","format","literal","cryptographic_binding_methods_supported","cryptographic_suites_supported","display","federation_entity","organization_name","homepage_uri","policy_uri","tos_uri","logo_uri"],"sourceRoot":"../../../src","sources":["pid/metadata.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AACA,IAAAE,IAAA,GAAAF,OAAA;AAGO,MAAMG,kBAAkB,GAAGC,MAAC,CAACC,MAAM,CAAC;EACzCC,IAAI,EAAEF,MAAC,CAACG,MAAM,CAAC,CAAC;EAChBC,MAAM,EAAEJ,MAAC,CAACG,MAAM,CAAC,CAAC;EAClBE,IAAI,EAAEL,MAAC,CAACC,MAAM,CAAC;IACbK,GAAG,EAAEN,MAAC,CAACG,MAAM,CAAC,CAAC;IACfI,QAAQ,EAAEP,MAAC,CAACG,MAAM,CAAC;EACrB,CAAC,CAAC;EACFK,gBAAgB,EAAER,MAAC,CAACG,MAAM,CAAC,CAAC;EAC5BM,UAAU,EAAET,MAAC,CAACG,MAAM,CAAC;AACvB,CAAC,CAAC;AAACO,OAAA,CAAAX,kBAAA,GAAAA,kBAAA;AAKI,MAAMY,4BAA4B,GAAGC,0BAAmB,CAACC,GAAG,CACjEb,MAAC,CAACC,MAAM,CAAC;EACPa,OAAO,EAAEd,MAAC,CAACC,MAAM,CAAC;IAChBc,IAAI,EAAEf,MAAC,CAACC,MAAM,CAAC;MAAEe,IAAI,EAAEhB,MAAC,CAACiB,KAAK,CAACC,QAAG;IAAE,CAAC,CAAC;IACtCC,QAAQ,EAAEnB,MAAC,CAACC,MAAM,CAAC;MACjBmB,wBAAwB,EAAEpB,MAAC,CAACC,MAAM,CAAC;QACjCoB,iBAAiB,EAAErB,MAAC,CAACG,MAAM,CAAC,CAAC;QAC7BmB,sBAAsB,EAAEtB,MAAC,CAACG,MAAM,CAAC,CAAC;QAClCoB,cAAc,EAAEvB,MAAC,CAACG,MAAM,CAAC,CAAC;QAC1BqB,qCAAqC,EAAExB,MAAC,CAACG,MAAM,CAAC,CAAC;QACjDsB,iCAAiC,EAAEzB,MAAC,CAACiB,KAAK,CAACjB,MAAC,CAACG,MAAM,CAAC,CAAC,CAAC;QACtDuB,mBAAmB,EAAE1B,MAAC,CAACG,MAAM,CAAC,CAAC;QAC/BwB,qBAAqB,EAAE3B,MAAC,CAACiB,KAAK,CAC5BjB,MAAC,CAACC,MAAM,CAAC;UACP2B,MAAM,EAAE5B,MAAC,CAAC6B,OAAO,CAAC,WAAW,CAAC;UAC9BC,uCAAuC,EAAE9B,MAAC,CAACiB,KAAK,CAACjB,MAAC,CAACG,MAAM,CAAC,CAAC,CAAC;UAC5D4B,8BAA8B,EAAE/B,MAAC,CAACiB,KAAK,CAACjB,MAAC,CAACG,MAAM,CAAC,CAAC,CAAC;UACnD6B,OAAO,EAAEhC,MAAC,CAACiB,KAAK,CAAClB,kBAAkB;QACrC,CAAC,CACH;MACF,CAAC,CAAC;MACFkC,iBAAiB,EAAEjC,MAAC,CAACC,MAAM,CAAC;QAC1BiC,iBAAiB,EAAElC,MAAC,CAACG,MAAM,CAAC,CAAC;QAC7BgC,YAAY,EAAEnC,MAAC,CAACG,MAAM,CAAC,CAAC;QACxBiC,UAAU,EAAEpC,MAAC,CAACG,MAAM,CAAC,CAAC;QACtBkC,OAAO,EAAErC,MAAC,CAACG,MAAM,CAAC,CAAC;QACnBmC,QAAQ,EAAEtC,MAAC,CAACG,MAAM,CAAC;MACrB,CAAC;IACH,CAAC;EACH,CAAC;AACH,CAAC,CACH,CAAC;AAACO,OAAA,CAAAC,4BAAA,GAAAA,4BAAA"}
@@ -1,44 +0,0 @@
1
- import { EntityConfiguration } from "../trust/types";
2
- import { JWK } from "../utils/jwk";
3
- import { z } from "zod";
4
- export const PidDisplayMetadata = z.object({
5
- name: z.string(),
6
- locale: z.string(),
7
- logo: z.object({
8
- url: z.string(),
9
- alt_text: z.string()
10
- }),
11
- background_color: z.string(),
12
- text_color: z.string()
13
- });
14
- export const PidIssuerEntityConfiguration = EntityConfiguration.and(z.object({
15
- payload: z.object({
16
- jwks: z.object({
17
- keys: z.array(JWK)
18
- }),
19
- metadata: z.object({
20
- openid_credential_issuer: z.object({
21
- credential_issuer: z.string(),
22
- authorization_endpoint: z.string(),
23
- token_endpoint: z.string(),
24
- pushed_authorization_request_endpoint: z.string(),
25
- dpop_signing_alg_values_supported: z.array(z.string()),
26
- credential_endpoint: z.string(),
27
- credentials_supported: z.array(z.object({
28
- format: z.literal("vc+sd-jwt"),
29
- cryptographic_binding_methods_supported: z.array(z.string()),
30
- cryptographic_suites_supported: z.array(z.string()),
31
- display: z.array(PidDisplayMetadata)
32
- }))
33
- }),
34
- federation_entity: z.object({
35
- organization_name: z.string(),
36
- homepage_uri: z.string(),
37
- policy_uri: z.string(),
38
- tos_uri: z.string(),
39
- logo_uri: z.string()
40
- })
41
- })
42
- })
43
- }));
44
- //# sourceMappingURL=metadata.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["EntityConfiguration","JWK","z","PidDisplayMetadata","object","name","string","locale","logo","url","alt_text","background_color","text_color","PidIssuerEntityConfiguration","and","payload","jwks","keys","array","metadata","openid_credential_issuer","credential_issuer","authorization_endpoint","token_endpoint","pushed_authorization_request_endpoint","dpop_signing_alg_values_supported","credential_endpoint","credentials_supported","format","literal","cryptographic_binding_methods_supported","cryptographic_suites_supported","display","federation_entity","organization_name","homepage_uri","policy_uri","tos_uri","logo_uri"],"sourceRoot":"../../../src","sources":["pid/metadata.ts"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,gBAAgB;AACpD,SAASC,GAAG,QAAQ,cAAc;AAClC,SAASC,CAAC,QAAQ,KAAK;AAGvB,OAAO,MAAMC,kBAAkB,GAAGD,CAAC,CAACE,MAAM,CAAC;EACzCC,IAAI,EAAEH,CAAC,CAACI,MAAM,CAAC,CAAC;EAChBC,MAAM,EAAEL,CAAC,CAACI,MAAM,CAAC,CAAC;EAClBE,IAAI,EAAEN,CAAC,CAACE,MAAM,CAAC;IACbK,GAAG,EAAEP,CAAC,CAACI,MAAM,CAAC,CAAC;IACfI,QAAQ,EAAER,CAAC,CAACI,MAAM,CAAC;EACrB,CAAC,CAAC;EACFK,gBAAgB,EAAET,CAAC,CAACI,MAAM,CAAC,CAAC;EAC5BM,UAAU,EAAEV,CAAC,CAACI,MAAM,CAAC;AACvB,CAAC,CAAC;AAKF,OAAO,MAAMO,4BAA4B,GAAGb,mBAAmB,CAACc,GAAG,CACjEZ,CAAC,CAACE,MAAM,CAAC;EACPW,OAAO,EAAEb,CAAC,CAACE,MAAM,CAAC;IAChBY,IAAI,EAAEd,CAAC,CAACE,MAAM,CAAC;MAAEa,IAAI,EAAEf,CAAC,CAACgB,KAAK,CAACjB,GAAG;IAAE,CAAC,CAAC;IACtCkB,QAAQ,EAAEjB,CAAC,CAACE,MAAM,CAAC;MACjBgB,wBAAwB,EAAElB,CAAC,CAACE,MAAM,CAAC;QACjCiB,iBAAiB,EAAEnB,CAAC,CAACI,MAAM,CAAC,CAAC;QAC7BgB,sBAAsB,EAAEpB,CAAC,CAACI,MAAM,CAAC,CAAC;QAClCiB,cAAc,EAAErB,CAAC,CAACI,MAAM,CAAC,CAAC;QAC1BkB,qCAAqC,EAAEtB,CAAC,CAACI,MAAM,CAAC,CAAC;QACjDmB,iCAAiC,EAAEvB,CAAC,CAACgB,KAAK,CAAChB,CAAC,CAACI,MAAM,CAAC,CAAC,CAAC;QACtDoB,mBAAmB,EAAExB,CAAC,CAACI,MAAM,CAAC,CAAC;QAC/BqB,qBAAqB,EAAEzB,CAAC,CAACgB,KAAK,CAC5BhB,CAAC,CAACE,MAAM,CAAC;UACPwB,MAAM,EAAE1B,CAAC,CAAC2B,OAAO,CAAC,WAAW,CAAC;UAC9BC,uCAAuC,EAAE5B,CAAC,CAACgB,KAAK,CAAChB,CAAC,CAACI,MAAM,CAAC,CAAC,CAAC;UAC5DyB,8BAA8B,EAAE7B,CAAC,CAACgB,KAAK,CAAChB,CAAC,CAACI,MAAM,CAAC,CAAC,CAAC;UACnD0B,OAAO,EAAE9B,CAAC,CAACgB,KAAK,CAACf,kBAAkB;QACrC,CAAC,CACH;MACF,CAAC,CAAC;MACF8B,iBAAiB,EAAE/B,CAAC,CAACE,MAAM,CAAC;QAC1B8B,iBAAiB,EAAEhC,CAAC,CAACI,MAAM,CAAC,CAAC;QAC7B6B,YAAY,EAAEjC,CAAC,CAACI,MAAM,CAAC,CAAC;QACxB8B,UAAU,EAAElC,CAAC,CAACI,MAAM,CAAC,CAAC;QACtB+B,OAAO,EAAEnC,CAAC,CAACI,MAAM,CAAC,CAAC;QACnBgC,QAAQ,EAAEpC,CAAC,CAACI,MAAM,CAAC;MACrB,CAAC;IACH,CAAC;EACH,CAAC;AACH,CAAC,CACH,CAAC"}