@nauth-toolkit/core 0.1.86 → 0.1.88
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/dto/admin-get-user-auth-history.dto.d.ts +62 -0
- package/dist/dto/admin-get-user-auth-history.dto.d.ts.map +1 -0
- package/dist/dto/admin-get-user-auth-history.dto.js +87 -0
- package/dist/dto/admin-get-user-auth-history.dto.js.map +1 -0
- package/dist/dto/admin-logout-all.dto.d.ts +48 -0
- package/dist/dto/admin-logout-all.dto.d.ts.map +1 -0
- package/dist/dto/{change-password-request.dto.js → admin-logout-all.dto.js} +36 -21
- package/dist/dto/admin-logout-all.dto.js.map +1 -0
- package/dist/dto/admin-remove-devices.dto.d.ts +25 -0
- package/dist/dto/admin-remove-devices.dto.d.ts.map +1 -0
- package/dist/dto/admin-remove-devices.dto.js +50 -0
- package/dist/dto/admin-remove-devices.dto.js.map +1 -0
- package/dist/dto/admin-reset-password.dto.d.ts +24 -49
- package/dist/dto/admin-reset-password.dto.d.ts.map +1 -1
- package/dist/dto/admin-reset-password.dto.js +30 -82
- package/dist/dto/admin-reset-password.dto.js.map +1 -1
- package/dist/dto/admin-revoke-session.dto.d.ts +22 -0
- package/dist/dto/admin-revoke-session.dto.d.ts.map +1 -0
- package/dist/dto/admin-revoke-session.dto.js +48 -0
- package/dist/dto/admin-revoke-session.dto.js.map +1 -0
- package/dist/dto/admin-set-password.dto.d.ts +8 -10
- package/dist/dto/admin-set-password.dto.d.ts.map +1 -1
- package/dist/dto/admin-set-password.dto.js +11 -21
- package/dist/dto/admin-set-password.dto.js.map +1 -1
- package/dist/dto/admin-set-preferred-method.dto.d.ts +25 -0
- package/dist/dto/admin-set-preferred-method.dto.d.ts.map +1 -0
- package/dist/dto/admin-set-preferred-method.dto.js +50 -0
- package/dist/dto/admin-set-preferred-method.dto.js.map +1 -0
- package/dist/dto/admin-update-user-attributes.dto.d.ts +41 -0
- package/dist/dto/admin-update-user-attributes.dto.d.ts.map +1 -0
- package/dist/dto/{update-user-attributes-request.dto.js → admin-update-user-attributes.dto.js} +12 -17
- package/dist/dto/admin-update-user-attributes.dto.js.map +1 -0
- package/dist/dto/auth-challenge.dto.d.ts +2 -2
- package/dist/dto/auth-challenge.dto.d.ts.map +1 -1
- package/dist/dto/auth-challenge.dto.js +3 -3
- package/dist/dto/auth-challenge.dto.js.map +1 -1
- package/dist/dto/auth-response.dto.d.ts +1 -1
- package/dist/dto/auth-response.dto.d.ts.map +1 -1
- package/dist/dto/auth-response.dto.js +1 -1
- package/dist/dto/auth-response.dto.js.map +1 -1
- package/dist/dto/get-mfa-status.dto.d.ts +8 -4
- package/dist/dto/get-mfa-status.dto.d.ts.map +1 -1
- package/dist/dto/get-mfa-status.dto.js +8 -4
- package/dist/dto/get-mfa-status.dto.js.map +1 -1
- package/dist/dto/get-risk-assessment-history.dto.d.ts +3 -3
- package/dist/dto/get-risk-assessment-history.dto.d.ts.map +1 -1
- package/dist/dto/get-risk-assessment-history.dto.js +5 -5
- package/dist/dto/get-risk-assessment-history.dto.js.map +1 -1
- package/dist/dto/get-suspicious-activity.dto.d.ts +3 -3
- package/dist/dto/get-suspicious-activity.dto.d.ts.map +1 -1
- package/dist/dto/get-suspicious-activity.dto.js +5 -5
- package/dist/dto/get-suspicious-activity.dto.js.map +1 -1
- package/dist/dto/get-user-auth-history.dto.d.ts +4 -39
- package/dist/dto/get-user-auth-history.dto.d.ts.map +1 -1
- package/dist/dto/get-user-auth-history.dto.js +53 -51
- package/dist/dto/get-user-auth-history.dto.js.map +1 -1
- package/dist/dto/get-user-devices.dto.d.ts +5 -18
- package/dist/dto/get-user-devices.dto.d.ts.map +1 -1
- package/dist/dto/get-user-devices.dto.js +5 -39
- package/dist/dto/get-user-devices.dto.js.map +1 -1
- package/dist/dto/get-user-sessions-response.dto.d.ts +1 -1
- package/dist/dto/get-user-sessions-response.dto.js +1 -1
- package/dist/dto/get-user-sessions.dto.d.ts +1 -1
- package/dist/dto/get-user-sessions.dto.js +1 -1
- package/dist/dto/index.d.ts +8 -2
- package/dist/dto/index.d.ts.map +1 -1
- package/dist/dto/index.js +8 -2
- package/dist/dto/index.js.map +1 -1
- package/dist/dto/logout-all-response.dto.d.ts +1 -1
- package/dist/dto/logout-all-response.dto.js +1 -1
- package/dist/dto/logout-all.dto.d.ts +1 -18
- package/dist/dto/logout-all.dto.d.ts.map +1 -1
- package/dist/dto/logout-all.dto.js +1 -30
- package/dist/dto/logout-all.dto.js.map +1 -1
- package/dist/dto/logout-session.dto.d.ts +0 -5
- package/dist/dto/logout-session.dto.d.ts.map +1 -1
- package/dist/dto/logout-session.dto.js +0 -12
- package/dist/dto/logout-session.dto.js.map +1 -1
- package/dist/dto/logout.dto.d.ts +1 -18
- package/dist/dto/logout.dto.d.ts.map +1 -1
- package/dist/dto/logout.dto.js +1 -30
- package/dist/dto/logout.dto.js.map +1 -1
- package/dist/dto/remove-devices.dto.d.ts +4 -16
- package/dist/dto/remove-devices.dto.d.ts.map +1 -1
- package/dist/dto/remove-devices.dto.js +4 -26
- package/dist/dto/remove-devices.dto.js.map +1 -1
- package/dist/dto/set-mfa-exemption.dto.d.ts +4 -2
- package/dist/dto/set-mfa-exemption.dto.d.ts.map +1 -1
- package/dist/dto/set-mfa-exemption.dto.js +5 -3
- package/dist/dto/set-mfa-exemption.dto.js.map +1 -1
- package/dist/dto/set-must-change-password.dto.d.ts +3 -3
- package/dist/dto/set-must-change-password.dto.d.ts.map +1 -1
- package/dist/dto/set-must-change-password.dto.js +5 -5
- package/dist/dto/set-must-change-password.dto.js.map +1 -1
- package/dist/dto/set-preferred-method.dto.d.ts +4 -16
- package/dist/dto/set-preferred-method.dto.d.ts.map +1 -1
- package/dist/dto/set-preferred-method.dto.js +4 -26
- package/dist/dto/set-preferred-method.dto.js.map +1 -1
- package/dist/dto/setup-mfa.dto.d.ts +3 -18
- package/dist/dto/setup-mfa.dto.d.ts.map +1 -1
- package/dist/dto/setup-mfa.dto.js +3 -30
- package/dist/dto/setup-mfa.dto.js.map +1 -1
- package/dist/dto/social-auth.dto.d.ts +4 -34
- package/dist/dto/social-auth.dto.d.ts.map +1 -1
- package/dist/dto/social-auth.dto.js +10 -68
- package/dist/dto/social-auth.dto.js.map +1 -1
- package/dist/dto/update-user-attributes.dto.d.ts +26 -0
- package/dist/dto/update-user-attributes.dto.d.ts.map +1 -0
- package/dist/dto/update-user-attributes.dto.js +30 -0
- package/dist/dto/update-user-attributes.dto.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/hooks.interface.d.ts +2 -1
- package/dist/interfaces/hooks.interface.d.ts.map +1 -1
- package/dist/interfaces/provider.interface.d.ts +1 -1
- package/dist/interfaces/provider.interface.d.ts.map +1 -1
- package/dist/services/adaptive-mfa-decision.service.js +2 -2
- package/dist/services/adaptive-mfa-decision.service.js.map +1 -1
- package/dist/services/admin-auth.service.d.ts +307 -0
- package/dist/services/admin-auth.service.d.ts.map +1 -0
- package/dist/services/admin-auth.service.js +885 -0
- package/dist/services/admin-auth.service.js.map +1 -0
- package/dist/services/auth-audit.service.d.ts +16 -16
- package/dist/services/auth-audit.service.d.ts.map +1 -1
- package/dist/services/auth-audit.service.js +33 -33
- package/dist/services/auth-audit.service.js.map +1 -1
- package/dist/services/auth-challenge-helper.service.js +3 -3
- package/dist/services/auth-challenge-helper.service.js.map +1 -1
- package/dist/services/auth-service-internal-helpers.d.ts +2 -2
- package/dist/services/auth-service-internal-helpers.d.ts.map +1 -1
- package/dist/services/auth-service-internal-helpers.js.map +1 -1
- package/dist/services/auth.service.d.ts +122 -446
- package/dist/services/auth.service.d.ts.map +1 -1
- package/dist/services/auth.service.js +424 -1274
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/mfa.service.d.ts +90 -12
- package/dist/services/mfa.service.d.ts.map +1 -1
- package/dist/services/mfa.service.js +395 -264
- package/dist/services/mfa.service.js.map +1 -1
- package/dist/services/password-reset.service.d.ts.map +1 -1
- package/dist/services/password-reset.service.js +80 -29
- package/dist/services/password-reset.service.js.map +1 -1
- package/dist/services/social-auth.service.d.ts +7 -0
- package/dist/services/social-auth.service.d.ts.map +1 -1
- package/dist/services/social-auth.service.js +38 -26
- package/dist/services/social-auth.service.js.map +1 -1
- package/dist/services/user.service.d.ts +3 -3
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +7 -7
- package/dist/services/user.service.js.map +1 -1
- package/dist/utils/dto-validator.d.ts.map +1 -1
- package/dist/utils/dto-validator.js +50 -4
- package/dist/utils/dto-validator.js.map +1 -1
- package/dist/utils/setup/init-services.d.ts +2 -1
- package/dist/utils/setup/init-services.d.ts.map +1 -1
- package/dist/utils/setup/init-services.js +2 -0
- package/dist/utils/setup/init-services.js.map +1 -1
- package/package.json +1 -1
- package/dist/dto/change-password-request.dto.d.ts +0 -43
- package/dist/dto/change-password-request.dto.d.ts.map +0 -1
- package/dist/dto/change-password-request.dto.js.map +0 -1
- package/dist/dto/update-user-attributes-request.dto.d.ts +0 -44
- package/dist/dto/update-user-attributes-request.dto.d.ts.map +0 -1
- package/dist/dto/update-user-attributes-request.dto.js.map +0 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { IAuthAudit } from '../interfaces/entities.interface';
|
|
2
|
+
import { GetUserAuthHistoryDTO } from './get-user-auth-history.dto';
|
|
3
|
+
/**
|
|
4
|
+
* Request DTO for getting user authentication history (admin-only)
|
|
5
|
+
*
|
|
6
|
+
* Admin DTO - requires sub field. Used by AdminAuthService.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const result = await auditService.getUserAuthHistory({
|
|
11
|
+
* sub: 'user-uuid',
|
|
12
|
+
* page: 1,
|
|
13
|
+
* limit: 50,
|
|
14
|
+
* eventTypes: [AuthAuditEventType.LOGIN_SUCCESS],
|
|
15
|
+
* startDate: new Date('2025-01-01'),
|
|
16
|
+
* });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare class AdminGetUserAuthHistoryDTO extends GetUserAuthHistoryDTO {
|
|
20
|
+
/**
|
|
21
|
+
* User's unique identifier (UUID v4)
|
|
22
|
+
*
|
|
23
|
+
* Validation:
|
|
24
|
+
* - Must be a valid UUID v4 format
|
|
25
|
+
* - Matches DB constraint: char(36) or uuid
|
|
26
|
+
*
|
|
27
|
+
* Sanitization:
|
|
28
|
+
* - Trimmed
|
|
29
|
+
* - Lowercased for consistency
|
|
30
|
+
*
|
|
31
|
+
* Required for admin operations.
|
|
32
|
+
*
|
|
33
|
+
* @example "a21b654c-2746-4168-acee-c175083a65cd"
|
|
34
|
+
*/
|
|
35
|
+
sub: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Response DTO for paginated user authentication history
|
|
39
|
+
*/
|
|
40
|
+
export declare class GetUserAuthHistoryResponseDTO {
|
|
41
|
+
/**
|
|
42
|
+
* Array of audit records
|
|
43
|
+
*/
|
|
44
|
+
data: IAuthAudit[];
|
|
45
|
+
/**
|
|
46
|
+
* Total number of records matching the query
|
|
47
|
+
*/
|
|
48
|
+
total: number;
|
|
49
|
+
/**
|
|
50
|
+
* Current page number
|
|
51
|
+
*/
|
|
52
|
+
page: number;
|
|
53
|
+
/**
|
|
54
|
+
* Number of records per page
|
|
55
|
+
*/
|
|
56
|
+
limit: number;
|
|
57
|
+
/**
|
|
58
|
+
* Total number of pages
|
|
59
|
+
*/
|
|
60
|
+
totalPages: number;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=admin-get-user-auth-history.dto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-get-user-auth-history.dto.d.ts","sourceRoot":"","sources":["../../src/dto/admin-get-user-auth-history.dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAG9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,0BAA2B,SAAQ,qBAAqB;IACnE;;;;;;;;;;;;;;OAcG;IAQH,GAAG,EAAG,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,6BAA6B;IACxC;;OAEG;IACH,IAAI,EAAG,UAAU,EAAE,CAAC;IAEpB;;OAEG;IACH,KAAK,EAAG,MAAM,CAAC;IAEf;;OAEG;IACH,IAAI,EAAG,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,EAAG,MAAM,CAAC;IAEf;;OAEG;IACH,UAAU,EAAG,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
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.GetUserAuthHistoryResponseDTO = exports.AdminGetUserAuthHistoryDTO = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
const class_transformer_1 = require("class-transformer");
|
|
15
|
+
const get_user_auth_history_dto_1 = require("./get-user-auth-history.dto");
|
|
16
|
+
/**
|
|
17
|
+
* Request DTO for getting user authentication history (admin-only)
|
|
18
|
+
*
|
|
19
|
+
* Admin DTO - requires sub field. Used by AdminAuthService.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const result = await auditService.getUserAuthHistory({
|
|
24
|
+
* sub: 'user-uuid',
|
|
25
|
+
* page: 1,
|
|
26
|
+
* limit: 50,
|
|
27
|
+
* eventTypes: [AuthAuditEventType.LOGIN_SUCCESS],
|
|
28
|
+
* startDate: new Date('2025-01-01'),
|
|
29
|
+
* });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
class AdminGetUserAuthHistoryDTO extends get_user_auth_history_dto_1.GetUserAuthHistoryDTO {
|
|
33
|
+
/**
|
|
34
|
+
* User's unique identifier (UUID v4)
|
|
35
|
+
*
|
|
36
|
+
* Validation:
|
|
37
|
+
* - Must be a valid UUID v4 format
|
|
38
|
+
* - Matches DB constraint: char(36) or uuid
|
|
39
|
+
*
|
|
40
|
+
* Sanitization:
|
|
41
|
+
* - Trimmed
|
|
42
|
+
* - Lowercased for consistency
|
|
43
|
+
*
|
|
44
|
+
* Required for admin operations.
|
|
45
|
+
*
|
|
46
|
+
* @example "a21b654c-2746-4168-acee-c175083a65cd"
|
|
47
|
+
*/
|
|
48
|
+
sub;
|
|
49
|
+
}
|
|
50
|
+
exports.AdminGetUserAuthHistoryDTO = AdminGetUserAuthHistoryDTO;
|
|
51
|
+
__decorate([
|
|
52
|
+
(0, class_validator_1.IsUUID)('4', { message: 'User sub must be a valid UUID v4 format' }),
|
|
53
|
+
(0, class_transformer_1.Transform)(({ value }) => {
|
|
54
|
+
if (typeof value === 'string') {
|
|
55
|
+
return value.trim().toLowerCase();
|
|
56
|
+
}
|
|
57
|
+
return value;
|
|
58
|
+
}),
|
|
59
|
+
__metadata("design:type", String)
|
|
60
|
+
], AdminGetUserAuthHistoryDTO.prototype, "sub", void 0);
|
|
61
|
+
/**
|
|
62
|
+
* Response DTO for paginated user authentication history
|
|
63
|
+
*/
|
|
64
|
+
class GetUserAuthHistoryResponseDTO {
|
|
65
|
+
/**
|
|
66
|
+
* Array of audit records
|
|
67
|
+
*/
|
|
68
|
+
data;
|
|
69
|
+
/**
|
|
70
|
+
* Total number of records matching the query
|
|
71
|
+
*/
|
|
72
|
+
total;
|
|
73
|
+
/**
|
|
74
|
+
* Current page number
|
|
75
|
+
*/
|
|
76
|
+
page;
|
|
77
|
+
/**
|
|
78
|
+
* Number of records per page
|
|
79
|
+
*/
|
|
80
|
+
limit;
|
|
81
|
+
/**
|
|
82
|
+
* Total number of pages
|
|
83
|
+
*/
|
|
84
|
+
totalPages;
|
|
85
|
+
}
|
|
86
|
+
exports.GetUserAuthHistoryResponseDTO = GetUserAuthHistoryResponseDTO;
|
|
87
|
+
//# sourceMappingURL=admin-get-user-auth-history.dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-get-user-auth-history.dto.js","sourceRoot":"","sources":["../../src/dto/admin-get-user-auth-history.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,qDAAyC;AACzC,yDAA8C;AAC9C,2EAAoE;AAEpE;;;;;;;;;;;;;;;GAeG;AACH,MAAa,0BAA2B,SAAQ,iDAAqB;IACnE;;;;;;;;;;;;;;OAcG;IAQH,GAAG,CAAU;CACd;AAxBD,gEAwBC;AADC;IAPC,IAAA,wBAAM,EAAC,GAAG,EAAE,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC;IACnE,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;;uDACW;AAGf;;GAEG;AACH,MAAa,6BAA6B;IACxC;;OAEG;IACH,IAAI,CAAgB;IAEpB;;OAEG;IACH,KAAK,CAAU;IAEf;;OAEG;IACH,IAAI,CAAU;IAEd;;OAEG;IACH,KAAK,CAAU;IAEf;;OAEG;IACH,UAAU,CAAU;CACrB;AAzBD,sEAyBC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Logout All DTO
|
|
3
|
+
*
|
|
4
|
+
* Request DTO for logging out a target user from all sessions (admin-initiated).
|
|
5
|
+
*
|
|
6
|
+
* Security:
|
|
7
|
+
* - Requires target user sub (UUID)
|
|
8
|
+
* - Prevents unauthorized logout attempts
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const result = await adminAuthService.logoutAll({
|
|
13
|
+
* sub: 'user-uuid',
|
|
14
|
+
* forgetDevices: true,
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Request DTO for admin logout all sessions
|
|
20
|
+
*/
|
|
21
|
+
export declare class AdminLogoutAllDTO {
|
|
22
|
+
/**
|
|
23
|
+
* User's unique identifier (UUID v4)
|
|
24
|
+
*
|
|
25
|
+
* Validation:
|
|
26
|
+
* - Must be a valid UUID v4 format
|
|
27
|
+
* - Matches DB constraint: char(36) or uuid
|
|
28
|
+
*
|
|
29
|
+
* Sanitization:
|
|
30
|
+
* - Trimmed
|
|
31
|
+
* - Lowercased for consistency
|
|
32
|
+
*
|
|
33
|
+
* @example "a21b654c-2746-4168-acee-c175083a65cd"
|
|
34
|
+
*/
|
|
35
|
+
sub: string;
|
|
36
|
+
/**
|
|
37
|
+
* Whether to also forget/revoke all trusted devices
|
|
38
|
+
*
|
|
39
|
+
* If true, all trusted devices for this user will be revoked,
|
|
40
|
+
* requiring MFA on next login from any device.
|
|
41
|
+
*
|
|
42
|
+
* Default: false (devices remain trusted)
|
|
43
|
+
*
|
|
44
|
+
* @example false
|
|
45
|
+
*/
|
|
46
|
+
forgetDevices?: boolean;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=admin-logout-all.dto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-logout-all.dto.d.ts","sourceRoot":"","sources":["../../src/dto/admin-logout-all.dto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;;;;;;;OAYG;IAQH,GAAG,EAAG,MAAM,CAAC;IAEb;;;;;;;;;OASG;IAQH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB"}
|
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Admin Logout All DTO
|
|
4
4
|
*
|
|
5
|
-
* Request DTO for
|
|
5
|
+
* Request DTO for logging out a target user from all sessions (admin-initiated).
|
|
6
6
|
*
|
|
7
7
|
* Security:
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
* - Current password required for security
|
|
8
|
+
* - Requires target user sub (UUID)
|
|
9
|
+
* - Prevents unauthorized logout attempts
|
|
11
10
|
*
|
|
12
11
|
* @example
|
|
13
12
|
* ```typescript
|
|
14
|
-
* await
|
|
13
|
+
* const result = await adminAuthService.logoutAll({
|
|
15
14
|
* sub: 'user-uuid',
|
|
16
|
-
*
|
|
17
|
-
* newPassword: 'NewPass456!'
|
|
15
|
+
* forgetDevices: true,
|
|
18
16
|
* });
|
|
19
17
|
* ```
|
|
20
18
|
*/
|
|
@@ -28,22 +26,18 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
28
26
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
29
27
|
};
|
|
30
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
-
exports.
|
|
29
|
+
exports.AdminLogoutAllDTO = void 0;
|
|
32
30
|
const class_validator_1 = require("class-validator");
|
|
33
31
|
const class_transformer_1 = require("class-transformer");
|
|
34
|
-
const change_password_dto_1 = require("./change-password.dto");
|
|
35
32
|
/**
|
|
36
|
-
* Request DTO for
|
|
33
|
+
* Request DTO for admin logout all sessions
|
|
37
34
|
*/
|
|
38
|
-
class
|
|
35
|
+
class AdminLogoutAllDTO {
|
|
39
36
|
/**
|
|
40
37
|
* User's unique identifier (UUID v4)
|
|
41
38
|
*
|
|
42
|
-
* Optional at controller level - filled from authenticated user's JWT.
|
|
43
|
-
* Validated only when provided (service layer will ensure it's set).
|
|
44
|
-
*
|
|
45
39
|
* Validation:
|
|
46
|
-
* - Must be a valid UUID v4 format
|
|
40
|
+
* - Must be a valid UUID v4 format
|
|
47
41
|
* - Matches DB constraint: char(36) or uuid
|
|
48
42
|
*
|
|
49
43
|
* Sanitization:
|
|
@@ -53,10 +47,20 @@ class ChangePasswordRequestDTO extends change_password_dto_1.ChangePasswordDTO {
|
|
|
53
47
|
* @example "a21b654c-2746-4168-acee-c175083a65cd"
|
|
54
48
|
*/
|
|
55
49
|
sub;
|
|
50
|
+
/**
|
|
51
|
+
* Whether to also forget/revoke all trusted devices
|
|
52
|
+
*
|
|
53
|
+
* If true, all trusted devices for this user will be revoked,
|
|
54
|
+
* requiring MFA on next login from any device.
|
|
55
|
+
*
|
|
56
|
+
* Default: false (devices remain trusted)
|
|
57
|
+
*
|
|
58
|
+
* @example false
|
|
59
|
+
*/
|
|
60
|
+
forgetDevices;
|
|
56
61
|
}
|
|
57
|
-
exports.
|
|
62
|
+
exports.AdminLogoutAllDTO = AdminLogoutAllDTO;
|
|
58
63
|
__decorate([
|
|
59
|
-
(0, class_validator_1.ValidateIf)((o) => o.sub !== undefined && o.sub !== null && o.sub !== ''),
|
|
60
64
|
(0, class_validator_1.IsUUID)('4', { message: 'User sub must be a valid UUID v4 format' }),
|
|
61
65
|
(0, class_transformer_1.Transform)(({ value }) => {
|
|
62
66
|
if (typeof value === 'string') {
|
|
@@ -64,7 +68,18 @@ __decorate([
|
|
|
64
68
|
}
|
|
65
69
|
return value;
|
|
66
70
|
}),
|
|
67
|
-
(0, class_validator_1.IsOptional)(),
|
|
68
71
|
__metadata("design:type", String)
|
|
69
|
-
],
|
|
70
|
-
|
|
72
|
+
], AdminLogoutAllDTO.prototype, "sub", void 0);
|
|
73
|
+
__decorate([
|
|
74
|
+
(0, class_validator_1.IsOptional)(),
|
|
75
|
+
(0, class_validator_1.IsBoolean)(),
|
|
76
|
+
(0, class_transformer_1.Transform)(({ value }) => {
|
|
77
|
+
if (value === 'true' || value === '1')
|
|
78
|
+
return true;
|
|
79
|
+
if (value === 'false' || value === '0')
|
|
80
|
+
return false;
|
|
81
|
+
return value;
|
|
82
|
+
}),
|
|
83
|
+
__metadata("design:type", Boolean)
|
|
84
|
+
], AdminLogoutAllDTO.prototype, "forgetDevices", void 0);
|
|
85
|
+
//# sourceMappingURL=admin-logout-all.dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-logout-all.dto.js","sourceRoot":"","sources":["../../src/dto/admin-logout-all.dto.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;;;;;;;;;;AAEH,qDAAgE;AAChE,yDAA8C;AAE9C;;GAEG;AACH,MAAa,iBAAiB;IAC5B;;;;;;;;;;;;OAYG;IAQH,GAAG,CAAU;IAEb;;;;;;;;;OASG;IAQH,aAAa,CAAW;CACzB;AAzCD,8CAyCC;AApBC;IAPC,IAAA,wBAAM,EAAC,GAAG,EAAE,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC;IACnE,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;;8CACW;AAmBb;IAPC,IAAA,4BAAU,GAAE;IACZ,IAAA,2BAAS,GAAE;IACX,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACvB,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACnD,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;;wDACsB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { RemoveDevicesDTO, RemoveDevicesResponseDTO } from './remove-devices.dto';
|
|
2
|
+
/**
|
|
3
|
+
* Admin DTO for removing MFA devices for a specific user
|
|
4
|
+
*
|
|
5
|
+
* Admin APIs must explicitly target a user via `sub`.
|
|
6
|
+
* This DTO mirrors {@link RemoveDevicesDTO} but adds `sub`.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const result = await mfaService.adminRemoveDevices({
|
|
11
|
+
* sub: 'a21b654c-2746-4168-acee-c175083a65cd',
|
|
12
|
+
* methodType: 'totp',
|
|
13
|
+
* });
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare class AdminRemoveDevicesDTO extends RemoveDevicesDTO {
|
|
17
|
+
/**
|
|
18
|
+
* Target user's unique identifier (UUID v4)
|
|
19
|
+
*
|
|
20
|
+
* @example "a21b654c-2746-4168-acee-c175083a65cd"
|
|
21
|
+
*/
|
|
22
|
+
sub: string;
|
|
23
|
+
}
|
|
24
|
+
export { RemoveDevicesResponseDTO };
|
|
25
|
+
//# sourceMappingURL=admin-remove-devices.dto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-remove-devices.dto.d.ts","sourceRoot":"","sources":["../../src/dto/admin-remove-devices.dto.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAElF;;;;;;;;;;;;;GAaG;AACH,qBAAa,qBAAsB,SAAQ,gBAAgB;IACzD;;;;OAIG;IAQH,GAAG,EAAG,MAAM,CAAC;CACd;AAED,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
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.RemoveDevicesResponseDTO = exports.AdminRemoveDevicesDTO = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
const class_transformer_1 = require("class-transformer");
|
|
15
|
+
const remove_devices_dto_1 = require("./remove-devices.dto");
|
|
16
|
+
Object.defineProperty(exports, "RemoveDevicesResponseDTO", { enumerable: true, get: function () { return remove_devices_dto_1.RemoveDevicesResponseDTO; } });
|
|
17
|
+
/**
|
|
18
|
+
* Admin DTO for removing MFA devices for a specific user
|
|
19
|
+
*
|
|
20
|
+
* Admin APIs must explicitly target a user via `sub`.
|
|
21
|
+
* This DTO mirrors {@link RemoveDevicesDTO} but adds `sub`.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const result = await mfaService.adminRemoveDevices({
|
|
26
|
+
* sub: 'a21b654c-2746-4168-acee-c175083a65cd',
|
|
27
|
+
* methodType: 'totp',
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
class AdminRemoveDevicesDTO extends remove_devices_dto_1.RemoveDevicesDTO {
|
|
32
|
+
/**
|
|
33
|
+
* Target user's unique identifier (UUID v4)
|
|
34
|
+
*
|
|
35
|
+
* @example "a21b654c-2746-4168-acee-c175083a65cd"
|
|
36
|
+
*/
|
|
37
|
+
sub;
|
|
38
|
+
}
|
|
39
|
+
exports.AdminRemoveDevicesDTO = AdminRemoveDevicesDTO;
|
|
40
|
+
__decorate([
|
|
41
|
+
(0, class_validator_1.IsUUID)('4', { message: 'User sub must be a valid UUID v4 format' }),
|
|
42
|
+
(0, class_transformer_1.Transform)(({ value }) => {
|
|
43
|
+
if (typeof value === 'string') {
|
|
44
|
+
return value.trim().toLowerCase();
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
}),
|
|
48
|
+
__metadata("design:type", String)
|
|
49
|
+
], AdminRemoveDevicesDTO.prototype, "sub", void 0);
|
|
50
|
+
//# sourceMappingURL=admin-remove-devices.dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-remove-devices.dto.js","sourceRoot":"","sources":["../../src/dto/admin-remove-devices.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAyC;AACzC,yDAA8C;AAC9C,6DAAkF;AAgCzE,yGAhCkB,6CAAwB,OAgClB;AA9BjC;;;;;;;;;;;;;GAaG;AACH,MAAa,qBAAsB,SAAQ,qCAAgB;IACzD;;;;OAIG;IAQH,GAAG,CAAU;CACd;AAdD,sDAcC;AADC;IAPC,IAAA,wBAAM,EAAC,GAAG,EAAE,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC;IACnE,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;;kDACW"}
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* Admin Reset Password Request DTO
|
|
3
3
|
*
|
|
4
4
|
* Request DTO for admin-initiated password reset workflow.
|
|
5
|
-
* Allows resetting a user's password by
|
|
5
|
+
* Allows resetting a user's password by sub (UUID).
|
|
6
6
|
*
|
|
7
7
|
* Security:
|
|
8
8
|
* - Admin-only operation (should be protected by admin guard)
|
|
9
|
-
* - User
|
|
9
|
+
* - User sub validated
|
|
10
10
|
* - Code + optional link delivery (like email verification)
|
|
11
11
|
* - Configurable expiry (default: 1 hour)
|
|
12
12
|
* - Optional immediate session revocation
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* ```typescript
|
|
17
17
|
* // With link for consumer app custom UI
|
|
18
18
|
* await authService.adminResetPassword({
|
|
19
|
-
*
|
|
19
|
+
* sub: 'a21b654c-2746-4168-acee-c175083a65cd',
|
|
20
20
|
* baseUrl: 'https://myapp.com/reset-password',
|
|
21
21
|
* deliveryMethod: 'email',
|
|
22
22
|
* revokeSessions: true
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
*
|
|
25
25
|
* // Code only (no link)
|
|
26
26
|
* await authService.adminResetPassword({
|
|
27
|
-
*
|
|
27
|
+
* sub: 'a21b654c-2746-4168-acee-c175083a65cd',
|
|
28
28
|
* deliveryMethod: 'email'
|
|
29
29
|
* });
|
|
30
30
|
* ```
|
|
@@ -34,20 +34,18 @@
|
|
|
34
34
|
*/
|
|
35
35
|
export declare class AdminResetPasswordDTO {
|
|
36
36
|
/**
|
|
37
|
-
* User
|
|
37
|
+
* User sub (UUID)
|
|
38
38
|
*
|
|
39
39
|
* Validation:
|
|
40
|
-
* - Must be a
|
|
41
|
-
* - Min 1 character
|
|
42
|
-
* - Max 255 characters
|
|
40
|
+
* - Must be a valid UUID v4
|
|
43
41
|
*
|
|
44
42
|
* Sanitization:
|
|
45
43
|
* - Trimmed
|
|
46
|
-
* - Lowercased
|
|
44
|
+
* - Lowercased for consistency
|
|
47
45
|
*
|
|
48
|
-
* @example "
|
|
46
|
+
* @example "a21b654c-2746-4168-acee-c175083a65cd"
|
|
49
47
|
*/
|
|
50
|
-
|
|
48
|
+
sub: string;
|
|
51
49
|
/**
|
|
52
50
|
* Delivery method for reset code
|
|
53
51
|
*
|
|
@@ -166,56 +164,48 @@ export declare class AdminResetPasswordResponseDTO {
|
|
|
166
164
|
/**
|
|
167
165
|
* Confirm Admin Reset Password DTO
|
|
168
166
|
*
|
|
169
|
-
* User completes admin-initiated password reset with
|
|
170
|
-
*
|
|
167
|
+
* User completes admin-initiated password reset with a verification code.
|
|
168
|
+
*
|
|
169
|
+
* NOTE:
|
|
170
|
+
* - Link support is optional, but links carry the same verification `code` as a query parameter
|
|
171
|
+
* (e.g., `...?code=123456`) to keep consumer apps consistent (code-only).
|
|
171
172
|
*
|
|
172
173
|
* Security:
|
|
173
|
-
* -
|
|
174
|
-
* -
|
|
175
|
-
* - Code-based: Attempt tracking (max 3 attempts)
|
|
174
|
+
* - Code is required
|
|
175
|
+
* - Attempt tracking enforced (max attempts configured in password reset service)
|
|
176
176
|
* - Always revokes all sessions on completion
|
|
177
177
|
* - Always sets mustChangePassword flag
|
|
178
178
|
*
|
|
179
179
|
* @example
|
|
180
180
|
* ```typescript
|
|
181
|
-
* // With code (from email/SMS)
|
|
182
181
|
* await authService.confirmAdminResetPassword({
|
|
183
|
-
*
|
|
182
|
+
* sub: 'a21b654c-2746-4168-acee-c175083a65cd',
|
|
184
183
|
* code: '123456',
|
|
185
184
|
* newPassword: 'NewSecurePass123!'
|
|
186
185
|
* });
|
|
187
|
-
*
|
|
188
|
-
* // With token (from link)
|
|
189
|
-
* await authService.confirmAdminResetPassword({
|
|
190
|
-
* identifier: 'user@example.com',
|
|
191
|
-
* token: '64-char-hex-token-from-link',
|
|
192
|
-
* newPassword: 'NewSecurePass123!'
|
|
193
|
-
* });
|
|
194
186
|
* ```
|
|
195
187
|
*/
|
|
196
188
|
export declare class ConfirmAdminResetPasswordDTO {
|
|
197
189
|
/**
|
|
198
|
-
* User
|
|
190
|
+
* User sub (UUID)
|
|
199
191
|
*
|
|
200
192
|
* Validation:
|
|
201
|
-
* - Must be a
|
|
202
|
-
* - Min 1 character
|
|
203
|
-
* - Max 255 characters
|
|
193
|
+
* - Must be a valid UUID v4
|
|
204
194
|
*
|
|
205
195
|
* Sanitization:
|
|
206
196
|
* - Trimmed
|
|
207
|
-
* - Lowercased
|
|
197
|
+
* - Lowercased for consistency
|
|
208
198
|
*
|
|
209
|
-
* @example "
|
|
199
|
+
* @example "a21b654c-2746-4168-acee-c175083a65cd"
|
|
210
200
|
*/
|
|
211
|
-
|
|
201
|
+
sub: string;
|
|
212
202
|
/**
|
|
213
203
|
* Verification code from email/SMS (6-10 digits)
|
|
214
204
|
*
|
|
215
205
|
* Validation:
|
|
216
206
|
* - Must be string
|
|
217
207
|
* - Length 6-10 characters
|
|
218
|
-
* -
|
|
208
|
+
* - Required
|
|
219
209
|
*
|
|
220
210
|
* Sanitization:
|
|
221
211
|
* - Trimmed
|
|
@@ -224,22 +214,7 @@ export declare class ConfirmAdminResetPasswordDTO {
|
|
|
224
214
|
*
|
|
225
215
|
* @example "123456"
|
|
226
216
|
*/
|
|
227
|
-
code
|
|
228
|
-
/**
|
|
229
|
-
* Verification token from link (64-char hex)
|
|
230
|
-
*
|
|
231
|
-
* Validation:
|
|
232
|
-
* - Must be string
|
|
233
|
-
* - Optional (token OR code required)
|
|
234
|
-
*
|
|
235
|
-
* Sanitization:
|
|
236
|
-
* - Trimmed
|
|
237
|
-
*
|
|
238
|
-
* WHY: Long token from link, single-use, no attempt tracking needed
|
|
239
|
-
*
|
|
240
|
-
* @example "a1b2c3d4..."
|
|
241
|
-
*/
|
|
242
|
-
token?: string;
|
|
217
|
+
code: string;
|
|
243
218
|
/**
|
|
244
219
|
* New password
|
|
245
220
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-reset-password.dto.d.ts","sourceRoot":"","sources":["../../src/dto/admin-reset-password.dto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;
|
|
1
|
+
{"version":3,"file":"admin-reset-password.dto.d.ts","sourceRoot":"","sources":["../../src/dto/admin-reset-password.dto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAmBH;;GAEG;AACH,qBAAa,qBAAqB;IAChC;;;;;;;;;;;OAWG;IAQH,GAAG,EAAG,MAAM,CAAC;IAEb;;;;;;;;;OASG;IAGH,cAAc,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAEjC;;;;;;;;;;;;;;;;;OAiBG;IAaH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;;;;;;;OAWG;IAKH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;;;;;;;OAYG;IAGH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;;;;;;;;;OAYG;IAUH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,6BAA6B;IACxC;;;OAGG;IACH,OAAO,EAAG,OAAO,CAAC;IAElB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAEjC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,4BAA4B;IACvC;;;;;;;;;;;OAWG;IAQH,GAAG,EAAG,MAAM,CAAC;IAEb;;;;;;;;;;;;;;OAcG;IAUH,IAAI,EAAG,MAAM,CAAC;IAEd;;;;;;;;;;;;;;OAcG;IAKH,WAAW,EAAG,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,oCAAoC;IAC/C;;;OAGG;IACH,OAAO,EAAG,OAAO,CAAC;CACnB"}
|