@exabugs/dynamodb-client 1.26.0 → 1.27.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.
Files changed (129) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/__generated__/models/apiOperation.d.ts +1 -0
  3. package/dist/__generated__/models/apiOperation.d.ts.map +1 -1
  4. package/dist/__generated__/models/apiOperation.js +1 -0
  5. package/dist/__generated__/models/apiOperation.js.map +1 -1
  6. package/dist/__generated__/models/bulkOperationResult.d.ts +2 -0
  7. package/dist/__generated__/models/bulkOperationResult.d.ts.map +1 -1
  8. package/dist/__generated__/models/countParams.d.ts +31 -0
  9. package/dist/__generated__/models/countParams.d.ts.map +1 -0
  10. package/dist/__generated__/models/countParams.js +2 -0
  11. package/dist/__generated__/models/countParams.js.map +1 -0
  12. package/dist/__generated__/models/countResult.d.ts +37 -0
  13. package/dist/__generated__/models/countResult.d.ts.map +1 -0
  14. package/dist/__generated__/models/countResult.js +2 -0
  15. package/dist/__generated__/models/countResult.js.map +1 -0
  16. package/dist/__generated__/models/countResultConsumedCapacity.d.ts +35 -0
  17. package/dist/__generated__/models/countResultConsumedCapacity.d.ts.map +1 -0
  18. package/dist/__generated__/models/countResultConsumedCapacity.js +25 -0
  19. package/dist/__generated__/models/countResultConsumedCapacity.js.map +1 -0
  20. package/dist/__generated__/models/executeOperationBodyOp.d.ts +1 -0
  21. package/dist/__generated__/models/executeOperationBodyOp.d.ts.map +1 -1
  22. package/dist/__generated__/models/executeOperationBodyOp.js +1 -0
  23. package/dist/__generated__/models/executeOperationBodyOp.js.map +1 -1
  24. package/dist/__generated__/models/index.d.ts +3 -0
  25. package/dist/__generated__/models/index.d.ts.map +1 -1
  26. package/dist/__generated__/models/index.js +3 -0
  27. package/dist/__generated__/models/index.js.map +1 -1
  28. package/dist/client/Collection.d.ts +7 -0
  29. package/dist/client/Collection.d.ts.map +1 -1
  30. package/dist/client/Collection.js +20 -1
  31. package/dist/client/Collection.js.map +1 -1
  32. package/dist/scripts/repair-shadows.js +86 -42
  33. package/dist/scripts/repair-shadows.js.map +1 -1
  34. package/dist/scripts/utils/cliParser.d.ts +9 -22
  35. package/dist/scripts/utils/cliParser.d.ts.map +1 -1
  36. package/dist/scripts/utils/cliParser.js +14 -37
  37. package/dist/scripts/utils/cliParser.js.map +1 -1
  38. package/dist/scripts/utils/shadowAudit.d.ts +49 -0
  39. package/dist/scripts/utils/shadowAudit.d.ts.map +1 -0
  40. package/dist/scripts/utils/shadowAudit.js +84 -0
  41. package/dist/scripts/utils/shadowAudit.js.map +1 -0
  42. package/dist/scripts/utils/shadowRepair.d.ts +42 -0
  43. package/dist/scripts/utils/shadowRepair.d.ts.map +1 -0
  44. package/dist/scripts/utils/shadowRepair.js +110 -0
  45. package/dist/scripts/utils/shadowRepair.js.map +1 -0
  46. package/dist/server/handler.cjs +1005 -901
  47. package/dist/server/handler.cjs.map +4 -4
  48. package/dist/server/handler.js +2 -2
  49. package/dist/server/handler.js.map +1 -1
  50. package/dist/server/media-handler.cjs +2 -2
  51. package/dist/server/media-process-handler-dlq.cjs +19 -3
  52. package/dist/server/media-process-handler-dlq.cjs.map +2 -2
  53. package/dist/server/media-process-handler.cjs +19 -3
  54. package/dist/server/media-process-handler.cjs.map +2 -2
  55. package/dist/server/operations/count.d.ts +3 -0
  56. package/dist/server/operations/count.d.ts.map +1 -0
  57. package/dist/server/operations/count.js +81 -0
  58. package/dist/server/operations/count.js.map +1 -0
  59. package/dist/server/operations/deleteMany.d.ts.map +1 -1
  60. package/dist/server/operations/deleteMany.js +2 -1
  61. package/dist/server/operations/deleteMany.js.map +1 -1
  62. package/dist/server/operations/deleteOne.d.ts.map +1 -1
  63. package/dist/server/operations/deleteOne.js +3 -12
  64. package/dist/server/operations/deleteOne.js.map +1 -1
  65. package/dist/server/operations/find/keyCondition.d.ts +38 -0
  66. package/dist/server/operations/find/keyCondition.d.ts.map +1 -0
  67. package/dist/server/operations/find/keyCondition.js +184 -0
  68. package/dist/server/operations/find/keyCondition.js.map +1 -0
  69. package/dist/server/operations/find/shadowQuery.d.ts.map +1 -1
  70. package/dist/server/operations/find/shadowQuery.js +16 -143
  71. package/dist/server/operations/find/shadowQuery.js.map +1 -1
  72. package/dist/server/operations/find/utils.d.ts.map +1 -1
  73. package/dist/server/operations/find/utils.js +0 -5
  74. package/dist/server/operations/find/utils.js.map +1 -1
  75. package/dist/server/operations/insertMany.d.ts.map +1 -1
  76. package/dist/server/operations/insertMany.js +1 -4
  77. package/dist/server/operations/insertMany.js.map +1 -1
  78. package/dist/server/operations/insertOne.d.ts.map +1 -1
  79. package/dist/server/operations/insertOne.js +2 -6
  80. package/dist/server/operations/insertOne.js.map +1 -1
  81. package/dist/server/operations/operationDispatcher.d.ts.map +1 -1
  82. package/dist/server/operations/operationDispatcher.js +3 -0
  83. package/dist/server/operations/operationDispatcher.js.map +1 -1
  84. package/dist/server/operations/updateMany.d.ts.map +1 -1
  85. package/dist/server/operations/updateMany.js +6 -2
  86. package/dist/server/operations/updateMany.js.map +1 -1
  87. package/dist/server/operations/updateOne.d.ts.map +1 -1
  88. package/dist/server/operations/updateOne.js +10 -21
  89. package/dist/server/operations/updateOne.js.map +1 -1
  90. package/dist/server/types.d.ts +7 -1
  91. package/dist/server/types.d.ts.map +1 -1
  92. package/dist/server/utils/bulkError.d.ts +12 -0
  93. package/dist/server/utils/bulkError.d.ts.map +1 -0
  94. package/dist/server/utils/bulkError.js +21 -0
  95. package/dist/server/utils/bulkError.js.map +1 -0
  96. package/dist/server/utils/chunking.d.ts +9 -1
  97. package/dist/server/utils/chunking.d.ts.map +1 -1
  98. package/dist/server/utils/chunking.js +20 -3
  99. package/dist/server/utils/chunking.js.map +1 -1
  100. package/dist/server/utils/filter.d.ts +3 -105
  101. package/dist/server/utils/filter.d.ts.map +1 -1
  102. package/dist/server/utils/filter.js +14 -218
  103. package/dist/server/utils/filter.js.map +1 -1
  104. package/docs/README.md +9 -12
  105. package/package.json +1 -1
  106. package/dist/scripts/operations/bulkRecordRepair.d.ts +0 -17
  107. package/dist/scripts/operations/bulkRecordRepair.d.ts.map +0 -1
  108. package/dist/scripts/operations/bulkRecordRepair.js +0 -76
  109. package/dist/scripts/operations/bulkRecordRepair.js.map +0 -1
  110. package/dist/scripts/operations/singleRecordRepair.d.ts +0 -18
  111. package/dist/scripts/operations/singleRecordRepair.d.ts.map +0 -1
  112. package/dist/scripts/operations/singleRecordRepair.js +0 -46
  113. package/dist/scripts/operations/singleRecordRepair.js.map +0 -1
  114. package/dist/scripts/utils/awsUtils.d.ts +0 -15
  115. package/dist/scripts/utils/awsUtils.d.ts.map +0 -1
  116. package/dist/scripts/utils/awsUtils.js +0 -31
  117. package/dist/scripts/utils/awsUtils.js.map +0 -1
  118. package/dist/scripts/utils/clientFactory.d.ts +0 -22
  119. package/dist/scripts/utils/clientFactory.d.ts.map +0 -1
  120. package/dist/scripts/utils/clientFactory.js +0 -36
  121. package/dist/scripts/utils/clientFactory.js.map +0 -1
  122. package/dist/scripts/utils/repairUtils.d.ts +0 -58
  123. package/dist/scripts/utils/repairUtils.d.ts.map +0 -1
  124. package/dist/scripts/utils/repairUtils.js +0 -52
  125. package/dist/scripts/utils/repairUtils.js.map +0 -1
  126. package/dist/server/utils/ttl.d.ts +0 -17
  127. package/dist/server/utils/ttl.d.ts.map +0 -1
  128. package/dist/server/utils/ttl.js +0 -64
  129. package/dist/server/utils/ttl.js.map +0 -1
