@nest-boot/auth 7.0.0-beta.5 → 7.1.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 (74) hide show
  1. package/dist/adapters/mikro-orm-adapter.d.ts +23 -0
  2. package/dist/adapters/mikro-orm-adapter.js +155 -0
  3. package/dist/adapters/mikro-orm-adapter.js.map +1 -0
  4. package/dist/auth-module-options.interface.d.ts +12 -0
  5. package/dist/auth-module-options.interface.js.map +1 -0
  6. package/dist/auth.constants.d.ts +2 -4
  7. package/dist/auth.constants.js +3 -5
  8. package/dist/auth.constants.js.map +1 -1
  9. package/dist/auth.guard.d.ts +6 -35
  10. package/dist/auth.guard.js +15 -102
  11. package/dist/auth.guard.js.map +1 -1
  12. package/dist/auth.middleware.d.ts +13 -0
  13. package/dist/auth.middleware.js +64 -0
  14. package/dist/auth.middleware.js.map +1 -0
  15. package/dist/auth.module-definition.d.ts +1 -1
  16. package/dist/auth.module.d.ts +11 -1
  17. package/dist/auth.module.js +46 -13
  18. package/dist/auth.module.js.map +1 -1
  19. package/dist/auth.service.d.ts +3 -61
  20. package/dist/auth.service.js +5 -109
  21. package/dist/auth.service.js.map +1 -1
  22. package/dist/decorators/current-session.decorator.d.ts +1 -0
  23. package/dist/decorators/current-session.decorator.js +15 -0
  24. package/dist/decorators/current-session.decorator.js.map +1 -0
  25. package/dist/decorators/current-user.decorator.d.ts +1 -1
  26. package/dist/decorators/current-user.decorator.js +9 -4
  27. package/dist/decorators/current-user.decorator.js.map +1 -1
  28. package/dist/decorators/index.d.ts +2 -3
  29. package/dist/decorators/index.js +2 -3
  30. package/dist/decorators/index.js.map +1 -1
  31. package/dist/decorators/public.decorator.d.ts +2 -0
  32. package/dist/decorators/public.decorator.js +8 -0
  33. package/dist/decorators/public.decorator.js.map +1 -0
  34. package/dist/entities/account.entity.d.ts +16 -0
  35. package/dist/entities/account.entity.js +87 -0
  36. package/dist/entities/account.entity.js.map +1 -0
  37. package/dist/entities/index.d.ts +3 -1
  38. package/dist/entities/index.js +3 -1
  39. package/dist/entities/index.js.map +1 -1
  40. package/dist/entities/session.entity.d.ts +11 -0
  41. package/dist/entities/session.entity.js +68 -0
  42. package/dist/entities/session.entity.js.map +1 -0
  43. package/dist/entities/user.entity.d.ts +5 -8
  44. package/dist/entities/user.entity.js +31 -40
  45. package/dist/entities/user.entity.js.map +1 -1
  46. package/dist/entities/verification.entity.d.ts +9 -0
  47. package/dist/entities/verification.entity.js +55 -0
  48. package/dist/entities/verification.entity.js.map +1 -0
  49. package/dist/index.d.ts +1 -2
  50. package/dist/index.js +1 -2
  51. package/dist/index.js.map +1 -1
  52. package/dist/tsconfig.build.tsbuildinfo +1 -1
  53. package/package.json +10 -20
  54. package/dist/decorators/can.decorator.d.ts +0 -1
  55. package/dist/decorators/can.decorator.js +0 -8
  56. package/dist/decorators/can.decorator.js.map +0 -1
  57. package/dist/decorators/current-personal-access-token.decorator.d.ts +0 -1
  58. package/dist/decorators/current-personal-access-token.decorator.js +0 -10
  59. package/dist/decorators/current-personal-access-token.decorator.js.map +0 -1
  60. package/dist/decorators/require-auth.decorator.d.ts +0 -1
  61. package/dist/decorators/require-auth.decorator.js +0 -8
  62. package/dist/decorators/require-auth.decorator.js.map +0 -1
  63. package/dist/entities/personal-access-token.entity.d.ts +0 -14
  64. package/dist/entities/personal-access-token.entity.js +0 -72
  65. package/dist/entities/personal-access-token.entity.js.map +0 -1
  66. package/dist/interfaces/auth-module-options.interface.d.ts +0 -10
  67. package/dist/interfaces/auth-module-options.interface.js.map +0 -1
  68. package/dist/interfaces/index.d.ts +0 -1
  69. package/dist/interfaces/index.js +0 -18
  70. package/dist/interfaces/index.js.map +0 -1
  71. package/dist/utils/random-string.util.d.ts +0 -6
  72. package/dist/utils/random-string.util.js +0 -26
  73. package/dist/utils/random-string.util.js.map +0 -1
  74. /package/dist/{interfaces/auth-module-options.interface.js → auth-module-options.interface.js} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nest-boot/auth",
