@classytic/arc 2.8.4 → 2.9.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.
- package/README.md +116 -5
- package/dist/{BaseController-DAGGc5Xn.mjs → BaseController-Vu2yc56T.mjs} +188 -102
- package/dist/EventTransport-CqZ8FyM_.d.mts +293 -0
- package/dist/adapters/index.d.mts +2 -2
- package/dist/audit/index.d.mts +100 -11
- package/dist/audit/index.mjs +71 -18
- package/dist/auth/index.d.mts +15 -7
- package/dist/auth/index.mjs +13 -6
- package/dist/{betterAuthOpenApi-C5lDyRH2.mjs → betterAuthOpenApi--rdY15Ld.mjs} +1 -1
- package/dist/cache/index.d.mts +71 -1
- package/dist/cache/index.mjs +96 -3
- package/dist/cli/commands/docs.mjs +1 -1
- package/dist/cli/commands/generate.mjs +1 -1
- package/dist/core/index.d.mts +3 -3
- package/dist/core/index.mjs +4 -5
- package/dist/{core-DKSwNSXf.mjs → core-DNncu0xF.mjs} +1 -1
- package/dist/{createActionRouter-Df1BuawX.mjs → createActionRouter-DH1YFL9m.mjs} +3 -3
- package/dist/{createApp-BOYjBgdI.mjs → createApp-CBJUJKGP.mjs} +6 -5
- package/dist/{defineResource-Bb_Bdhtw.mjs → defineResource-C__jkwvs.mjs} +22 -57
- package/dist/docs/index.d.mts +1 -1
- package/dist/docs/index.mjs +1 -1
- package/dist/dynamic/index.d.mts +2 -2
- package/dist/dynamic/index.mjs +3 -3
- package/dist/{elevation-BBGFjzIP.mjs → elevation-DxQ6ACbt.mjs} +20 -6
- package/dist/{errorHandler-mzqk4cGl.mjs → errorHandler-CZDW4EXS.mjs} +59 -7
- package/dist/{errorHandler-CdZDavNH.d.mts → errorHandler-DixGcttC.d.mts} +37 -2
- package/dist/{eventPlugin-CVxlE6De.d.mts → eventPlugin-BxvaCIZF.d.mts} +14 -2
- package/dist/{eventPlugin-D91S2YF4.mjs → eventPlugin-Dl7MoVWH.mjs} +83 -5
- package/dist/events/index.d.mts +147 -36
- package/dist/events/index.mjs +338 -101
- package/dist/events/transports/redis-stream-entry.d.mts +1 -1
- package/dist/events/transports/redis.d.mts +1 -1
- package/dist/factory/index.d.mts +1 -1
- package/dist/factory/index.mjs +1 -1
- package/dist/{fields-DC4So2M2.d.mts → fields-BC7zcmI9.d.mts} +15 -3
- package/dist/{fields-ipsbIRPK.mjs → fields-CU6FlaDV.mjs} +18 -5
- package/dist/filesUpload-q8oHt--L.mjs +377 -0
- package/dist/hooks/index.d.mts +1 -1
- package/dist/idempotency/index.d.mts +28 -4
- package/dist/idempotency/index.mjs +111 -2
- package/dist/idempotency/redis.d.mts +2 -2
- package/dist/idempotency/redis.mjs +134 -13
- package/dist/{index-CSkeivBx.d.mts → index-C-xjcA6F.d.mts} +2 -2
- package/dist/{index-CpTSDqmD.d.mts → index-Cibkchnx.d.mts} +5 -136
- package/dist/{index-BgmMdpm8.d.mts → index-CtGKT0lf.d.mts} +1 -1
- package/dist/index.d.mts +8 -8
- package/dist/index.mjs +8 -8
- package/dist/integrations/event-gateway.d.mts +1 -1
- package/dist/integrations/index.d.mts +1 -1
- package/dist/integrations/jobs.d.mts +25 -3
- package/dist/integrations/jobs.mjs +63 -4
- package/dist/integrations/mcp/index.d.mts +26 -8
- package/dist/integrations/mcp/index.mjs +96 -17
- package/dist/integrations/mcp/testing.d.mts +1 -1
- package/dist/integrations/mcp/testing.mjs +1 -1
- package/dist/integrations/webhooks.d.mts +5 -0
- package/dist/integrations/webhooks.mjs +6 -0
- package/dist/{interface-BVuMfeVv.d.mts → interface-YrWsmKqE.d.mts} +324 -194
- package/dist/{openapi-CYCuekCn.mjs → openapi-CXuTG1M9.mjs} +3 -3
- package/dist/org/index.d.mts +2 -2
- package/dist/permissions/index.d.mts +3 -3
- package/dist/permissions/index.mjs +3 -3
- package/dist/{permissions-CH4cNwJi.mjs → permissions-oNZawnkR.mjs} +1 -1
- package/dist/plugins/index.d.mts +6 -6
- package/dist/plugins/index.mjs +4 -4
- package/dist/plugins/response-cache.mjs +1 -1
- package/dist/plugins/tracing-entry.d.mts +1 -1
- package/dist/plugins/tracing-entry.mjs +1 -1
- package/dist/policies/index.d.mts +26 -33
- package/dist/presets/filesUpload.d.mts +71 -0
- package/dist/presets/filesUpload.mjs +2 -0
- package/dist/presets/index.d.mts +4 -2
- package/dist/presets/index.mjs +4 -2
- package/dist/presets/multiTenant.d.mts +1 -1
- package/dist/presets/multiTenant.mjs +1 -1
- package/dist/presets/search.d.mts +91 -0
- package/dist/presets/search.mjs +150 -0
- package/dist/{presets-C2xgzW6x.mjs → presets-hM4WhNWY.mjs} +1 -1
- package/dist/{queryCachePlugin-D0iIVhW_.mjs → queryCachePlugin-DbUVroUG.mjs} +2 -2
- package/dist/redis-MXLp1oOf.d.mts +115 -0
- package/dist/{redis-stream-D54N5oXs.d.mts → redis-stream-Bz-4q96t.d.mts} +1 -1
- package/dist/registry/index.d.mts +1 -1
- package/dist/{resourceToTools-O_HwWXFa.mjs → resourceToTools-C3cWymnW.mjs} +65 -48
- package/dist/rpc/index.mjs +1 -1
- package/dist/{schemaConverter-OxfCshus.mjs → schemaConverter-BxFDdtXu.mjs} +25 -9
- package/dist/scope/index.d.mts +2 -2
- package/dist/scope/index.mjs +1 -1
- package/dist/storage-BwGQXUpd.d.mts +146 -0
- package/dist/store-helpers-DFiZl5TL.mjs +57 -0
- package/dist/testing/index.d.mts +7 -15
- package/dist/testing/index.mjs +23 -76
- package/dist/testing/storageContract.d.mts +26 -0
- package/dist/testing/storageContract.mjs +216 -0
- package/dist/types/index.d.mts +5 -5
- package/dist/types/storage.d.mts +2 -0
- package/dist/types/storage.mjs +1 -0
- package/dist/{types-CcG4avic.d.mts → types-CoSzA-s-.d.mts} +1 -1
- package/dist/{types-Bg2X42_m.d.mts → types-CunEX4UX.d.mts} +7 -5
- package/dist/{types-CVC4HOKi.d.mts → types-DZi1aYhm.d.mts} +1 -1
- package/dist/utils/index.d.mts +26 -8
- package/dist/utils/index.mjs +6 -6
- package/dist/{utils-yYT3HDXt.mjs → utils-B7FuRr9w.mjs} +1 -1
- package/package.json +23 -11
- package/skills/arc/SKILL.md +92 -14
- package/skills/arc/references/auth.md +94 -0
- package/skills/arc/references/events.md +229 -12
- package/skills/arc/references/mcp.md +4 -17
- package/skills/arc/references/multi-tenancy.md +43 -0
- package/skills/arc/references/production.md +34 -19
- package/dist/EventTransport-CinyO7zQ.d.mts +0 -135
- package/dist/audit/mongodb.d.mts +0 -2
- package/dist/audit/mongodb.mjs +0 -2
- package/dist/idempotency/mongodb.d.mts +0 -2
- package/dist/idempotency/mongodb.mjs +0 -123
- package/dist/mongodb-B5O6xaW1.mjs +0 -90
- package/dist/mongodb-B8U2xaLj.d.mts +0 -127
- package/dist/mongodb-X7LbEjTN.d.mts +0 -80
- package/dist/redis-z3sFr1UP.d.mts +0 -49
- /package/dist/{applyPermissionResult-D6GPMsvh.mjs → applyPermissionResult-bqGpo9ML.mjs} +0 -0
- /package/dist/{circuitBreaker-cmi5XDv5.mjs → circuitBreaker-l18oRgL5.mjs} +0 -0
- /package/dist/{elevation-s5ykdNHr.d.mts → elevation-B6S5csVA.d.mts} +0 -0
- /package/dist/{errors-Bmn3eZT6.d.mts → errors-BI8kEKsO.d.mts} +0 -0
- /package/dist/{errors-BF2bIOIS.mjs → errors-CqWnSqM-.mjs} +0 -0
- /package/dist/{memory-Cp7_cAko.mjs → memory-BFAYkf8H.mjs} +0 -0
- /package/dist/{pluralize-A0tWEl1K.mjs → pluralize-CWP6MB39.mjs} +0 -0
- /package/dist/{queryParser-CgCtsjti.mjs → queryParser-Cs-6SHQK.mjs} +0 -0
- /package/dist/{requestContext-DYvHl113.mjs → requestContext-DYtmNpm5.mjs} +0 -0
- /package/dist/{tracing-DxjKk7eW.d.mts → tracing-xqXzWeaf.d.mts} +0 -0
- /package/dist/{typeGuards-CcFZXgU7.mjs → typeGuards-Cj5Rgvlg.mjs} +0 -0
- /package/dist/{types-C72d3NDn.d.mts → types-BD85MlEK.d.mts} +0 -0
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import { i as UserBase } from "./types-CVC4HOKi.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/audit/stores/interface.d.ts
|
|
4
|
-
type AuditAction = "create" | "update" | "delete" | "restore" | "custom";
|
|
5
|
-
interface AuditEntry {
|
|
6
|
-
/** Unique audit log ID */
|
|
7
|
-
id: string;
|
|
8
|
-
/** Resource name (e.g., 'product', 'user') */
|
|
9
|
-
resource: string;
|
|
10
|
-
/** Document/entity ID */
|
|
11
|
-
documentId: string;
|
|
12
|
-
/** Action performed */
|
|
13
|
-
action: AuditAction;
|
|
14
|
-
/** User who performed the action */
|
|
15
|
-
userId?: string;
|
|
16
|
-
/** Organization context */
|
|
17
|
-
organizationId?: string;
|
|
18
|
-
/** Previous state (for updates) */
|
|
19
|
-
before?: Record<string, unknown>;
|
|
20
|
-
/** New state (for creates/updates) */
|
|
21
|
-
after?: Record<string, unknown>;
|
|
22
|
-
/** Changed fields (for updates) */
|
|
23
|
-
changes?: string[];
|
|
24
|
-
/** Request ID for tracing */
|
|
25
|
-
requestId?: string;
|
|
26
|
-
/** IP address */
|
|
27
|
-
ipAddress?: string;
|
|
28
|
-
/** User agent */
|
|
29
|
-
userAgent?: string;
|
|
30
|
-
/** Custom metadata */
|
|
31
|
-
metadata?: Record<string, unknown>;
|
|
32
|
-
/** When the action occurred */
|
|
33
|
-
timestamp: Date;
|
|
34
|
-
}
|
|
35
|
-
interface AuditContext {
|
|
36
|
-
user?: UserBase;
|
|
37
|
-
organizationId?: string;
|
|
38
|
-
requestId?: string;
|
|
39
|
-
ipAddress?: string;
|
|
40
|
-
userAgent?: string;
|
|
41
|
-
/** HTTP method + route pattern (e.g., 'PATCH /api/products/:id') */
|
|
42
|
-
endpoint?: string;
|
|
43
|
-
/** Request duration in milliseconds */
|
|
44
|
-
duration?: number;
|
|
45
|
-
}
|
|
46
|
-
interface AuditStoreOptions {
|
|
47
|
-
/** Store name for logging */
|
|
48
|
-
name: string;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Abstract audit store interface
|
|
52
|
-
*/
|
|
53
|
-
interface AuditStore {
|
|
54
|
-
/** Store name */
|
|
55
|
-
readonly name: string;
|
|
56
|
-
/** Log an audit entry */
|
|
57
|
-
log(entry: AuditEntry): Promise<void>;
|
|
58
|
-
/** Query audit logs (optional - not all stores support querying) */
|
|
59
|
-
query?(options: AuditQueryOptions): Promise<AuditEntry[]>;
|
|
60
|
-
/** Close/cleanup (optional) */
|
|
61
|
-
close?(): Promise<void>;
|
|
62
|
-
}
|
|
63
|
-
interface AuditQueryOptions {
|
|
64
|
-
resource?: string;
|
|
65
|
-
documentId?: string;
|
|
66
|
-
userId?: string;
|
|
67
|
-
organizationId?: string;
|
|
68
|
-
action?: AuditAction | AuditAction[];
|
|
69
|
-
from?: Date;
|
|
70
|
-
to?: Date;
|
|
71
|
-
limit?: number;
|
|
72
|
-
offset?: number;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Create audit entry from context
|
|
76
|
-
*/
|
|
77
|
-
declare function createAuditEntry(resource: string, documentId: string, action: AuditAction, context: AuditContext, data?: {
|
|
78
|
-
before?: Record<string, unknown>;
|
|
79
|
-
after?: Record<string, unknown>;
|
|
80
|
-
metadata?: Record<string, unknown>;
|
|
81
|
-
}): AuditEntry;
|
|
82
|
-
//#endregion
|
|
83
|
-
//#region src/audit/stores/mongodb.d.ts
|
|
84
|
-
interface MongoAuditStoreOptions {
|
|
85
|
-
/** MongoDB connection or mongoose instance */
|
|
86
|
-
connection: MongoConnection;
|
|
87
|
-
/** Collection name (default: 'audit_logs') */
|
|
88
|
-
collection?: string;
|
|
89
|
-
/** TTL in days (default: 90, 0 = no expiry) */
|
|
90
|
-
ttlDays?: number;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Minimal MongoDB connection interface — DB-agnostic.
|
|
94
|
-
*
|
|
95
|
-
* Accepts:
|
|
96
|
-
* - Native MongoDB `Db` instance (has `.collection()`)
|
|
97
|
-
* - Mongoose `connection.db` (has `.collection()`)
|
|
98
|
-
* - Any object with `.collection(name)` method
|
|
99
|
-
*
|
|
100
|
-
* For Mongoose users: pass `mongoose.connection.db`, not `mongoose.connection`.
|
|
101
|
-
*/
|
|
102
|
-
interface MongoConnection {
|
|
103
|
-
collection: (name: string) => MongoCollection;
|
|
104
|
-
}
|
|
105
|
-
interface MongoCollection {
|
|
106
|
-
insertOne: (doc: Record<string, unknown>) => Promise<unknown>;
|
|
107
|
-
find: (query: Record<string, unknown>) => MongoCursor;
|
|
108
|
-
createIndex: (spec: Record<string, unknown>, options?: Record<string, unknown>) => Promise<unknown>;
|
|
109
|
-
}
|
|
110
|
-
interface MongoCursor {
|
|
111
|
-
sort: (spec: Record<string, unknown>) => MongoCursor;
|
|
112
|
-
skip: (n: number) => MongoCursor;
|
|
113
|
-
limit: (n: number) => MongoCursor;
|
|
114
|
-
toArray: () => Promise<Record<string, unknown>[]>;
|
|
115
|
-
}
|
|
116
|
-
declare class MongoAuditStore implements AuditStore {
|
|
117
|
-
readonly name = "mongodb";
|
|
118
|
-
private collection;
|
|
119
|
-
private initialized;
|
|
120
|
-
private ttlDays;
|
|
121
|
-
constructor(options: MongoAuditStoreOptions);
|
|
122
|
-
private ensureIndexes;
|
|
123
|
-
log(entry: AuditEntry): Promise<void>;
|
|
124
|
-
query(options?: AuditQueryOptions): Promise<AuditEntry[]>;
|
|
125
|
-
}
|
|
126
|
-
//#endregion
|
|
127
|
-
export { AuditContext as a, AuditStore as c, AuditAction as i, AuditStoreOptions as l, MongoAuditStoreOptions as n, AuditEntry as o, MongoConnection as r, AuditQueryOptions as s, MongoAuditStore as t, createAuditEntry as u };
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { n as IdempotencyResult, r as IdempotencyStore } from "./interface-B-pe8fhj.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/idempotency/stores/mongodb.d.ts
|
|
4
|
-
interface MongoConnection {
|
|
5
|
-
db: {
|
|
6
|
-
collection(name: string): MongoCollection;
|
|
7
|
-
};
|
|
8
|
-
}
|
|
9
|
-
interface MongoCollection {
|
|
10
|
-
findOne(filter: object): Promise<IdempotencyDocument | null>;
|
|
11
|
-
insertOne(doc: object): Promise<{
|
|
12
|
-
acknowledged: boolean;
|
|
13
|
-
}>;
|
|
14
|
-
updateOne(filter: object, update: object, options?: object): Promise<{
|
|
15
|
-
acknowledged: boolean;
|
|
16
|
-
matchedCount: number;
|
|
17
|
-
modifiedCount: number;
|
|
18
|
-
upsertedCount?: number;
|
|
19
|
-
}>;
|
|
20
|
-
deleteOne(filter: object): Promise<{
|
|
21
|
-
deletedCount: number;
|
|
22
|
-
}>;
|
|
23
|
-
deleteMany(filter: object): Promise<{
|
|
24
|
-
deletedCount: number;
|
|
25
|
-
}>;
|
|
26
|
-
createIndex(spec: object, options?: object): Promise<string>;
|
|
27
|
-
}
|
|
28
|
-
interface IdempotencyDocument {
|
|
29
|
-
_id: string;
|
|
30
|
-
result?: {
|
|
31
|
-
statusCode: number;
|
|
32
|
-
headers: Record<string, string>;
|
|
33
|
-
body: unknown;
|
|
34
|
-
};
|
|
35
|
-
lock?: {
|
|
36
|
-
requestId: string;
|
|
37
|
-
expiresAt: Date;
|
|
38
|
-
};
|
|
39
|
-
createdAt: Date;
|
|
40
|
-
expiresAt: Date;
|
|
41
|
-
}
|
|
42
|
-
/** Minimal logger interface — compatible with console, pino, fastify.log */
|
|
43
|
-
interface IdempotencyLogger {
|
|
44
|
-
warn(message: string, ...args: unknown[]): void;
|
|
45
|
-
}
|
|
46
|
-
interface MongoIdempotencyStoreOptions {
|
|
47
|
-
/** Mongoose connection or MongoDB connection object */
|
|
48
|
-
connection: MongoConnection;
|
|
49
|
-
/** Collection name (default: 'arc_idempotency') */
|
|
50
|
-
collection?: string;
|
|
51
|
-
/** Create TTL index on startup (default: true) */
|
|
52
|
-
createIndex?: boolean;
|
|
53
|
-
/** Default TTL in ms (default: 86400000 = 24 hours) */
|
|
54
|
-
ttlMs?: number;
|
|
55
|
-
/** Logger for operational warnings (default: console) */
|
|
56
|
-
logger?: IdempotencyLogger;
|
|
57
|
-
}
|
|
58
|
-
declare class MongoIdempotencyStore implements IdempotencyStore {
|
|
59
|
-
readonly name = "mongodb";
|
|
60
|
-
private connection;
|
|
61
|
-
private collectionName;
|
|
62
|
-
private ttlMs;
|
|
63
|
-
private indexCreated;
|
|
64
|
-
private shouldEnsureIndex;
|
|
65
|
-
private logger;
|
|
66
|
-
constructor(options: MongoIdempotencyStoreOptions);
|
|
67
|
-
private get collection();
|
|
68
|
-
private ensureIndex;
|
|
69
|
-
get(key: string): Promise<IdempotencyResult | undefined>;
|
|
70
|
-
set(key: string, result: Omit<IdempotencyResult, "key">): Promise<void>;
|
|
71
|
-
tryLock(key: string, requestId: string, ttlMs: number): Promise<boolean>;
|
|
72
|
-
unlock(key: string, requestId: string): Promise<void>;
|
|
73
|
-
isLocked(key: string): Promise<boolean>;
|
|
74
|
-
delete(key: string): Promise<void>;
|
|
75
|
-
deleteByPrefix(prefix: string): Promise<number>;
|
|
76
|
-
findByPrefix(prefix: string): Promise<IdempotencyResult | undefined>;
|
|
77
|
-
close(): Promise<void>;
|
|
78
|
-
}
|
|
79
|
-
//#endregion
|
|
80
|
-
export { MongoIdempotencyStoreOptions as n, MongoIdempotencyStore as t };
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { n as IdempotencyResult, r as IdempotencyStore } from "./interface-B-pe8fhj.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/idempotency/stores/redis.d.ts
|
|
4
|
-
interface RedisClient {
|
|
5
|
-
get(key: string): Promise<string | null>;
|
|
6
|
-
set(key: string, value: string, options?: {
|
|
7
|
-
EX?: number;
|
|
8
|
-
NX?: boolean;
|
|
9
|
-
}): Promise<string | null>;
|
|
10
|
-
del(key: string | string[]): Promise<number>;
|
|
11
|
-
exists(key: string | string[]): Promise<number>;
|
|
12
|
-
/** SCAN command — compatible with node-redis and ioredis varargs signatures. */
|
|
13
|
-
scan?(cursor: string | number, ...args: (string | number)[]): Promise<[string | number, string[]]>;
|
|
14
|
-
quit?(): Promise<string>;
|
|
15
|
-
disconnect?(): Promise<void>;
|
|
16
|
-
}
|
|
17
|
-
interface RedisIdempotencyStoreOptions {
|
|
18
|
-
/** Redis client instance */
|
|
19
|
-
client: RedisClient;
|
|
20
|
-
/** Key prefix (default: 'idem:') */
|
|
21
|
-
prefix?: string;
|
|
22
|
-
/** Lock key prefix (default: 'idem:lock:') */
|
|
23
|
-
lockPrefix?: string;
|
|
24
|
-
/** Default TTL in ms (default: 86400000 = 24 hours) */
|
|
25
|
-
ttlMs?: number;
|
|
26
|
-
}
|
|
27
|
-
declare class RedisIdempotencyStore implements IdempotencyStore {
|
|
28
|
-
readonly name = "redis";
|
|
29
|
-
private client;
|
|
30
|
-
private prefix;
|
|
31
|
-
private lockPrefix;
|
|
32
|
-
private ttlMs;
|
|
33
|
-
constructor(options: RedisIdempotencyStoreOptions);
|
|
34
|
-
private resultKey;
|
|
35
|
-
private lockKey;
|
|
36
|
-
get(key: string): Promise<IdempotencyResult | undefined>;
|
|
37
|
-
set(key: string, result: Omit<IdempotencyResult, "key">): Promise<void>;
|
|
38
|
-
tryLock(key: string, requestId: string, ttlMs: number): Promise<boolean>;
|
|
39
|
-
unlock(key: string, requestId: string): Promise<void>;
|
|
40
|
-
isLocked(key: string): Promise<boolean>;
|
|
41
|
-
delete(key: string): Promise<void>;
|
|
42
|
-
deleteByPrefix(prefix: string): Promise<number>;
|
|
43
|
-
findByPrefix(prefix: string): Promise<IdempotencyResult | undefined>;
|
|
44
|
-
/** Scan Redis keys matching a prefix pattern. Falls back to empty if SCAN unavailable. */
|
|
45
|
-
private scanByPrefix;
|
|
46
|
-
close(): Promise<void>;
|
|
47
|
-
}
|
|
48
|
-
//#endregion
|
|
49
|
-
export { RedisIdempotencyStore as n, RedisIdempotencyStoreOptions as r, RedisClient as t };
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|