@@ -1,58 +0,0 @@
1
- /**
2
- * シャドーレコード修復ユーティリティ
3
- *
4
- * 修復処理で使用する共通ロジック
5
- */
6
- import type { Collection } from '../../client/index.iam.js';
7
- /**
8
- * 修復統計情報
9
- */
10
- export interface RepairStats {
11
- scanned: number;
12
- needsRepair: number;
13
- repaired: number;
14
- failed: number;
15
- errors: Array<{
16
- id: string;
17
- error: string;
18
- }>;
19
- }
20
- /**
21
- * シャドー整合性チェック結果
22
- */
23
- export interface ShadowIntegrityResult {
24
- needsRepair: boolean;
25
- missingShadows: number;
26
- extraShadows: number;
27
- }
28
- /**
29
- * 本体レコードのシャドーキーと実際のシャドーレコードを比較
30
- *
31
- * 注: Records Lambdaは__shadowKeysをHTTPレスポンスから除外するため、
32
- * このスクリプトでは__shadowKeysの有無を確認できません。
33
- * そのため、すべてのレコードを修復対象とします。
34
- */
35
- export declare function checkShadowIntegrity(): Promise<ShadowIntegrityResult>;
36
- /**
37
- * DynamoClient(IAM認証)を使用してシャドーを再生成
38
- *
39
- * @param collection - DynamoClientのコレクション
40
- * @param recordId - レコードID
41
- */
42
- export declare function repairRecordViaDynamoClient<TAuthOptions = unknown>(collection: Collection<{
43
- id: string;
44
- [key: string]: unknown;
45
- }, TAuthOptions>, recordId: string): Promise<void>;
46
- /**
47
- * 修復統計情報を表示する
48
- *
49
- * @param stats - 修復統計情報
50
- */
51
- export declare function displayRepairSummary(stats: RepairStats): void;
52
- /**
53
- * レート制限を避けるための待機
54
- *
55
- * @param ms - 待機時間(ミリ秒)
56
- */
57
- export declare function waitForRateLimit(ms?: number): Promise<void>;
58
- //# sourceMappingURL=repairUtils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repairUtils.d.ts","sourceRoot":"","sources":["../../../src/scripts/utils/repairUtils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAO3E;AAED;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAAC,YAAY,GAAG,OAAO,EACtE,UAAU,EAAE,UAAU,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EAAE,YAAY,CAAC,EAC5E,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAa7D;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,GAAE,MAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE"}
@@ -1,52 +0,0 @@
1
- /**
2
- * 本体レコードのシャドーキーと実際のシャドーレコードを比較
3
- *
4
- * 注: Records Lambdaは__shadowKeysをHTTPレスポンスから除外するため、
5
- * このスクリプトでは__shadowKeysの有無を確認できません。
6
- * そのため、すべてのレコードを修復対象とします。
7
- */
8
- export async function checkShadowIntegrity() {
9
- // Records Lambdaは__shadowKeysを除外するため、常に修復対象とする
10
- return {
11
- needsRepair: true,
12
- missingShadows: 0,
13
- extraShadows: 0,
14
- };
15
- }
16
- /**
17
- * DynamoClient(IAM認証)を使用してシャドーを再生成
18
- *
19
- * @param collection - DynamoClientのコレクション
20
- * @param recordId - レコードID
21
- */
22
- export async function repairRecordViaDynamoClient(collection, recordId) {
23
- // updateOneを呼び出すと、Records Lambdaと同じロジックでシャドーレコードが再生成される
24
- await collection.updateOne({ id: recordId }, { $set: { updatedAt: new Date().toISOString() } });
25
- }
26
- /**
27
- * 修復統計情報を表示する
28
- *
29
- * @param stats - 修復統計情報
30
- */
31
- export function displayRepairSummary(stats) {
32
- console.log('\n=== Repair Summary ===');
33
- console.log(`Scanned: ${stats.scanned}`);
34
- console.log(`Needs repair: ${stats.needsRepair}`);
35
- console.log(`Repaired: ${stats.repaired}`);
36
- console.log(`Failed: ${stats.failed}`);
37
- if (stats.errors.length > 0) {
38
- console.log('\nErrors:');
39
- stats.errors.forEach(({ id, error }) => {
40
- console.log(` - ${id}: ${error}`);
41
- });
42
- }
43
- }
44
- /**
45
- * レート制限を避けるための待機
46
- *
47
- * @param ms - 待機時間(ミリ秒)
48
- */
49
- export async function waitForRateLimit(ms = 100) {
50
- await new Promise((resolve) => setTimeout(resolve, ms));
51
- }
52
- //# sourceMappingURL=repairUtils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repairUtils.js","sourceRoot":"","sources":["../../../src/scripts/utils/repairUtils.ts"],"names":[],"mappings":"AA2BA;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,+CAA+C;IAC/C,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,CAAC;KAChB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,UAA4E,EAC5E,QAAgB;IAEhB,wDAAwD;IACxD,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;AAClG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAkB;IACrD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAEvC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACrC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAa,GAAG;IACrD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC"}
@@ -1,17 +0,0 @@
1
- /**
2
- * TTLを計算する
3
- *
4
- * @param resource - リソース名
5
- * @param createdAt - 作成日時(ISO 8601形式)
6
- * @returns TTL(Unix timestamp、秒単位)、TTL不要の場合はundefined
7
- */
8
- export declare function calculateTTL(resource: string, createdAt: string): number | undefined;
9
- /**
10
- * レコードデータにTTLを追加する
11
- *
12
- * @param resource - リソース名
13
- * @param recordData - レコードデータ
14
- * @returns TTLが追加されたレコードデータ
15
- */
16
- export declare function addTTL(resource: string, recordData: Record<string, unknown>): Record<string, unknown>;
17
- //# sourceMappingURL=ttl.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ttl.d.ts","sourceRoot":"","sources":["../../../src/server/utils/ttl.ts"],"names":[],"mappings":"AAQA;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA+BpF;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CACpB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBzB"}
@@ -1,64 +0,0 @@
1
- /**
2
- * TTL(Time To Live)ユーティリティ
3
- * DynamoDB TTL設定を管理
4
- */
5
- import { createLogger } from '../../index.js';
6
- const logger = createLogger({ service: 'records-lambda' });
7
- /**
8
- * TTLを計算する
9
- *
10
- * @param resource - リソース名
11
- * @param createdAt - 作成日時(ISO 8601形式)
12
- * @returns TTL(Unix timestamp、秒単位)、TTL不要の場合はundefined
13
- */
14
- export function calculateTTL(resource, createdAt) {
15
- // 新しい実装: 環境変数ベースのTTL設定
16
- // 環境変数から取得(例: ARTICLES_TTL_DAYS=30)
17
- const envKey = `${resource.toUpperCase()}_TTL_DAYS`;
18
- const ttlDaysStr = process.env[envKey];
19
- if (!ttlDaysStr) {
20
- // TTL設定がないリソースはundefinedを返す
21
- return undefined;
22
- }
23
- const ttlDays = parseInt(ttlDaysStr, 10);
24
- if (isNaN(ttlDays) || ttlDays <= 0) {
25
- logger.warn('Invalid TTL_DAYS value', { resource, envKey, value: ttlDaysStr });
26
- return undefined;
27
- }
28
- // 作成日時からTTLを計算
29
- const createdAtMs = new Date(createdAt).getTime();
30
- const ttlMs = createdAtMs + ttlDays * 24 * 60 * 60 * 1000;
31
- const ttl = Math.floor(ttlMs / 1000);
32
- logger.debug('TTL calculated', {
33
- resource,
34
- ttlDays,
35
- createdAt,
36
- ttl,
37
- ttlDate: new Date(ttl * 1000).toISOString(),
38
- });
39
- return ttl;
40
- }
41
- /**
42
- * レコードデータにTTLを追加する
43
- *
44
- * @param resource - リソース名
45
- * @param recordData - レコードデータ
46
- * @returns TTLが追加されたレコードデータ
47
- */
48
- export function addTTL(resource, recordData) {
49
- const createdAt = recordData.createdAt;
50
- if (!createdAt) {
51
- logger.warn('createdAt not found, skipping TTL calculation', { resource });
52
- return recordData;
53
- }
54
- const ttl = calculateTTL(resource, createdAt);
55
- if (ttl === undefined) {
56
- // TTL不要のリソース
57
- return recordData;
58
- }
59
- return {
60
- ...recordData,
61
- ttl,
62
- };
63
- }
64
- //# sourceMappingURL=ttl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ttl.js","sourceRoot":"","sources":["../../../src/server/utils/ttl.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAE3D;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,SAAiB;IAC9D,uBAAuB;IACvB,oCAAoC;IACpC,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IACpD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,4BAA4B;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,eAAe;IACf,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAClD,MAAM,KAAK,GAAG,WAAW,GAAG,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAErC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE;QAC7B,QAAQ;QACR,OAAO;QACP,SAAS;QACT,GAAG;QACH,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;KAC5C,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CACpB,QAAgB,EAChB,UAAmC;IAEnC,MAAM,SAAS,GAAG,UAAU,CAAC,SAAmB,CAAC;IACjD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,+CAA+C,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3E,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC9C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,aAAa;QACb,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO;QACL,GAAG,UAAU;QACb,GAAG;KACJ,CAAC;AACJ,CAAC"}