3
- "version": "7.0.0-beta.5",
3
+ "version": "7.1.0",
4
4
  "description": "",
5
5
  "author": "d4rkcr0w <me@d4rkcr0w.com>",
6
6
  "homepage": "",
@@ -13,28 +13,19 @@
13
13
  "files": [
14
14
  "dist"
15
15
  ],
16
- "dependencies": {
17
- "dataloader": "^2.2.3",
18
- "lodash": "^4.17.21",
19
- "ms": "^2.1.3"
20
- },
21
16
  "devDependencies": {
22
17
  "@mikro-orm/core": "^6.5.8",
23
- "@mikro-orm/nestjs": "^6.1.1",
24
- "@nest-boot/eslint-config": "^7.0.0-beta.3",
25
- "@nest-boot/eslint-plugin": "^7.0.0-beta.3",
26
- "@nest-boot/hash": "^7.0.0-beta.4",
27
- "@nest-boot/i18n": "^7.0.0-beta.4",
28
- "@nest-boot/request-context": "^7.0.0-beta.4",
29
- "@nest-boot/tsconfig": "^7.0.0-beta.1",
18
+ "@nest-boot/eslint-config": "^7.0.0",
19
+ "@nest-boot/eslint-plugin": "^7.0.0",
20
+ "@nest-boot/tsconfig": "^7.0.0",
30
21
  "@nestjs/common": "^11.1.6",
31
22
  "@nestjs/config": "^4.0.2",
32
23
  "@nestjs/core": "^11.1.6",
24
+ "@nestjs/testing": "^11.1.6",
33
25
  "@types/express": "^5.0.3",
34
26
  "@types/jest": "^29.5.14",
35
- "@types/lodash": "^4.17.20",
36
- "@types/ms": "^0.7.31",
37
27
  "@types/node": "^22.18.6",
28
+ "better-auth": "^1.3.34",
38
29
  "express": "^5.1.0",
39
30
  "jest": "^29.7.0",
40
31
  "reflect-metadata": "^0.2.2",
@@ -44,14 +35,12 @@
44
35
  },
45
36
  "peerDependencies": {
46
37
  "@mikro-orm/core": "^6.0.0",
47
- "@mikro-orm/nestjs": "^6.0.0",
48
38
  "@nestjs/common": "^11.0.0",
49
39
  "@nestjs/core": "^11.0.0",
40
+ "better-auth": "^1.0.0",
50
41
  "express": "^5.0.0",
51
42
  "reflect-metadata": "^0.2.2",
52
- "rxjs": "^7.0.0",
53
- "@nest-boot/i18n": "^7.0.0-beta.47.0.0-beta.4",
54
- "@nest-boot/request-context": "^7.0.0-beta.47.0.0-beta.4"
43
+ "rxjs": "^7.0.0"
55
44
  },
56
45
  "publishConfig": {
57
46
  "access": "public"
@@ -69,6 +58,7 @@
69
58
  "build": "tsc -p tsconfig.build.json",
70
59
  "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
71
60
  "dev": "tsc -w -p tsconfig.build.json",
72
- "lint": "eslint \"{src,test}/**/*.ts\" --fix"
61
+ "lint": "eslint \"{src,test}/**/*.ts\" --fix",
62
+ "test": "jest"
73
63
  }
74
64
  }
@@ -1 +0,0 @@
1
- export declare const Can: (...roles: string[]) => ClassDecorator & MethodDecorator;
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Can = void 0;
4
- const common_1 = require("@nestjs/common");
5
- const auth_constants_1 = require("../auth.constants");
6
- const Can = (...roles) => (0, common_1.SetMetadata)(auth_constants_1.PERMISSIONS_METADATA_KEY, roles);
7
- exports.Can = Can;
8
- //# sourceMappingURL=can.decorator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"can.decorator.js","sourceRoot":"","sources":["../../src/decorators/can.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAE7C,sDAA6D;AAEtD,MAAM,GAAG,GAAG,CAAC,GAAG,KAAe,EAAoC,EAAE,CAC1E,IAAA,oBAAW,EAAC,yCAAwB,EAAE,KAAK,CAAC,CAAC;AADlC,QAAA,GAAG,OAC+B"}
@@ -1 +0,0 @@
1
- export declare const CurrentPersonalAccessToken: (...dataOrPipes: any[]) => ParameterDecorator;
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CurrentPersonalAccessToken = void 0;
4
- const request_context_1 = require("@nest-boot/request-context");
5
- const common_1 = require("@nestjs/common");
6
- const auth_constants_1 = require("../auth.constants");
7
- exports.CurrentPersonalAccessToken = (0, common_1.createParamDecorator)(() => {
8
- return request_context_1.RequestContext.get(auth_constants_1.AUTH_PERSONAL_ACCESS_TOKEN);
9
- });
10
- //# sourceMappingURL=current-personal-access-token.decorator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"current-personal-access-token.decorator.js","sourceRoot":"","sources":["../../src/decorators/current-personal-access-token.decorator.ts"],"names":[],"mappings":";;;AAAA,gEAA4D;AAC5D,2CAAsD;AAEtD,sDAA+D;AAElD,QAAA,0BAA0B,GAAG,IAAA,6BAAoB,EAAC,GAAG,EAAE;IAClE,OAAO,gCAAc,CAAC,GAAG,CAAC,2CAA0B,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export declare const RequireAuth: (requireAuth?: boolean) => ClassDecorator & MethodDecorator;
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RequireAuth = void 0;
4
- const common_1 = require("@nestjs/common");
5
- const auth_constants_1 = require("../auth.constants");
6
- const RequireAuth = (requireAuth = true) => (0, common_1.SetMetadata)(auth_constants_1.REQUIRE_AUTH_METADATA_KEY, requireAuth);
7
- exports.RequireAuth = RequireAuth;
8
- //# sourceMappingURL=require-auth.decorator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"require-auth.decorator.js","sourceRoot":"","sources":["../../src/decorators/require-auth.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAE7C,sDAA8D;AAEvD,MAAM,WAAW,GAAG,CACzB,WAAW,GAAG,IAAI,EACgB,EAAE,CACpC,IAAA,oBAAW,EAAC,0CAAyB,EAAE,WAAW,CAAC,CAAC;AAHzC,QAAA,WAAW,eAG8B"}
@@ -1,14 +0,0 @@
1
- import { Ref } from "@mikro-orm/core";
2
- import { User } from "./user.entity";
3
- export declare class PersonalAccessToken {
4
- constructor(data: Pick<PersonalAccessToken, "token" | "permissions" | "lastUsedAt" | "expiresAt" | "createdAt" | "updatedAt" | "user"> & Partial<Pick<PersonalAccessToken, "id" | "name">>);
5
- id: string;
6
- name: string | null;
7
- token: string;
8
- permissions: string[];
9
- lastUsedAt: Date | null;
10
- expiresAt: Date | null;
11
- createdAt: Date | null;
12
- updatedAt: Date | null;
13
- user: Ref<User>;
14
- }
@@ -1,72 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.PersonalAccessToken = void 0;
13
- const core_1 = require("@mikro-orm/core");
14
- const crypto_1 = require("crypto");
15
- const user_entity_1 = require("./user.entity");
16
- let PersonalAccessToken = class PersonalAccessToken {
17
- constructor(data) {
18
- this.id = (0, crypto_1.randomUUID)();
19
- this.name = null;
20
- this.token = data.token;
21
- this.permissions = data.permissions;
22
- this.lastUsedAt = data.lastUsedAt;
23
- this.expiresAt = data.expiresAt;
24
- this.createdAt = data.createdAt;
25
- this.updatedAt = data.updatedAt;
26
- this.user = data.user;
27
- data.id !== void 0 && (this.id = data.id);
28
- data.name !== void 0 && (this.name = data.name);
29
- }
30
- };
31
- exports.PersonalAccessToken = PersonalAccessToken;
32
- __decorate([
33
- (0, core_1.PrimaryKey)({ type: core_1.t.uuid }),
34
- __metadata("design:type", String)
35
- ], PersonalAccessToken.prototype, "id", void 0);
36
- __decorate([
37
- (0, core_1.Property)({ type: core_1.t.string, nullable: true }),
38
- __metadata("design:type", Object)
39
- ], PersonalAccessToken.prototype, "name", void 0);
40
- __decorate([
41
- (0, core_1.Property)({ type: core_1.t.string, unique: true, length: 64 }),
42
- __metadata("design:type", String)
43
- ], PersonalAccessToken.prototype, "token", void 0);
44
- __decorate([
45
- (0, core_1.Property)({ type: core_1.t.array }),
46
- __metadata("design:type", Array)
47
- ], PersonalAccessToken.prototype, "permissions", void 0);
48
- __decorate([
49
- (0, core_1.Property)({ nullable: true }),
50
- __metadata("design:type", Object)
51
- ], PersonalAccessToken.prototype, "lastUsedAt", void 0);
52
- __decorate([
53
- (0, core_1.Property)({ nullable: true }),
54
- __metadata("design:type", Object)
55
- ], PersonalAccessToken.prototype, "expiresAt", void 0);
56
- __decorate([
57
- (0, core_1.Property)({ nullable: true }),
58
- __metadata("design:type", Object)
59
- ], PersonalAccessToken.prototype, "createdAt", void 0);
60
- __decorate([
61
- (0, core_1.Property)({ nullable: true }),
62
- __metadata("design:type", Object)
63
- ], PersonalAccessToken.prototype, "updatedAt", void 0);
64
- __decorate([
65
- (0, core_1.ManyToOne)(() => user_entity_1.User),
66
- __metadata("design:type", Object)
67
- ], PersonalAccessToken.prototype, "user", void 0);
68
- exports.PersonalAccessToken = PersonalAccessToken = __decorate([
69
- (0, core_1.Entity)(),
70
- __metadata("design:paramtypes", [Object])
71
- ], PersonalAccessToken);
72
- //# sourceMappingURL=personal-access-token.entity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"personal-access-token.entity.js","sourceRoot":"","sources":["../../src/entities/personal-access-token.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,0CAOyB;AACzB,mCAAoC;AAEpC,+CAAqC;AAG9B,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B,YACE,IAUmD;QAerD,OAAE,GAAW,IAAA,mBAAU,GAAE,CAAC;QAG1B,SAAI,GAAkB,IAAI,CAAC;QAhBzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEtB,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;CA4BF,CAAA;AApDY,kDAAmB;AA2B9B;IADC,IAAA,iBAAU,EAAC,EAAE,IAAI,EAAE,QAAC,CAAC,IAAI,EAAE,CAAC;;+CACH;AAG1B;IADC,IAAA,eAAQ,EAAC,EAAE,IAAI,EAAE,QAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDAClB;AAG3B;IADC,IAAA,eAAQ,EAAC,EAAE,IAAI,EAAE,QAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;kDACxC;AAGf;IADC,IAAA,eAAQ,EAAC,EAAE,IAAI,EAAE,QAAC,CAAC,KAAK,EAAE,CAAC;;wDACL;AAGvB;IADC,IAAA,eAAQ,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uDACJ;AAGzB;IADC,IAAA,eAAQ,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDACL;AAGxB;IADC,IAAA,eAAQ,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDACL;AAGxB;IADC,IAAA,eAAQ,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDACL;AAGxB;IADC,IAAA,gBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;;iDACN;8BAnDL,mBAAmB;IAD/B,IAAA,aAAM,GAAE;;GACI,mBAAmB,CAoD/B"}
@@ -1,10 +0,0 @@
1
- import { type EntityClass } from "@mikro-orm/core";
2
- import { PersonalAccessToken, User } from "../entities";
3
- export interface AuthModuleOptions {
4
- entities?: {
5
- User?: EntityClass<User>;
6
- PersonalAccessToken?: EntityClass<PersonalAccessToken>;
7
- };
8
- expiresIn?: number;
9
- defaultRequireAuth?: boolean;
10
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-module-options.interface.js","sourceRoot":"","sources":["../../src/interfaces/auth-module-options.interface.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- export * from "./auth-module-options.interface";
@@ -1,18 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./auth-module-options.interface"), exports);
18
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kEAAgD"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Generates a random string of the specified length.
3
- * @param length The length of the random string to generate.
4
- * @returns The randomly generated string.
5
- */
6
- export declare function randomString(length: number): string;
@@ -1,26 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.randomString = randomString;
7
- const crypto_1 = __importDefault(require("crypto"));
8
- const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
9
- /**
10
- * Generates a random string of the specified length.
11
- * @param length The length of the random string to generate.
12
- * @returns The randomly generated string.
13
- */
14
- function randomString(length) {
15
- let result = "";
16
- const byteSize = Math.ceil((length * 256) / characters.length);
17
- const randomBytes = crypto_1.default.randomBytes(byteSize);
18
- for (let i = 0; i < byteSize && result.length < length; i++) {
19
- const randomByte = randomBytes[i];
20
- if (randomByte < 256 - (256 % characters.length)) {
21
- result += characters.charAt(randomByte % characters.length);
22
- }
23
- }
24
- return result;
25
- }
26
- //# sourceMappingURL=random-string.util.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"random-string.util.js","sourceRoot":"","sources":["../../src/utils/random-string.util.ts"],"names":[],"mappings":";;;;;AAUA,oCAaC;AAvBD,oDAA4B;AAE5B,MAAM,UAAU,GACd,gEAAgE,CAAC;AAEnE;;;;GAIG;AACH,SAAgB,YAAY,CAAC,MAAc;IACzC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,gBAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5D,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,UAAU,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}