@qrvey/data-persistence 0.5.17-763 → 0.5.18-796

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.
@@ -1,7 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logError = logError;
3
4
  exports.PersistenceErrorWrapper = PersistenceErrorWrapper;
4
5
  const NoRecordsAffectedException_1 = require("../error/NoRecordsAffectedException");
6
+ function logError(context, err) {
7
+ const message = err instanceof Error ? err.message : String(err);
8
+ const stack = err instanceof Error ? err.stack : undefined;
9
+ console.error(`[data-persistence] ${context}:`, message);
10
+ if (stack)
11
+ console.error(stack);
12
+ }
5
13
  function PersistenceErrorWrapper(queryResult) {
6
14
  const dynamoNoRecordsAffectedExceptions = [
7
15
  'ConditionalCheckFailedException',
@@ -1 +1 @@
1
- {"version":3,"file":"errorHelper.js","sourceRoot":"","sources":["../../../src/helpers/errorHelper.ts"],"names":[],"mappings":";;AAEA,0DAuBC;AAzBD,oFAAiF;AAEjF,SAAgB,uBAAuB,CAAC,WAAgB;IACpD,MAAM,iCAAiC,GAAG;QACtC,iCAAiC;KACpC,CAAC;IAEF,IAAI,WAAW,YAAY,KAAK,EAAE,CAAC;QAC/B,+FAA+F;QAC/F,IACI,WAAW,CAAC,IAAI;YAChB,iCAAiC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAC9D,CAAC;YACC,MAAM,IAAI,uDAA0B,EAAE,CAAC;QAC3C,CAAC;aAAM,CAAC;YACJ,MAAM,WAAW,CAAC;QACtB,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,6EAA6E;QAC7E,IAAI,WAAW,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,uDAA0B,EAAE,CAAC;QAC3C,CAAC;IACL,CAAC;IAED,OAAO,WAAW,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"errorHelper.js","sourceRoot":"","sources":["../../../src/helpers/errorHelper.ts"],"names":[],"mappings":";;AAEA,4BAKC;AAED,0DAuBC;AAhCD,oFAAiF;AAEjF,SAAgB,QAAQ,CAAC,OAAe,EAAE,GAAY;IAClD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,OAAO,CAAC,KAAK,CAAC,sBAAsB,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC;IACzD,IAAI,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,SAAgB,uBAAuB,CAAC,WAAgB;IACpD,MAAM,iCAAiC,GAAG;QACtC,iCAAiC;KACpC,CAAC;IAEF,IAAI,WAAW,YAAY,KAAK,EAAE,CAAC;QAC/B,+FAA+F;QAC/F,IACI,WAAW,CAAC,IAAI;YAChB,iCAAiC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAC9D,CAAC;YACC,MAAM,IAAI,uDAA0B,EAAE,CAAC;QAC3C,CAAC;aAAM,CAAC;YACJ,MAAM,WAAW,CAAC;QACtB,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,6EAA6E;QAC7E,IAAI,WAAW,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,uDAA0B,EAAE,CAAC;QAC3C,CAAC;IACL,CAAC;IAED,OAAO,WAAW,CAAC;AACvB,CAAC"}
package/dist/cjs/index.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Pool = exports.DEFAULT_DB_POOL_CONFIG = exports.getDbPool = exports.buildSort = exports.buildQueryIndex = exports.buildFilter = exports.CrudSchema = exports.CrudService = void 0;
6
+ exports.Pool = exports.closeAllClients = exports.closeAllPools = exports.DEFAULT_DB_POOL_CONFIG = exports.getDbPool = exports.buildSort = exports.buildQueryIndex = exports.buildFilter = exports.CrudSchema = exports.CrudService = void 0;
7
7
  var crud_service_1 = require("./services/crud.service");
8
8
  Object.defineProperty(exports, "CrudService", { enumerable: true, get: function () { return __importDefault(crud_service_1).default; } });
9
9
  var crudSchema_1 = require("./schemas/crudSchema");
@@ -15,6 +15,9 @@ Object.defineProperty(exports, "buildSort", { enumerable: true, get: function ()
15
15
  var dbPool_service_1 = require("./services/dbPool.service");
16
16
  Object.defineProperty(exports, "getDbPool", { enumerable: true, get: function () { return dbPool_service_1.getDbPool; } });
17
17
  Object.defineProperty(exports, "DEFAULT_DB_POOL_CONFIG", { enumerable: true, get: function () { return dbPool_service_1.DEFAULT_DB_POOL_CONFIG; } });
18
+ var connectionRegistry_1 = require("./services/connectionRegistry");
19
+ Object.defineProperty(exports, "closeAllPools", { enumerable: true, get: function () { return connectionRegistry_1.closeAllPools; } });
20
+ Object.defineProperty(exports, "closeAllClients", { enumerable: true, get: function () { return connectionRegistry_1.closeAllClients; } });
18
21
  var pg_1 = require("pg");
19
22
  Object.defineProperty(exports, "Pool", { enumerable: true, get: function () { return pg_1.Pool; } });
20
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAiE;AAAxD,4HAAA,OAAO,OAAe;AAC/B,mDAAkD;AAAzC,wGAAA,UAAU,OAAA;AAanB,qDAAgF;AAAvE,0GAAA,WAAW,OAAA;AAAE,8GAAA,eAAe,OAAA;AAAE,wGAAA,SAAS,OAAA;AAEhD,4DAA8E;AAArE,2GAAA,SAAS,OAAA;AAAE,wHAAA,sBAAsB,OAAA;AAE1C,yBAA0B;AAAjB,0FAAA,IAAI,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAiE;AAAxD,4HAAA,OAAO,OAAe;AAC/B,mDAAkD;AAAzC,wGAAA,UAAU,OAAA;AAanB,qDAAgF;AAAvE,0GAAA,WAAW,OAAA;AAAE,8GAAA,eAAe,OAAA;AAAE,wGAAA,SAAS,OAAA;AAEhD,4DAA8E;AAArE,2GAAA,SAAS,OAAA;AAAE,wHAAA,sBAAsB,OAAA;AAC1C,oEAA+E;AAAtE,mHAAA,aAAa,OAAA;AAAE,qHAAA,eAAe,OAAA;AAEvC,yBAA0B;AAAjB,0FAAA,IAAI,OAAA"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.closeAllPools = closeAllPools;
4
+ exports.closeAllClients = closeAllClients;
5
+ exports.registerPool = registerPool;
6
+ exports.registerClient = registerClient;
7
+ exports.unregisterClient = unregisterClient;
8
+ const errorHelper_1 = require("../helpers/errorHelper");
9
+ const poolRegistry = new Set();
10
+ const clientRegistry = new Set();
11
+ let shutdownHandlersRegistered = false;
12
+ function registerShutdownHandlers() {
13
+ if (shutdownHandlersRegistered)
14
+ return;
15
+ shutdownHandlersRegistered = true;
16
+ const handler = async (signal) => {
17
+ const poolCount = poolRegistry.size;
18
+ const clientCount = clientRegistry.size;
19
+ console.log(`[data-persistence] ${signal} received, closing ${poolCount} pool(s) and ${clientCount} client(s)...`);
20
+ try {
21
+ await closeAllPools();
22
+ await closeAllClients();
23
+ console.log('[data-persistence] All connections closed');
24
+ }
25
+ catch (err) {
26
+ (0, errorHelper_1.logError)('Unexpected error during shutdown', err);
27
+ }
28
+ };
29
+ process.on('SIGTERM', () => void handler('SIGTERM'));
30
+ process.on('SIGINT', () => void handler('SIGINT'));
31
+ }
32
+ async function closeAllPools() {
33
+ const pools = [...poolRegistry];
34
+ poolRegistry.clear();
35
+ const results = await Promise.allSettled(pools.map((pool) => pool.end()));
36
+ results.forEach((result, i) => {
37
+ if (result.status === 'rejected') {
38
+ (0, errorHelper_1.logError)(`Pool[${i}] failed to close`, result.reason);
39
+ }
40
+ });
41
+ }
42
+ async function closeAllClients() {
43
+ const clients = [...clientRegistry];
44
+ clientRegistry.clear();
45
+ const results = await Promise.allSettled(clients.map((client) => client.end()));
46
+ results.forEach((result, i) => {
47
+ if (result.status === 'rejected') {
48
+ (0, errorHelper_1.logError)(`Client[${i}] failed to close`, result.reason);
49
+ }
50
+ });
51
+ }
52
+ function registerPool(pool) {
53
+ if (!pool)
54
+ return;
55
+ try {
56
+ poolRegistry.add(pool);
57
+ registerShutdownHandlers();
58
+ }
59
+ catch (err) {
60
+ (0, errorHelper_1.logError)('Failed to register pool, closing pool', err);
61
+ void pool
62
+ .end()
63
+ .catch((e) => (0, errorHelper_1.logError)('pool.end failed during rollback', e));
64
+ throw err;
65
+ }
66
+ }
67
+ function registerClient(client) {
68
+ if (!client)
69
+ return;
70
+ try {
71
+ clientRegistry.add(client);
72
+ registerShutdownHandlers();
73
+ }
74
+ catch (err) {
75
+ (0, errorHelper_1.logError)('Failed to register client, closing client', err);
76
+ void client
77
+ .end()
78
+ .catch((e) => (0, errorHelper_1.logError)('client.end failed during rollback', e));
79
+ throw err;
80
+ }
81
+ }
82
+ function unregisterClient(client) {
83
+ try {
84
+ clientRegistry.delete(client);
85
+ }
86
+ catch (err) {
87
+ (0, errorHelper_1.logError)('Failed to unregister client', err);
88
+ }
89
+ }
90
+ //# sourceMappingURL=connectionRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectionRegistry.js","sourceRoot":"","sources":["../../../src/services/connectionRegistry.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const pg_1 = require("pg");
4
+ const errorHelper_1 = require("../../../helpers/errorHelper");
4
5
  const constants_1 = require("../../../utils/constants");
6
+ const connectionRegistry_1 = require("../../connectionRegistry");
5
7
  class ConnectionService {
6
8
  get connectionString() {
7
9
  const connectionString = process.env.MULTIPLATFORM_PG_CONNECTION_STRING || '';
@@ -16,16 +18,19 @@ class ConnectionService {
16
18
  application_name: (0, constants_1.getConnectionAlias)(),
17
19
  });
18
20
  await client.connect();
21
+ (0, connectionRegistry_1.registerClient)(client);
19
22
  return client;
20
23
  }
21
24
  releaseClient(client) {
22
25
  try {
23
- client.end();
26
+ (0, connectionRegistry_1.unregisterClient)(client);
24
27
  }
25
- catch (_a) {
26
- // eslint-disable-next-line no-console
27
- console.log('Error releasing client');
28
+ catch (err) {
29
+ (0, errorHelper_1.logError)('Error unregistering client', err);
28
30
  }
31
+ void client
32
+ .end()
33
+ .catch((e) => (0, errorHelper_1.logError)('client.end failed during release', e));
29
34
  }
30
35
  }
31
36
  exports.default = ConnectionService;
@@ -1 +1 @@
1
- {"version":3,"file":"connection.service.js","sourceRoot":"","sources":["../../../../../src/services/cruds/postgresql/connection.service.ts"],"names":[],"mappings":";;AAAA,2BAA4B;AAC5B,wDAA8D;AAE9D,MAAqB,iBAAiB;IAClC,IAAI,gBAAgB;QAChB,MAAM,gBAAgB,GAClB,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACX,4EAA4E,CAC/E,CAAC;QACN,CAAC;QACD,OAAO,gBAAgB,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,SAAS;QACX,MAAM,MAAM,GAAW,IAAI,WAAM,CAAC;YAC9B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,gBAAgB,EAAE,IAAA,8BAAkB,GAAE;SACzC,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,aAAa,CAAC,MAAc;QACxB,IAAI,CAAC;YACD,MAAM,CAAC,GAAG,EAAE,CAAC;QACjB,CAAC;QAAC,WAAM,CAAC;YACL,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;CACJ;AA7BD,oCA6BC"}
1
+ {"version":3,"file":"connection.service.js","sourceRoot":"","sources":["../../../../../src/services/cruds/postgresql/connection.service.ts"],"names":[],"mappings":";;AAAA,2BAA4B;AAC5B,8DAAwD;AACxD,wDAA8D;AAC9D,iEAA4E;AAE5E,MAAqB,iBAAiB;IAClC,IAAI,gBAAgB;QAChB,MAAM,gBAAgB,GAClB,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACX,4EAA4E,CAC/E,CAAC;QACN,CAAC;QACD,OAAO,gBAAgB,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,SAAS;QACX,MAAM,MAAM,GAAW,IAAI,WAAM,CAAC;YAC9B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,gBAAgB,EAAE,IAAA,8BAAkB,GAAE;SACzC,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,IAAA,mCAAc,EAAC,MAAM,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,aAAa,CAAC,MAAc;QACxB,IAAI,CAAC;YACD,IAAA,qCAAgB,EAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAA,sBAAQ,EAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,MAAM;aACN,GAAG,EAAE;aACL,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,sBAAQ,EAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;CACJ;AAhCD,oCAgCC"}
@@ -4,6 +4,7 @@ exports.DEFAULT_DB_POOL_CONFIG = void 0;
4
4
  exports.getDbPool = getDbPool;
5
5
  const pg_1 = require("pg");
6
6
  const constants_1 = require("../utils/constants");
7
+ const connectionRegistry_1 = require("./connectionRegistry");
7
8
  exports.DEFAULT_DB_POOL_CONFIG = {
8
9
  max: 20,
9
10
  connectionTimeoutMillis: 10 * 1000,
@@ -14,6 +15,7 @@ function getDbPool(poolConfig) {
14
15
  if (!(0, constants_1.isMultiPlatformMode)())
15
16
  return undefined;
16
17
  const pool = new pg_1.Pool(Object.assign(Object.assign(Object.assign({}, exports.DEFAULT_DB_POOL_CONFIG), { connectionString: process.env.MULTIPLATFORM_PG_CONNECTION_STRING, application_name: (0, constants_1.getConnectionAlias)() }), poolConfig /** Custom implementer config */));
18
+ (0, connectionRegistry_1.registerPool)(pool);
17
19
  pool.on('error', (error) => {
18
20
  /** Prevent idle-client connection drops from becoming uncaught exceptions. */
19
21
  console.error('[data-persistence] Unexpected PG pool error on idle client', error);
@@ -1 +1 @@
1
- {"version":3,"file":"dbPool.service.js","sourceRoot":"","sources":["../../../src/services/dbPool.service.ts"],"names":[],"mappings":";;;AAUA,8BAmBC;AA7BD,2BAAsC;AACtC,kDAA6E;AAEhE,QAAA,sBAAsB,GAAe;IAC9C,GAAG,EAAE,EAAE;IACP,uBAAuB,EAAE,EAAE,GAAG,IAAI;IAClC,iBAAiB,EAAE,EAAE,GAAG,IAAI,CAAC,wCAAwC;IACrE,SAAS,EAAE,IAAI;CAClB,CAAC;AAEF,SAAgB,SAAS,CAAC,UAAuB;IAC7C,IAAI,CAAC,IAAA,+BAAmB,GAAE;QAAE,OAAO,SAAS,CAAC;IAE7C,MAAM,IAAI,GAAG,IAAI,SAAI,+CACd,8BAAsB,KACzB,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAChE,gBAAgB,EAAE,IAAA,8BAAkB,GAAE,KACnC,UAAU,CAAC,gCAAgC,EAChD,CAAC;IAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;QAC9B,8EAA8E;QAC9E,OAAO,CAAC,KAAK,CACT,4DAA4D,EAC5D,KAAK,CACR,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"dbPool.service.js","sourceRoot":"","sources":["../../../src/services/dbPool.service.ts"],"names":[],"mappings":";;;AAWA,8BAqBC;AAhCD,2BAAsC;AACtC,kDAA6E;AAC7E,6DAAoD;AAEvC,QAAA,sBAAsB,GAAe;IAC9C,GAAG,EAAE,EAAE;IACP,uBAAuB,EAAE,EAAE,GAAG,IAAI;IAClC,iBAAiB,EAAE,EAAE,GAAG,IAAI,CAAC,wCAAwC;IACrE,SAAS,EAAE,IAAI;CAClB,CAAC;AAEF,SAAgB,SAAS,CAAC,UAAuB;IAC7C,IAAI,CAAC,IAAA,+BAAmB,GAAE;QAAE,OAAO,SAAS,CAAC;IAE7C,MAAM,IAAI,GAAG,IAAI,SAAI,+CACd,8BAAsB,KACzB,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAChE,gBAAgB,EAAE,IAAA,8BAAkB,GAAE,KACnC,UAAU,CAAC,gCAAgC,EAChD,CAAC;IAEH,IAAA,iCAAY,EAAC,IAAI,CAAC,CAAC;IAEnB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;QAC9B,8EAA8E;QAC9E,OAAO,CAAC,KAAK,CACT,4DAA4D,EAC5D,KAAK,CACR,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -183,4 +183,7 @@ declare function buildSort(column: string, direction?: string): ISorting;
183
183
  declare const DEFAULT_DB_POOL_CONFIG: PoolConfig;
184
184
  declare function getDbPool(poolConfig?: PoolConfig): Pool | undefined;
185
185
 
186
- export { type AggregateFunction, CrudSchema, CrudService, DEFAULT_DB_POOL_CONFIG, type FilterInput, type ICompositeFilter, type ICrudService, type IFilter, type IFindOptions, type IFindPagination, type IFindResult, type ISorting, type SortDirection, buildFilter, buildQueryIndex, buildSort, getDbPool };
186
+ declare function closeAllPools(): Promise<void>;
187
+ declare function closeAllClients(): Promise<void>;
188
+
189
+ export { type AggregateFunction, CrudSchema, CrudService, DEFAULT_DB_POOL_CONFIG, type FilterInput, type ICompositeFilter, type ICrudService, type IFilter, type IFindOptions, type IFindPagination, type IFindResult, type ISorting, type SortDirection, buildFilter, buildQueryIndex, buildSort, closeAllClients, closeAllPools, getDbPool };
@@ -597,6 +597,12 @@ var NoRecordsAffectedException = class extends Error {
597
597
  };
598
598
 
599
599
  // src/helpers/errorHelper.ts
600
+ function logError(context, err) {
601
+ const message = err instanceof Error ? err.message : String(err);
602
+ const stack = err instanceof Error ? err.stack : void 0;
603
+ console.error(`[data-persistence] ${context}:`, message);
604
+ if (stack) console.error(stack);
605
+ }
600
606
  function PersistenceErrorWrapper(queryResult) {
601
607
  const dynamoNoRecordsAffectedExceptions = [
602
608
  "ConditionalCheckFailedException"
@@ -985,6 +991,84 @@ extractUpdateExpressionAttributesAndNames_fn = function(actions, actionType) {
985
991
  )}`;
986
992
  return actionUpdateExpression;
987
993
  };
994
+
995
+ // src/services/connectionRegistry.ts
996
+ var poolRegistry = /* @__PURE__ */ new Set();
997
+ var clientRegistry = /* @__PURE__ */ new Set();
998
+ var shutdownHandlersRegistered = false;
999
+ function registerShutdownHandlers() {
1000
+ if (shutdownHandlersRegistered) return;
1001
+ shutdownHandlersRegistered = true;
1002
+ const handler = async (signal) => {
1003
+ const poolCount = poolRegistry.size;
1004
+ const clientCount = clientRegistry.size;
1005
+ console.log(
1006
+ `[data-persistence] ${signal} received, closing ${poolCount} pool(s) and ${clientCount} client(s)...`
1007
+ );
1008
+ try {
1009
+ await closeAllPools();
1010
+ await closeAllClients();
1011
+ console.log("[data-persistence] All connections closed");
1012
+ } catch (err) {
1013
+ logError("Unexpected error during shutdown", err);
1014
+ }
1015
+ };
1016
+ process.on("SIGTERM", () => void handler("SIGTERM"));
1017
+ process.on("SIGINT", () => void handler("SIGINT"));
1018
+ }
1019
+ async function closeAllPools() {
1020
+ const pools = [...poolRegistry];
1021
+ poolRegistry.clear();
1022
+ const results = await Promise.allSettled(pools.map((pool) => pool.end()));
1023
+ results.forEach((result, i) => {
1024
+ if (result.status === "rejected") {
1025
+ logError(`Pool[${i}] failed to close`, result.reason);
1026
+ }
1027
+ });
1028
+ }
1029
+ async function closeAllClients() {
1030
+ const clients = [...clientRegistry];
1031
+ clientRegistry.clear();
1032
+ const results = await Promise.allSettled(
1033
+ clients.map((client) => client.end())
1034
+ );
1035
+ results.forEach((result, i) => {
1036
+ if (result.status === "rejected") {
1037
+ logError(`Client[${i}] failed to close`, result.reason);
1038
+ }
1039
+ });
1040
+ }
1041
+ function registerPool(pool) {
1042
+ if (!pool) return;
1043
+ try {
1044
+ poolRegistry.add(pool);
1045
+ registerShutdownHandlers();
1046
+ } catch (err) {
1047
+ logError("Failed to register pool, closing pool", err);
1048
+ void pool.end().catch((e) => logError("pool.end failed during rollback", e));
1049
+ throw err;
1050
+ }
1051
+ }
1052
+ function registerClient(client) {
1053
+ if (!client) return;
1054
+ try {
1055
+ clientRegistry.add(client);
1056
+ registerShutdownHandlers();
1057
+ } catch (err) {
1058
+ logError("Failed to register client, closing client", err);
1059
+ void client.end().catch((e) => logError("client.end failed during rollback", e));
1060
+ throw err;
1061
+ }
1062
+ }
1063
+ function unregisterClient(client) {
1064
+ try {
1065
+ clientRegistry.delete(client);
1066
+ } catch (err) {
1067
+ logError("Failed to unregister client", err);
1068
+ }
1069
+ }
1070
+
1071
+ // src/services/cruds/postgresql/connection.service.ts
988
1072
  var ConnectionService = class {
989
1073
  get connectionString() {
990
1074
  const connectionString = process.env.MULTIPLATFORM_PG_CONNECTION_STRING || "";
@@ -1001,14 +1085,16 @@ var ConnectionService = class {
1001
1085
  application_name: getConnectionAlias()
1002
1086
  });
1003
1087
  await client.connect();
1088
+ registerClient(client);
1004
1089
  return client;
1005
1090
  }
1006
1091
  releaseClient(client) {
1007
1092
  try {
1008
- client.end();
1009
- } catch (e) {
1010
- console.log("Error releasing client");
1093
+ unregisterClient(client);
1094
+ } catch (err) {
1095
+ logError("Error unregistering client", err);
1011
1096
  }
1097
+ void client.end().catch((e) => logError("client.end failed during release", e));
1012
1098
  }
1013
1099
  };
1014
1100
 
@@ -1998,6 +2084,7 @@ function getDbPool(poolConfig) {
1998
2084
  connectionString: process.env.MULTIPLATFORM_PG_CONNECTION_STRING,
1999
2085
  application_name: getConnectionAlias()
2000
2086
  }), poolConfig));
2087
+ registerPool(pool);
2001
2088
  pool.on("error", (error) => {
2002
2089
  console.error(
2003
2090
  "[data-persistence] Unexpected PG pool error on idle client",
@@ -2007,6 +2094,6 @@ function getDbPool(poolConfig) {
2007
2094
  return pool;
2008
2095
  }
2009
2096
 
2010
- export { CrudSchema, crud_service_default as CrudService, DEFAULT_DB_POOL_CONFIG, buildFilter, buildQueryIndex, buildSort, getDbPool };
2097
+ export { CrudSchema, crud_service_default as CrudService, DEFAULT_DB_POOL_CONFIG, buildFilter, buildQueryIndex, buildSort, closeAllClients, closeAllPools, getDbPool };
2011
2098
  //# sourceMappingURL=index.mjs.map
2012
2099
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/constants.ts","../../src/helpers/crudHelpers.ts","../../src/services/cruds/dynamodb/dynamoDbClient.service.ts","../../src/helpers/queryHelpers.ts","../../src/services/cruds/dynamodb/queryBuilderCondition.service.ts","../../src/services/cruds/dynamodb/queryBuilder.service.ts","../../src/helpers/tableHelper.ts","../../src/error/NoRecordsAffectedException.ts","../../src/helpers/errorHelper.ts","../../src/services/cruds/dynamodb/dynamoDbCrud.service.ts","../../src/services/cruds/postgresql/connection.service.ts","../../src/services/cruds/postgresql/query.service.ts","../../src/services/cruds/postgresql/postgreSqlClient.service.ts","../../src/services/cruds/postgresql/postgreSqlCrud.service.ts","../../src/services/crudFactory.service.ts","../../src/services/crud.service.ts","../../src/schemas/crudSchema.ts","../../src/types/filterLogicOperator.type.ts","../../src/types/connectionClosingMode.type.ts","../../src/services/dbPool.service.ts"],"names":["CONNECTION_CLOSING_MODES","FILTER_LOGIC_OPERATORS","_a","_b","isMultiPlatformMode"],"mappings":"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","file":"index.mjs","sourcesContent":["export const FILTER_OPERATOR_MAP: { [key: string]: string } = {\n CONTAINS: 'contains',\n NOT_CONTAINS: 'notContains',\n EQUAL: 'eq',\n STARTS_WITH: 'beginsWith',\n NOT_EQUAL: 'notEq',\n IN: 'in',\n GREATER_THAN: 'gt',\n GT: 'gt',\n GREATER_THAN_EQUAL: 'gte',\n GTE: 'gte',\n LESS_THAN: 'lt',\n LT: 'lt',\n LESS_THAN_EQUAL: 'lte',\n LTE: 'lte',\n EXIST: 'attribute_exists',\n NOT_EXIST: 'attribute_not_exists',\n BETWEEN: 'between',\n};\n\nexport const DYNAMODB_OPERATORS: { [key: string]: string } = {\n EQUAL: 'EQUAL',\n};\n\nexport enum SORT_DIRECTIONS {\n ASC = 'ASC',\n DESC = 'DESC',\n}\n\nexport enum CONNECTION_CLOSING_MODES {\n AUTO = 'AUTO',\n MANUAL = 'MANUAL',\n}\n\nexport enum FILTER_LOGIC_OPERATORS {\n AND = 'AND',\n OR = 'OR',\n}\n\nexport enum FilterOperator {\n EQUAL = 'EQUAL',\n NOT_EQUAL = 'NOT_EQUAL',\n CONTAINS = 'CONTAINS',\n GREATER_THAN = 'GREATER_THAN',\n GREATER_THAN_EQUAL = 'GREATER_THAN_EQUAL',\n LESS_THAN = 'LESS_THAN',\n LESS_THAN_EQUAL = 'LESS_THAN_EQUAL',\n IN = 'IN',\n STARTS_WITH = 'STARTS_WITH',\n NOT_CONTAINS = 'NOT_CONTAINS',\n BETWEEN = 'BETWEEN',\n EXIST = 'EXIST',\n NOT_EXIST = 'NOT_EXIST',\n}\n\nexport const POSTGRES_FILTER_OPERATOR_MAP = {\n EQUAL: '=',\n NOT_EQUAL: '<>',\n GREATER_THAN: '>',\n GT: '>',\n GTE: '>=',\n GREATER_THAN_EQUAL: '>=',\n LTE: '<=',\n LESS_THAN_EQUAL: '<=',\n LESS_THAN: '<',\n LT: '<',\n IN: 'IN',\n STARTS_WITH: 'LIKE',\n CONTAINS: 'LIKE',\n NOT_CONTAINS: 'NOT LIKE',\n BETWEEN: 'BETWEEN',\n EXIST: 'IS NOT NULL',\n NOT_EXIST: 'IS NULL',\n};\n\nexport const DEFAULT_PG_SCHEMA = 'public';\n\nexport enum AGGREGATE_FUNCTIONS {\n COUNT = 'COUNT',\n}\n\nexport const DYNAMO_DB_UPDATE_ACTIONS: { [key: string]: string } = {\n SET: 'SET',\n ADD: 'ADD',\n DELETE: 'DELETE',\n REMOVE: 'REMOVE',\n};\n\nexport function isMultiPlatformMode() {\n return process.env.PLATFORM_TYPE?.toLowerCase() === 'container';\n}\n\nexport function getConnectionAlias(): string {\n return process.env.PG_CONNECTION_ALIAS || process.env.HOSTNAME || process.env.SERVICE_NAME || 'qrvey-service';\n}\n","import { ISorting } from '../interfaces';\nimport { SortDirection } from '../types';\nimport { SORT_DIRECTIONS } from '../utils/constants';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function buildFilter(\n attribute: string,\n value: any,\n operator = 'EQUAL',\n relativePath = undefined,\n) {\n return {\n attribute,\n operator,\n value,\n relativePath,\n };\n}\n\nexport function buildQueryIndex(indexName: string, columns: string[]) {\n return {\n indexName,\n columns,\n };\n}\n\nexport function buildSort(\n column: string,\n direction: string = SORT_DIRECTIONS.ASC,\n): ISorting {\n return {\n column,\n direction: direction as SortDirection,\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DynamoDBDocumentClient,\n GetCommand,\n QueryCommand,\n PutCommand,\n UpdateCommand,\n DeleteCommand,\n GetCommandInput,\n QueryCommandInput,\n PutCommandInput,\n UpdateCommandInput,\n DeleteCommandInput,\n QueryCommandOutput,\n ScanCommandInput,\n ScanCommand,\n BatchWriteCommandInput,\n BatchWriteCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport { IFilter } from '../../../interfaces';\n\nconst AWS_REGION = process.env.AWS_DEFAULT_REGION;\n\n/**\n * Ref:\n * - https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html\n * - https://www.fernandomc.com/posts/eight-examples-of-fetching-data-from-dynamodb-with-node/\n */\nexport default class DynamoDbClientService {\n private tableName: string;\n protected dynamoDBClient: DynamoDBDocumentClient;\n\n constructor(tableName: string) {\n if (!tableName)\n throw new Error(\n 'The \"tableName\" is required to use a DynamoDbClientService.',\n );\n this.tableName = tableName;\n const client = new DynamoDBClient({ region: AWS_REGION });\n this.dynamoDBClient = DynamoDBDocumentClient.from(client, {\n marshallOptions: {\n removeUndefinedValues: true,\n },\n });\n }\n\n /**\n * Get an item by key\n * @param {Object} keyObject - Ex: { jobId: 1234 }\n * @param {GetCommandInput} options\n */\n public async getByKey(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n keyObject: Record<string, any>,\n options: Partial<GetCommandInput> = {},\n ) {\n const params: GetCommandInput = {\n TableName: this.tableName,\n Key: keyObject,\n ...options,\n };\n const result = await this.dynamoDBClient.send(new GetCommand(params));\n return result.Item;\n }\n\n /**\n * Query a table\n * @param {QueryCommandInput} options\n */\n public async query(\n options: Omit<QueryCommandInput, 'TableName'> = {},\n ): Promise<Omit<QueryCommandOutput, '$metadata'>> {\n const params: QueryCommandInput = {\n TableName: this.tableName,\n ...options,\n };\n const result: Partial<QueryCommandOutput> =\n await this.dynamoDBClient.send(new QueryCommand(params));\n\n if (result.$metadata) delete result.$metadata;\n return result;\n }\n\n /**\n * Scan a table\n * @param {ScanInput} options\n */\n public async scan(\n input: ScanCommandInput,\n ): Promise<Omit<QueryCommandOutput, '$metadata'>> {\n const params: ScanCommandInput = {\n ...input,\n TableName: this.tableName,\n };\n\n const command = new ScanCommand(params);\n const response: Partial<QueryCommandOutput> =\n await this.dynamoDBClient.send(command);\n if (response.$metadata) delete response.$metadata;\n return response;\n }\n\n /**\n * Create/Replace a item object\n * To take care:\n * - https://stackoverflow.com/questions/43667229/difference-between-dynamodb-putitem-vs-updateitem\n * @param {Object} input\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public async put(input: Record<string, any>) {\n const params: PutCommandInput = {\n TableName: this.tableName,\n Item: input,\n ReturnValues: 'NONE',\n };\n return await this.dynamoDBClient.send(new PutCommand(params));\n }\n\n /**\n * Update a item object\n * To take care:\n * - https://stackoverflow.com/questions/43667229/difference-between-dynamodb-putitem-vs-updateitem\n * @param {Object} keyObject - Ex: { jobId: 1234 }\n * @param {UpdateCommandInput} updateObject\n */\n public async update(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n keyObject: Record<string, any>,\n options: Partial<UpdateCommandInput> = {},\n ) {\n const params: UpdateCommandInput = {\n TableName: this.tableName,\n Key: keyObject,\n ReturnValues: 'NONE',\n ...options,\n };\n return await this.dynamoDBClient.send(new UpdateCommand(params));\n }\n\n /**\n * Delete/Remove an item object\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public async remove(keyObject: Record<string, any>) {\n const params: DeleteCommandInput = {\n TableName: this.tableName,\n Key: keyObject,\n ReturnValues: 'NONE',\n };\n return await this.dynamoDBClient.send(new DeleteCommand(params));\n }\n\n public batchWrittenPut(data: Record<string, any>) {\n const putRequests = data.map((item: any) => ({\n PutRequest: {\n Item: item,\n },\n }));\n const params = {\n RequestItems: {\n [this.tableName]: putRequests,\n },\n } as BatchWriteCommandInput;\n const insertCommand = new BatchWriteCommand(params);\n return this.dynamoDBClient.send(insertCommand);\n }\n\n private buildDeleteRequestKeys(filters: IFilter[]) {\n const deleteRequestKeys: any = {};\n filters.forEach((filter) => {\n deleteRequestKeys[filter.attribute] = filter.value;\n });\n return deleteRequestKeys;\n }\n\n async batchRemove(filterGroups: IFilter[][]): Promise<void> {\n if (!filterGroups?.length) return;\n\n const deleteRequests = filterGroups.map((filterGroup: IFilter[]) => ({\n DeleteRequest: {\n Key: this.buildDeleteRequestKeys(filterGroup),\n },\n }));\n\n const params = {\n RequestItems: {\n [this.tableName]: deleteRequests,\n },\n } as BatchWriteCommandInput;\n\n await this.dynamoDBClient.send(new BatchWriteCommand(params));\n }\n\n public async updateExpressions(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n keyObject: Record<string, any>,\n options: Partial<UpdateCommandInput> = {},\n ) {\n const params: UpdateCommandInput = {\n TableName: this.tableName,\n Key: keyObject,\n ...options,\n };\n\n return await this.dynamoDBClient.send(new UpdateCommand(params));\n }\n}\n","import { AggregateFunction } from '../types';\n\nexport enum METHOD_TO_QUERY {\n where = 'where',\n filter = 'filter',\n update = 'update',\n}\n\nexport function buildAggFunctionAlias(\n aggregateFunction: AggregateFunction,\n): string {\n return `AGG_FN_${aggregateFunction}`;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { QueryCommandInput } from '@aws-sdk/client-dynamodb';\nimport { UpdateCommandInput } from '@aws-sdk/lib-dynamodb';\nimport { IQueryBuilder } from '../../../interfaces/queryBuilder.interface';\nimport { METHOD_TO_QUERY } from '../../../helpers/queryHelpers';\nimport { IQueryBuilderCondition } from '../../../interfaces/queryBuilderCondition.interface';\n\nexport default class QueryBuilderConditionService\n implements IQueryBuilderCondition\n{\n private query;\n private command: Pick<\n QueryCommandInput,\n | 'FilterExpression'\n | 'KeyConditionExpression'\n | 'ExpressionAttributeNames'\n | 'ExpressionAttributeValues'\n > &\n Pick<UpdateCommandInput, 'UpdateExpression'>;\n private queryFrom: METHOD_TO_QUERY | undefined;\n private tempKey: string = '';\n private tempLogicOperator: string | null = null;\n private config: any;\n private wheres: string[] = [];\n private filters: string[] = [];\n private updates: string[] = [];\n private attributeNames: Record<string, string> = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private attributeValues: Record<string, any> = {};\n\n constructor(query: IQueryBuilder) {\n this.query = query;\n this.command = {};\n }\n\n public get() {\n this.build();\n return this.command;\n }\n\n public setKey(key: string) {\n this.tempKey = key;\n return this;\n }\n setTmpLogicOp(logicOp: string) {\n this.tempLogicOperator = logicOp;\n return this;\n }\n\n setConfig(config: any) {\n this.config = config;\n return this;\n }\n\n public from(methodName: METHOD_TO_QUERY) {\n this.queryFrom = methodName;\n return this;\n }\n\n eq(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} = ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n notEq(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} <> ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n contains(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `contains(${key}, ${value})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n notContains(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `NOT contains(${key}, ${value})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n in(keyValue: any) {\n const keyValues = Array.isArray(keyValue) ? keyValue : [keyValue];\n const { key, value } = this.generateKeyValue(keyValues);\n let expression: any = `${key} IN (${value})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n beginsWith(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `begins_with(${key}, ${value})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n project(keyValue: string): string {\n const key = `#${keyValue}`;\n this.attributeNames[key] = keyValue;\n return key;\n }\n\n gt(keyValue: any) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} > ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n gte(keyValue: any) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} >= ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n lte(keyValue: any) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} <= ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n lt(keyValue: any) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} < ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n attribute_exists(keyValue: string) {\n const { key } = this.generateKeyValue(keyValue, null, true);\n let expression: any = `attribute_exists(${key})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n attribute_not_exists(keyValue: string) {\n const { key } = this.generateKeyValue(keyValue, null, true);\n let expression: any = `attribute_not_exists(${key})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n between(keyValues: any) {\n const isValidValues =\n Array.isArray(keyValues) && keyValues?.length === 2;\n if (!isValidValues)\n throw new Error(\n 'The value for between filter operator should be an Array with 2 values.',\n );\n\n const { key, value } = this.generateKeyValue(keyValues, ' AND');\n let expression: any = `${key} between ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n private setExpression(expression: string): void {\n switch (this.queryFrom) {\n case METHOD_TO_QUERY.filter:\n this.filters.push(expression);\n break;\n case METHOD_TO_QUERY.update:\n this.updates.push(expression);\n break;\n default:\n this.wheres.push(expression);\n break;\n }\n }\n\n private generateKeyValue(\n value: string[] | string,\n separatorCharacter: string | null = ',',\n omitAttributeValues: boolean = false,\n ): {\n key: string;\n value: string;\n } {\n const keyExpression = `#${this.tempKey}1`;\n\n this.attributeNames[keyExpression] = this.tempKey;\n\n if (Array.isArray(value)) {\n const valueExpressions = value.map((val, index) => {\n let valueExpression = `:${this.tempKey}${index + 1}1`;\n for (const [i] of Object.entries(this.attributeValues)) {\n if (i === valueExpression) valueExpression += '1';\n }\n this.attributeValues[valueExpression] = val;\n return valueExpression;\n });\n return {\n key: keyExpression,\n value: valueExpressions.join(`${separatorCharacter} `),\n };\n } else {\n let valueExpression = `:${this.tempKey}1`;\n if (valueExpression in this.attributeValues) {\n for (const [index] of Object.entries(this.attributeValues)) {\n if (index === valueExpression) valueExpression += '1';\n }\n }\n if (!omitAttributeValues)\n this.attributeValues[valueExpression] = value;\n return { key: keyExpression, value: valueExpression };\n }\n }\n\n private build(): void {\n if (this.wheres.length > 0) {\n const keyConditionExpression = this.wheres.join(' AND ');\n this.command['KeyConditionExpression'] = keyConditionExpression;\n }\n if (this.filters.length > 0) {\n let filterExpression = '';\n\n this.filters?.forEach((filter: any, index) => {\n if (filter?.logicOperator) {\n if (filter?.config?.openExpression) {\n filterExpression = filterExpression.replace(/\\s+(AND|OR)\\s*$/, ` ${filter.config.parentKey} (`);\n if (filterExpression === '') filterExpression += '('\n filterExpression += `${filter.expression} ${filter.logicOperator} `;\n } else if (filter?.config?.closeExpression) {\n filterExpression += `${filter.expression}) ${filter.config.parentKey} `; \n } else {\n filterExpression += `${filter.expression} ${filter.logicOperator} `;\n }\n }\n });\n filterExpression = filterExpression.replace(/\\s+(AND|OR)\\s*$/, '');\n this.command['FilterExpression'] = filterExpression;\n }\n if (this.updates.length > 0) {\n const filterExpression = this.updates.join(', ');\n this.command['UpdateExpression'] = `SET ${filterExpression}`;\n }\n if (Object.values(this.attributeNames).length > 0)\n this.command['ExpressionAttributeNames'] = this.attributeNames;\n\n if (Object.values(this.attributeValues).length > 0)\n this.command['ExpressionAttributeValues'] = this.attributeValues;\n }\n}\n","import { QueryCommandInput, ScanCommandInput } from '@aws-sdk/client-dynamodb';\nimport { IQueryBuilderCondition } from '../../../interfaces/queryBuilderCondition.interface';\nimport QueryBuilderConditionService from './queryBuilderCondition.service';\nimport { METHOD_TO_QUERY } from '../../../helpers/queryHelpers';\nimport { IQueryBuilder } from '../../../interfaces/queryBuilder.interface';\nimport { AGGREGATE_FUNCTIONS } from '../../../utils/constants';\n\nexport default class QueryBuilderService implements IQueryBuilder {\n private command: Omit<QueryCommandInput & ScanCommandInput, 'TableName'>;\n private condition: IQueryBuilderCondition;\n\n constructor(private useScan = false) {\n this.command = {};\n\n this.condition = new QueryBuilderConditionService(this);\n }\n\n get() {\n const condition = this.condition.get();\n return { ...this.command, ...condition };\n }\n\n limit(num: number): IQueryBuilder {\n this.command.Limit = num;\n return this;\n }\n\n usingIndex(indexName: string): IQueryBuilder {\n this.command.IndexName = indexName;\n return this;\n }\n\n ascending(): IQueryBuilder {\n if (!this.useScan) this.command.ScanIndexForward = true;\n return this;\n }\n\n descending(): IQueryBuilder {\n if (!this.useScan) this.command.ScanIndexForward = false;\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n startKey(lastEvaluatedKey: Record<string, any>): IQueryBuilder {\n this.command.ExclusiveStartKey = lastEvaluatedKey;\n return this;\n }\n\n projection(fields: string[] = []) {\n if (!fields.length) return this;\n\n const expression: string[] = [];\n fields.forEach((field) => {\n const key = this.condition.project(field);\n expression.push(key);\n });\n this.command.ProjectionExpression = expression.join(',');\n return this;\n }\n\n where(keyName: string): IQueryBuilderCondition {\n this.condition\n .setKey(keyName)\n .setTmpLogicOp(null)\n .from(METHOD_TO_QUERY.where);\n return this.condition;\n }\n\n filter(\n keyName: string,\n logicOperator: string = 'AND',\n config?: any\n ): IQueryBuilderCondition {\n this.condition\n .setKey(keyName)\n .setTmpLogicOp(logicOperator)\n .setConfig(config)\n .from(METHOD_TO_QUERY.filter);\n return this.condition;\n }\n\n update(attribute: Record<string, string>): IQueryBuilder {\n for (const [key, value] of Object.entries(attribute)) {\n this.condition.setKey(key).from(METHOD_TO_QUERY.update);\n this.condition.eq(value);\n }\n return this;\n }\n\n consistentRead(consistentRead: boolean): IQueryBuilder {\n this.command.ConsistentRead = consistentRead;\n return this;\n }\n\n count(): IQueryBuilder {\n this.command.Select = AGGREGATE_FUNCTIONS.COUNT;\n return this;\n }\n}\n","import { ITableColumns, ITableName } from '../interfaces';\n\nexport function getTableColumnNames(columns: ITableColumns): string[] {\n return Object.keys(columns);\n}\n\nexport function findIdColumnName(columns: ITableColumns): string | undefined {\n return getTableColumnNames(columns).find(\n (columnName) => columns[columnName].columnId === true,\n );\n}\n\nexport function getTableName(\n table: string | ITableName,\n property = 'name',\n): string {\n if (!table) throw new Error('missing table property');\n\n if (typeof table === 'string') return table;\n\n const { name, alias } = table;\n return property === 'alias' && alias ? alias : name;\n}\n\nexport function getPrimaryKeyColumns(columns: ITableColumns): string[] {\n return getTableColumnNames(columns).filter(\n (columnName) => columns[columnName].primary === true,\n );\n}\n","export class NoRecordsAffectedException extends Error {\n constructor() {\n super('No records affected by update');\n this.name = 'NoRecordsAffectedException';\n }\n}\n","import { NoRecordsAffectedException } from '../error/NoRecordsAffectedException';\n\nexport function PersistenceErrorWrapper(queryResult: any) {\n const dynamoNoRecordsAffectedExceptions = [\n 'ConditionalCheckFailedException',\n ];\n\n if (queryResult instanceof Error) {\n //Checks for dynamodb errors also the ones that is included in NoRecordsAffectedExceptions list\n if (\n queryResult.name &&\n dynamoNoRecordsAffectedExceptions.includes(queryResult.name)\n ) {\n throw new NoRecordsAffectedException();\n } else {\n throw queryResult;\n }\n } else {\n //This is for Postgres scenario, where there is not error launched by updates\n if (queryResult.rowCount === 0) {\n throw new NoRecordsAffectedException();\n }\n }\n\n return queryResult;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport DynamoDbClientService from './dynamoDbClient.service';\nimport QueryBuilderService from './queryBuilder.service';\n\nimport {\n AGGREGATE_FUNCTIONS,\n DYNAMODB_OPERATORS,\n FILTER_OPERATOR_MAP,\n DYNAMO_DB_UPDATE_ACTIONS,\n} from '../../../utils/constants';\nimport {\n ICompositeFilter,\n ICreateMultipleResponse,\n ICrudService,\n IFilter,\n IFindOptions,\n IFindPagination,\n IRemoveOptions,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n IUpdateOptions,\n} from '../../../interfaces';\nimport { CrudSchema } from '../../../schemas/crudSchema';\nimport {\n findIdColumnName,\n getPrimaryKeyColumns,\n getTableName,\n} from '../../../helpers/tableHelper';\nimport { PersistenceErrorWrapper } from '../../../helpers/errorHelper';\nimport {\n QueryCommandInput,\n QueryCommandOutput,\n ScanCommandInput,\n} from '@aws-sdk/lib-dynamodb';\n\nexport class DynamoDbCrudService<T> implements ICrudService<T> {\n private dynamoDbClientService: DynamoDbClientService;\n\n constructor(private tableSchema: typeof CrudSchema) {\n this.dynamoDbClientService = new DynamoDbClientService(this.tableName);\n }\n\n private get tableName(): string {\n return getTableName(this.tableSchema.table);\n }\n\n private get idColumnName(): string | undefined {\n return findIdColumnName(this.tableSchema.columns);\n }\n\n private get defaultPrimaryKeys(): string[] {\n return getPrimaryKeyColumns(this.tableSchema.columns);\n }\n\n async create(data: T | T[]): Promise<T | ICreateMultipleResponse> {\n if (Array.isArray(data)) {\n const response =\n await this.dynamoDbClientService.batchWrittenPut(data);\n return {\n unprocessedItems: response.UnprocessedItems ?? [],\n };\n } else {\n await this.dynamoDbClientService.put(data as Record<string, any>);\n return data as T;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars\n runQuery(queryCommand: any): Promise<any> {\n throw new Error('Method not implemented.');\n }\n\n find(options: IFindOptions = {}): Promise<any> {\n const query = new QueryBuilderService(options.useScan);\n\n if (options.index?.indexName)\n query.usingIndex(options.index?.indexName);\n\n this.applySorting(query, options.sorting, options.index?.indexName);\n this.applyPagination(query, options.pagination);\n\n if (options.consistentRead)\n query.consistentRead(options.consistentRead);\n\n if (options.fields) query.projection(options.fields);\n\n this.applyFilters(query, options);\n\n if (options.aggregateFunction === AGGREGATE_FUNCTIONS.COUNT)\n query.count();\n\n return this.fetchResults(\n query.get(),\n options.pagination?.limit,\n options.useScan,\n ).then((res: any) => {\n const pagination: IFindPagination = {};\n if (res.lastEvaluatedKey) pagination.from = res.lastEvaluatedKey;\n if (options.pagination?.limit)\n pagination.limit = options.pagination?.limit;\n return {\n items: res.items,\n pagination,\n count: res.count,\n };\n });\n }\n\n async fetchResults(\n command: ScanCommandInput | QueryCommandInput,\n limit: number = 100,\n useScan: boolean = false,\n ): Promise<unknown> {\n let results: unknown[] = [];\n let lastEvaluatedKey: Record<string, unknown> = {};\n let rowsCount = 0;\n\n do {\n const result = await this.fetchBatch(\n command,\n useScan,\n lastEvaluatedKey,\n );\n const rows = result.Items ?? [];\n results = results.concat(rows);\n lastEvaluatedKey = result.LastEvaluatedKey ?? {};\n rowsCount += result.Count || rows.length;\n } while (rowsCount < limit && this.isNotEmptyObject(lastEvaluatedKey));\n\n const encryptedLastEvaluatedKey = this.isNotEmptyObject(\n lastEvaluatedKey,\n )\n ? this.encryptPaginationKey(lastEvaluatedKey)\n : null;\n return {\n items: results,\n lastEvaluatedKey: encryptedLastEvaluatedKey,\n count: rowsCount,\n };\n }\n\n async fetchBatch(\n command: ScanCommandInput | QueryCommandInput,\n useScan: boolean,\n lastEvaluatedKey: Record<string, unknown>,\n ): Promise<Partial<QueryCommandOutput>> {\n if (this.isNotEmptyObject(lastEvaluatedKey))\n command.ExclusiveStartKey = lastEvaluatedKey;\n\n const result = await (useScan\n ? this.dynamoDbClientService.scan(command)\n : this.dynamoDbClientService.query(command));\n\n if (command.Select !== AGGREGATE_FUNCTIONS.COUNT) {\n command.Limit = (command.Limit ?? 0) - (result.Items?.length ?? 0);\n }\n\n return result;\n }\n\n applyPagination(\n query: QueryBuilderService,\n pagination: IFindPagination | undefined,\n ) {\n if (pagination?.limit) query.limit(pagination.limit);\n if (pagination?.from)\n query.startKey(this.decryptPaginationKey(pagination.from));\n }\n\n async findAll(\n options: IFindOptions = {},\n allResults: any[] = [],\n rowsCount: number = 0,\n ): Promise<any> {\n const { items, pagination, count } = await this.find(options);\n allResults.push(...items);\n rowsCount += count;\n\n if (pagination?.from)\n await this.findAll({ ...options, pagination }, allResults);\n\n return {\n items: allResults,\n pagination: null,\n count: rowsCount,\n };\n }\n\n async findCount(options: IFindOptions = {}): Promise<number> {\n const findOptions = {\n ...options,\n aggregateFunction: AGGREGATE_FUNCTIONS.COUNT,\n };\n if (options.pagination?.from) {\n return this.find(findOptions).then((res) => res.count);\n } else {\n return this.findAll(findOptions).then((res) => res.count);\n }\n }\n\n buildFindItemQuery(options: IFindOptions): QueryBuilderService {\n const query = new QueryBuilderService();\n\n if (options.index?.indexName) query.usingIndex(options.index.indexName);\n\n this.applyFilters(query, options);\n query.projection(options.fields);\n query.limit(1);\n\n return query;\n }\n\n findItem(options: IFindOptions): Promise<T | null> {\n const query = this.buildFindItemQuery(options);\n return this.dynamoDbClientService.query(query.get()).then((result) => {\n if (result.Items?.length) return result.Items[0] as T;\n if (options.throwErrorIfNull) throw new Error('NOT_FOUND');\n return null;\n });\n }\n\n applyWhereFilter(query: QueryBuilderService, filter: IFilter) {\n const operator =\n FILTER_OPERATOR_MAP[\n filter.operator?.toUpperCase() ?? DYNAMODB_OPERATORS.EQUAL\n ];\n (query.where(filter.attribute) as any)[operator](filter.value);\n }\n\n applyFilterFilter(\n query: QueryBuilderService,\n filter: IFilter,\n logicOperator: string = 'AND',\n config?: any,\n ) {\n const operator =\n FILTER_OPERATOR_MAP[\n filter.operator?.toUpperCase() ?? DYNAMODB_OPERATORS.EQUAL\n ];\n (query.filter(filter.attribute, logicOperator, config) as any)[\n operator\n ](filter.value);\n }\n\n applyFilters(query: QueryBuilderService, options: IFindOptions) {\n if (Array.isArray(options.filters)) {\n this.applySimpleFilters(query, options);\n } else {\n this.applyCompoundFilters(query, options);\n }\n }\n\n applySimpleFilters(query: QueryBuilderService, options: IFindOptions) {\n const queryIndexColumns = options.index?.columns ?? [];\n const defaultWhereProperties = this.defaultPrimaryKeys;\n\n const whereProperties: string[] = queryIndexColumns?.length\n ? queryIndexColumns\n : defaultWhereProperties;\n const filters = options.filters as IFilter[];\n filters.forEach((filter: IFilter) => {\n const isWhereProperty = whereProperties.includes(filter.attribute);\n isWhereProperty && !options.useScan\n ? this.applyWhereFilter(query, filter)\n : this.applyFilterFilter(query, filter);\n });\n }\n\n applyCompoundFilters(query: QueryBuilderService, options: IFindOptions) {\n if (!options.filters) return;\n this.buildFilterExpression(query, options);\n }\n\n buildFilterExpression(\n query: QueryBuilderService,\n options: IFindOptions,\n parentKey?: string,\n ) {\n const compositeFilters = options.filters as ICompositeFilter;\n const queryIndexColumns = options.index?.columns || [];\n const defaultWhereProperties = this.defaultPrimaryKeys;\n\n const whereProperties = queryIndexColumns?.length\n ? queryIndexColumns\n : defaultWhereProperties;\n\n for (const [key, value] of Object.entries(compositeFilters)) {\n value.forEach(\n (filter: IFilter | ICompositeFilter, index: number) => {\n const isCompositeFilter = 'OR' in filter || 'AND' in filter;\n if (isCompositeFilter) {\n const newOptions = {\n ...options,\n filters: filter,\n };\n this.buildFilterExpression(query, newOptions, key);\n } else {\n const simpleFilter = filter as IFilter;\n const isWhereProperty = whereProperties.includes(\n simpleFilter.attribute,\n );\n let config;\n if (parentKey) {\n config = {\n parentKey,\n openExpression: index === 0,\n closeExpression: index === value.length - 1,\n };\n }\n\n isWhereProperty && !options.useScan\n ? this.applyWhereFilter(query, simpleFilter)\n : this.applyFilterFilter(\n query,\n simpleFilter,\n key,\n config,\n );\n }\n },\n );\n }\n }\n\n applySorting(query: QueryBuilderService, sorting: any, sortIndex?: string) {\n if (sorting?.length) {\n if (sortIndex) query.usingIndex(sortIndex);\n if (sorting[0].direction === 'DESC') {\n query.descending();\n } else {\n query.ascending();\n }\n }\n }\n\n isNotEmptyObject(obj: unknown) {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n Object.keys(obj).length > 0\n );\n }\n\n encryptPaginationKey(key: Record<string, any>): string {\n const jsonKey = JSON.stringify(key);\n return Buffer.from(jsonKey).toString('base64');\n }\n\n decryptPaginationKey(encodedKey: string): Record<string, any> {\n const decodedKey = Buffer.from(encodedKey, 'base64').toString('utf-8');\n return JSON.parse(decodedKey);\n }\n\n async update(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<T>,\n options?: IUpdateOptions,\n ): Promise<any> {\n const savedRecord = options?.skipFindItems\n ? {}\n : await this.findItem({\n filters: filters as IFilter[],\n });\n\n const newData: any = {\n ...savedRecord,\n ...data,\n };\n\n await this.dynamoDbClientService.put(newData);\n\n if (options?.returnRowsAffected) {\n return 1;\n }\n\n return newData;\n }\n\n async upsert(\n keyColumnNames: string[],\n data: T\n ): Promise<T | null> {\n const filters = [] as IFilter[];\n\n keyColumnNames.map(key => {\n filters.push({ attribute: key, value: (data as any)[key], operator: 'EQUAL' });\n });\n\n const savedRecord = await this.findItem({\n filters: filters as IFilter[],\n });\n\n const newData: any = {\n ...savedRecord,\n ...data,\n };\n\n await this.dynamoDbClientService.put(newData);\n return newData;\n }\n\n async remove(\n filters: IFilter[] | ICompositeFilter | IFilter[][],\n options: IRemoveOptions,\n ) {\n if (options?.filterGroups) {\n await this.dynamoDbClientService.batchRemove(\n filters as IFilter[][],\n );\n } else {\n const key = (filters as IFilter[]).reduce((obj: any, item: any) => {\n const property = item.attribute;\n obj[property] = item.value;\n return obj;\n }, {});\n await this.dynamoDbClientService.remove(key);\n }\n }\n\n async updateExpressions(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: IUpdateExpressionsOptions,\n ): Promise<any> {\n try {\n return await this.#prepareAndExecuteUpdateExpression(\n filters,\n actions,\n options,\n );\n } catch (error: any) {\n PersistenceErrorWrapper(error);\n }\n }\n\n async #prepareAndExecuteUpdateExpression(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: IUpdateExpressionsOptions,\n ) {\n const queryObject = this.#buildUpdateExpressionQuery({ filters }).get();\n const primaryKeys = this.defaultPrimaryKeys;\n\n const keyObject: any = this.#getKeyObjectForUpdateExpression(\n queryObject,\n primaryKeys,\n );\n\n const updateExpressions: any = [];\n\n Object.keys(actions).forEach((action: string) => {\n const actionUpdateExpression =\n this.#extractUpdateExpressionAttributesAndNames(\n actions,\n action,\n );\n updateExpressions.push(actionUpdateExpression);\n });\n\n const dbParams = {\n UpdateExpression: updateExpressions.join(' '),\n ...this.#getUpdateExpressionOptions(options),\n };\n\n const { ExpressionAttributeValues, ExpressionAttributeNames } =\n queryObject;\n if (Object.keys(ExpressionAttributeValues).length > 0) {\n dbParams['ExpressionAttributeValues'] = {\n ...ExpressionAttributeValues,\n ...dbParams.ExpressionAttributeValues,\n };\n }\n\n if (Object.keys(ExpressionAttributeNames).length > 0) {\n dbParams['ExpressionAttributeNames'] = {\n ...ExpressionAttributeNames,\n ...dbParams.ExpressionAttributeNames,\n };\n }\n if (queryObject.FilterExpression)\n dbParams['ConditionExpression'] = queryObject.FilterExpression;\n\n return this.dynamoDbClientService.updateExpressions(\n keyObject,\n dbParams,\n );\n }\n\n #buildUpdateExpressionQuery(options: IFindOptions): QueryBuilderService {\n const query = new QueryBuilderService();\n\n if (options.index?.indexName) query.usingIndex(options.index.indexName);\n this.applyFilters(query, options);\n\n return query;\n }\n\n #getKeyObjectForUpdateExpression(queryObject: any, primaryKeys: any) {\n const keyObject: any = {};\n\n Object.keys(queryObject.ExpressionAttributeNames).forEach(\n (attribute) => {\n const sanitizedAttribute = attribute\n .replace('#', '')\n .replace('1', '');\n if (primaryKeys.includes(sanitizedAttribute)) {\n const valueName = `:${sanitizedAttribute}1`;\n keyObject[sanitizedAttribute] =\n queryObject.ExpressionAttributeValues[valueName];\n delete queryObject.ExpressionAttributeValues[valueName];\n delete queryObject.ExpressionAttributeNames[attribute];\n }\n },\n );\n\n return keyObject;\n }\n\n #getUpdateExpressionOptions(options: IUpdateExpressionsOptions) {\n const updateExprOptions: any = {\n ReturnValues: options.returnValues,\n };\n\n if (options.expressionAttributeNames)\n updateExprOptions.ExpressionAttributeNames =\n options.expressionAttributeNames;\n if (options.expressionAttributeValues)\n updateExprOptions.ExpressionAttributeValues =\n options.expressionAttributeValues;\n\n return updateExprOptions;\n }\n\n #extractUpdateExpressionAttributesAndNames(\n actions: any,\n actionType: string,\n ) {\n const actionUpdateExpressions: any = [];\n\n actions[actionType].forEach((action: any) => {\n switch (actionType) {\n case DYNAMO_DB_UPDATE_ACTIONS.DELETE:\n case DYNAMO_DB_UPDATE_ACTIONS.REMOVE:\n actionUpdateExpressions.push(`${action.path}`);\n break;\n\n case DYNAMO_DB_UPDATE_ACTIONS.ADD:\n case DYNAMO_DB_UPDATE_ACTIONS.SET:\n {\n let operator = '';\n if (actionType == DYNAMO_DB_UPDATE_ACTIONS.SET)\n operator = '=';\n actionUpdateExpressions.push(\n `${action.path} ${operator}${action.value}`,\n );\n }\n break;\n }\n });\n\n const actionUpdateExpression = `${actionType} ${actionUpdateExpressions.join(\n ', ',\n )}`;\n\n return actionUpdateExpression;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n runRawQuery(query: string, params: any[]): Promise<any> {\n throw new Error('Method not implemented.');\n }\n}\n","import { Client } from 'pg';\nimport { getConnectionAlias } from '../../../utils/constants';\n\nexport default class ConnectionService {\n get connectionString() {\n const connectionString =\n process.env.MULTIPLATFORM_PG_CONNECTION_STRING || '';\n if (!connectionString) {\n throw new Error(\n 'MULTIPLATFORM_PG_CONNECTION_STRING environment variable must be configured',\n );\n }\n return connectionString;\n }\n\n async getClient(): Promise<Client> {\n const client: Client = new Client({\n connectionString: this.connectionString,\n application_name: getConnectionAlias(),\n });\n await client.connect();\n return client;\n }\n\n releaseClient(client: Client): void {\n try {\n client.end();\n } catch {\n // eslint-disable-next-line no-console\n console.log('Error releasing client');\n }\n }\n}\n","/* eslint-disable no-console */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Client, PoolClient, QueryResult } from 'pg';\nimport ConnectionService from './connection.service';\nimport { DbPool } from '../../../types';\n\nexport default class QueryService {\n private connectionService: ConnectionService;\n\n constructor(private pool?: DbPool) {\n this.connectionService = new ConnectionService();\n }\n\n async runQuery(\n queryText: string,\n values?: any[],\n ): Promise<QueryResult<any>> {\n const client: PoolClient | Client | any = await (this.pool\n ? this.pool.connect()\n : this.connectionService.getClient());\n\n try {\n if (process.env.NODE_ENV === 'development')\n console.info('[data-persistence] Query as Text:', queryText);\n const result = await client.query(queryText, values);\n return result;\n } finally {\n if (this.pool) {\n await client.release();\n } else {\n this.connectionService.releaseClient(client as Client);\n }\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-console */\n\nimport { ident, literal, format } from '@scaleleap/pg-format';\nimport { QueryResult } from 'pg';\nimport { AggregateFunction, DbPool, FilterLogicOperator } from '../../../types';\nimport {\n ICompositeFilter,\n IFilter,\n IFindOptions,\n IFindPagination,\n ISorting,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n} from '../../../interfaces';\nimport QueryService from './query.service';\nimport {\n FILTER_LOGIC_OPERATORS,\n SORT_DIRECTIONS,\n POSTGRES_FILTER_OPERATOR_MAP,\n DEFAULT_PG_SCHEMA,\n FilterOperator,\n DYNAMO_DB_UPDATE_ACTIONS,\n} from '../../../utils/constants';\nimport { CrudSchema } from '../../../schemas';\nimport { getTableName } from '../../../helpers/tableHelper';\nimport { buildAggFunctionAlias } from '../../../helpers/queryHelpers';\nimport { IFindRawWith } from '../../../interfaces/findRawWith.interface';\n\nexport default class PostgresqlClientService<T> extends QueryService {\n private crudSchema: typeof CrudSchema;\n constructor(tableSchema: typeof CrudSchema, poolClient?: DbPool) {\n super(poolClient);\n this.crudSchema = tableSchema;\n }\n\n get dbSchema() {\n return this.crudSchema.schema || DEFAULT_PG_SCHEMA;\n }\n\n get tableName() {\n return (\n getTableName(this.crudSchema.table, 'alias') ||\n getTableName(this.crudSchema.table)\n );\n }\n\n get isTemporalTable() {\n return this.crudSchema?.isTemporalTable;\n }\n\n getWildcardValue(operator: FilterOperator, value: string): string {\n if (\n operator === FilterOperator.CONTAINS ||\n operator === FilterOperator.NOT_CONTAINS\n ) {\n return '%' + value + '%';\n } else if (operator === FilterOperator.STARTS_WITH) {\n return value + '%';\n } else {\n return value;\n }\n }\n\n private buildClause(\n operator: FilterOperator,\n attribute: string,\n relativePath: string | undefined,\n value: any,\n ): string {\n const formattedValue = literal(value);\n operator = operator\n ? (operator.toUpperCase() as FilterOperator)\n : FilterOperator.EQUAL;\n const postgresOperator = POSTGRES_FILTER_OPERATOR_MAP[operator];\n\n if (!postgresOperator)\n throw new Error(`Unsupported filter operator: ${operator}`);\n\n let property;\n const filterProperty = ident(attribute);\n const columnExists = !!this.crudSchema.columns[attribute];\n const columnType =\n columnExists && this.crudSchema.columns[attribute]?.type;\n\n if (relativePath != undefined) {\n const attributePath = relativePath.split('.').join(',');\n\n property = `(\"${attribute}\" #> '{${attributePath}}')`;\n if (value != null) {\n const comparisonValueType =\n this.getValueTypeAsPostgresDefinition(value);\n property += `::${comparisonValueType}`;\n }\n } else {\n property = columnExists\n ? filterProperty\n : `(\"qvAttributes\" ->> '${attribute}')`;\n }\n\n if (operator === FilterOperator.IN) {\n const formattedValues = Array.isArray(value)\n ? value.map(literal)\n : [formattedValue];\n return `${property} ${postgresOperator} (${formattedValues.join(\n ', ',\n )})`;\n }\n\n if (operator === FilterOperator.BETWEEN) {\n return `${property} ${postgresOperator} ${value[0]} AND ${value[1]}`;\n }\n\n /**\n * ? Additional filter to avoid error when column accepts null values.\n */\n if (operator === FilterOperator.NOT_EQUAL && value !== null) {\n return `(${property} ${postgresOperator} ${literal(\n value,\n )} OR ${property} IS NULL)`;\n }\n\n if (\n operator === FilterOperator.NOT_EXIST ||\n operator === FilterOperator.EXIST\n ) {\n return `${property} ${postgresOperator}`;\n }\n\n if (\n (operator === FilterOperator.CONTAINS ||\n operator === FilterOperator.NOT_CONTAINS) &&\n columnType === 'array'\n ) {\n const filterValue =\n typeof value === 'number' ? value : `'${value}'`;\n let filterString = `${filterValue} = ANY(${property})`;\n\n if (operator === FilterOperator.NOT_CONTAINS) {\n if (value === null) {\n filterString = `(NOT (${filterString}))`;\n } else {\n filterString = `(NOT (${filterString}) or ${property} IS NULL)`;\n }\n }\n return filterString;\n }\n\n const wildcardValue = this.getWildcardValue(operator, value);\n return `${property} ${postgresOperator} ${literal(wildcardValue)}`;\n }\n\n private buildFilterClause(\n filters: IFilter[] | ICompositeFilter,\n logicOperator?: FilterLogicOperator,\n ): string {\n if (Array.isArray(filters)) {\n const filterClauses = filters.map((filter) => {\n return this.buildClause(\n filter.operator as FilterOperator,\n filter.attribute,\n filter.relativePath,\n filter.value,\n );\n });\n return filterClauses.join(\n ` ${logicOperator ?? FILTER_LOGIC_OPERATORS.AND} `,\n );\n } else {\n return this.buildQueryByClause(filters);\n }\n }\n\n private isCompositeFilter = function (value: any) {\n return 'OR' in value || 'AND' in value;\n };\n\n buildQueryByClause(filters: IFilter[] | ICompositeFilter): string {\n let filterClauses: string = '';\n let isFirstFilter = true;\n\n for (const [key, value] of Object.entries(filters)) {\n if (!isFirstFilter) {\n filterClauses += key === 'AND' ? ' AND ' : ' OR ';\n }\n\n if (this.isCompositeFilter(value)) {\n filterClauses += '(';\n filterClauses += this.buildQueryByClause(\n value as ICompositeFilter,\n );\n filterClauses += ')';\n } else {\n (value as IFilter[]).forEach((filter: IFilter) => {\n let clause = '';\n if (this.isCompositeFilter(filter)) {\n clause = `(${this.buildQueryByClause(\n filter as ICompositeFilter,\n )})`;\n } else {\n clause = this.buildClause(\n filter.operator as FilterOperator,\n filter.attribute,\n filter.relativePath,\n filter.value,\n );\n }\n filterClauses += `${clause} ${key} `;\n });\n }\n\n isFirstFilter = false;\n }\n\n filterClauses = filterClauses.replace(/\\s+(AND|OR)\\s*$/, '');\n return filterClauses;\n }\n\n private formatOrderByItem(sort: ISorting): string {\n return `${ident(sort.column)} ${sort.direction || SORT_DIRECTIONS.ASC}`;\n }\n\n private buildOrderByClause(querySorting: ISorting[]): string {\n try {\n return querySorting.map(this.formatOrderByItem).join(', ');\n } catch (error) {\n return '';\n }\n }\n\n formatArray(array: any[]) {\n const isNumberArray = typeof array[0] === 'number';\n if (isNumberArray) {\n return `{${array.join(',')}}`;\n } else {\n return `{${array.map((val) => `\"${val}\"`).join(',')}}`;\n }\n }\n\n formatValue(value: any) {\n if (Array.isArray(value)) {\n if (!value?.length) return '{}';\n const isNumberArray = typeof value[0] === 'number';\n if (isNumberArray) {\n return `{${value.join(',')}}`;\n } else {\n return `{${value.map((val: any) => `\"${val}\"`).join(',')}}`;\n }\n }\n return value;\n }\n\n async createCommand(data: any[]): Promise<any> {\n const keys = Object.keys(data[0]); // Assuming all objects have the same keys\n const values = data.map((item) =>\n keys.map((key) => this.formatValue(item[key])),\n );\n\n const query = format(\n `INSERT INTO ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )} (%I) VALUES %L RETURNING *;`,\n keys,\n values,\n );\n\n return this.runQuery(query);\n }\n\n private isValidFiltersInput(\n filters: IFilter[] | ICompositeFilter,\n ): boolean {\n const isValidArrayFilters =\n Array.isArray(filters) && filters?.length > 0;\n const isValidCompositeFilters = this.isCompositeFilter(filters);\n return isValidArrayFilters || isValidCompositeFilters;\n }\n\n private replaceFilterTokensInQuery(\n query: string,\n filters?: IFilter[] | ICompositeFilter,\n ) {\n if (!filters) return query;\n\n if (this.isValidFiltersInput(filters)) {\n const filterClause = this.buildFilterClause(filters);\n return query.replace(/{{filters}}/g, filterClause);\n }\n }\n\n private addFiltersToQuery(\n query: string,\n filters?: IFilter[] | ICompositeFilter,\n ): string {\n if (!filters) return query;\n\n if (this.isValidFiltersInput(filters))\n query += ` WHERE ${this.buildFilterClause(filters)}`;\n return query;\n }\n\n addOrderByToQuery(query: string, orderBy?: ISorting[]): string {\n if (orderBy) query += ` ORDER BY ${this.buildOrderByClause(orderBy)}`;\n return query;\n }\n\n private addPaginationToQuery(\n query: string,\n pagination?: IFindPagination,\n ): string {\n if (pagination) {\n const { limit, from } = pagination;\n if (limit) query += ` LIMIT ${limit}`;\n if (from) query += ` OFFSET ${from}`;\n }\n return query;\n }\n\n private getSelectClause(\n aggregateFunction: AggregateFunction | undefined,\n fields: string[] = [],\n ) {\n if (aggregateFunction)\n return `CAST(${aggregateFunction}(1) AS INTEGER) AS \"${buildAggFunctionAlias(\n aggregateFunction,\n )}\"`;\n if (!fields?.length) return '*';\n\n return this.parseFields(fields).join(', ');\n }\n\n private parseFields(fields: String[]): String[] {\n const columnsFromSchema: String[] = Object.keys(\n this.crudSchema.columns,\n );\n const attributes: String[] = fields\n .filter((field) => columnsFromSchema.indexOf(field) !== -1)\n .map((field) => `\"${field}\"`);\n\n fields\n .filter((field) => columnsFromSchema.indexOf(field) === -1)\n .forEach((field) => {\n attributes.push(`\"qvAttributes\" ->> '${field}' as \"${field}\"`);\n });\n return attributes;\n }\n\n private resolveWithQueries(rawWith: IFindRawWith[]): string[] {\n const withQueries = rawWith.map(({ alias, query, filters }) => {\n const withQuery = this.replaceFilterTokensInQuery(query, filters);\n return `${alias} AS (${withQuery})`;\n });\n return withQueries;\n }\n\n getRawWithClause(rawWith?: IFindRawWith[]): string {\n let rawWithClause = '';\n if (rawWith?.length) {\n const withQueries = this.resolveWithQueries(rawWith);\n rawWithClause = 'WITH ' + withQueries.join(',\\n');\n }\n return rawWithClause;\n }\n\n getQueryFrom() {\n return this.isTemporalTable\n ? ident(this.tableName)\n : `${ident(this.dbSchema)}.${ident(this.tableName)}`;\n }\n\n async findCommand(options: IFindOptions = {}): Promise<T[]> {\n const rawWithClause = this.getRawWithClause(options.rawWith);\n let query = `SELECT ${this.getSelectClause(\n options.aggregateFunction,\n options.fields,\n )} FROM ${this.getQueryFrom()}`;\n query = this.addFiltersToQuery(query, options.filters);\n if (!options.aggregateFunction) {\n query = this.addOrderByToQuery(query, options.sorting);\n query = this.addPaginationToQuery(query, options.pagination);\n }\n if (rawWithClause) {\n query = `${rawWithClause} ${query}`;\n }\n return (await this.runQuery(query)).rows;\n }\n\n sanitizeValue(value: any): string {\n if (Array.isArray(value)) {\n if (value.length === 0) '[]';\n const formattedArray = value\n .map((item) => {\n if (typeof item === 'string') {\n return `'${item}'`;\n } else if (typeof item === 'object') {\n return JSON.stringify(item);\n } else {\n return item;\n }\n })\n .join(',');\n\n return JSON.stringify(formattedArray);\n } else {\n return literal(value);\n }\n }\n\n async updateCommand(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<any>,\n ): Promise<QueryResult<any>> {\n let query = `UPDATE ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )} SET`;\n\n const updateClauses = Object.entries(data).map(([key, value]) => {\n const dbValue = literal(this.formatValue(value));\n return `${ident(key)} = ${dbValue}`;\n });\n query += ` ${updateClauses.join(', ')}`;\n\n query += ' WHERE ';\n query += this.buildFilterClause(filters);\n\n return this.runQuery(query);\n }\n\n async upsertCommand(\n keyColumnNames: string[],\n data: T\n ): Promise<any> {\n const updateClauses = (keyColumnNames?.length &&\n Object.entries(data as any)\n .filter(([key]) => !keyColumnNames.includes(key))\n .map(([key, value]) => {\n const dbValue = literal(this.formatValue(value));\n return `${ident(key)} = ${dbValue}`;\n })) || [];\n \n if (!updateClauses?.length)\n return this.createCommand([data]);\n \n const columnNames = Object.keys(data as any); // Assuming all objects have the same keys\n const values = columnNames.map((key) => this.formatValue((data as any)[key]));\n\n let query = format(`INSERT INTO ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )} (%I) VALUES (%L) ON CONFLICT (%I) DO UPDATE SET`, columnNames, values, keyColumnNames);\n\n query += ` ${updateClauses.join(', ')} RETURNING *;`;\n\n return this.runQuery(query);\n }\n\n private buildFilterClauseForFilterGroups(\n filterGroups: IFilter[][],\n ): string {\n const filterClauses = filterGroups.map((filterGroup) => {\n return `(${this.buildFilterClause(filterGroup)})`;\n });\n return filterClauses.join(' OR ');\n }\n\n async deleteCommand(\n filters?: ICompositeFilter | IFilter[] | IFilter[][],\n useFilterGroups: boolean = false,\n ): Promise<QueryResult<any>> {\n let query = `DELETE FROM ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )}`;\n if (filters) {\n query += ' WHERE ';\n\n if (useFilterGroups) {\n query += this.buildFilterClauseForFilterGroups(\n filters as IFilter[][],\n );\n } else {\n query += this.buildFilterClause(\n filters as ICompositeFilter | IFilter[],\n );\n }\n }\n\n return this.runQuery(query);\n }\n\n query(queryText: string, values?: any[]) {\n return this.runQuery(queryText, values);\n }\n\n public async updateExpressionCommand(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: Partial<IUpdateExpressionsOptions> = {},\n ) {\n let query = `UPDATE ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )} SET`;\n\n const set = actions.SET || [];\n const add = actions.ADD || [];\n const columns = this.crudSchema.columns;\n\n const setValues = this.replacePathAndValueByAttributeNames(\n set,\n options,\n columns,\n DYNAMO_DB_UPDATE_ACTIONS.SET,\n );\n const addValues = this.replacePathAndValueByAttributeNames(\n add,\n options,\n columns,\n DYNAMO_DB_UPDATE_ACTIONS.ADD,\n );\n\n const setValuesAndAddValues: any = setValues.concat(addValues);\n\n const updateClauses: any = [];\n const jsonSetExpressionGroup: any = {};\n const queryFunctions: any = [];\n\n setValuesAndAddValues.forEach((expression: any) => {\n const { path, value, createNewColumn, actionName, dynamoFuncName } =\n expression;\n\n //Dynamo functions replacement\n if (dynamoFuncName) {\n queryFunctions.push({ path, value, dynamoFuncName });\n }\n\n if (path.includes('.') && !dynamoFuncName) {\n const jsonExpr = this.getJSONBSetExpressionByAction(\n path,\n value,\n {\n createNewColumn,\n actionName,\n },\n );\n const columnName: string = jsonExpr.columnName;\n if (!jsonSetExpressionGroup[columnName]) {\n jsonSetExpressionGroup[columnName] = [jsonExpr];\n } else {\n jsonSetExpressionGroup[columnName].push(jsonExpr);\n }\n } else if (!dynamoFuncName) {\n let expValue;\n let columnName = path;\n let setObjProperty = false;\n let column = this.crudSchema.columns[columnName];\n\n let columnType = column?.type;\n if (!columnType) {\n setObjProperty = true;\n columnName = 'qvAttributes';\n column = this.crudSchema.columns[columnName];\n if (column?.type == undefined)\n throw `Column type definition for column: (${path}) must be in the CrudSchema`;\n\n columnType = Array.isArray(value) ? 'array' :\n typeof value == 'object' ? 'object' :\n 'default';\n }\n\n switch (columnType) {\n case 'object':\n {\n const valueSerialized = `${JSON.stringify(\n value,\n ).replace(/'/g, \"''\")}`;\n expValue = `'${valueSerialized}'::jsonb`;\n }\n break;\n case 'array':\n expValue = `ARRAY[${literal(value)}]`;\n break;\n default:\n expValue = literal(value);\n break;\n }\n\n if (setObjProperty) {\n expValue = `jsonb_set(${ident(columnName)}, '{${path}}', ${expValue}, true)`;\n }\n\n updateClauses.push(`${ident(columnName)} = ${expValue}`);\n }\n });\n\n this.setCommonColumnsQueryFunctions(\n jsonSetExpressionGroup,\n queryFunctions,\n );\n\n if (Object.keys(jsonSetExpressionGroup).length > 0) {\n Object.keys(jsonSetExpressionGroup).forEach((groupIndex) => {\n const jsonSetExpression = this.buildJSONBExpression(\n jsonSetExpressionGroup[groupIndex],\n 'jsonb_set',\n );\n\n updateClauses.push(`${groupIndex} = ${jsonSetExpression}`);\n });\n }\n\n //This is for dynamo functions transformed to postgresql functions\n this.buildUpdateClausesFormDynamoFunctions(\n queryFunctions,\n updateClauses,\n );\n\n query += ` ${updateClauses.join(', ')}`;\n\n query += ' WHERE ';\n query += this.buildFilterClause(filters);\n\n return this.runQuery(query);\n }\n\n private buildUpdateClausesFormDynamoFunctions(\n queryFunctions: any,\n updateClauses: any,\n ) {\n if (queryFunctions.length > 0) {\n queryFunctions.forEach((queryFunction: any) => {\n if (typeof queryFunction.value == 'object') {\n const jsonExpr = this.buildJSONBExpression(\n queryFunction.value.jsonExpression,\n 'jsonb_insert',\n );\n updateClauses.push(\n `${ident(queryFunction.path)} = ${jsonExpr}`,\n );\n } else {\n updateClauses.push(\n `${ident(queryFunction.path)} = ${queryFunction.value}`,\n );\n }\n });\n }\n }\n\n private setCommonColumnsQueryFunctions(\n jsonSetExpressionGroup: any,\n queryFunctions: any,\n ) {\n Object.keys(jsonSetExpressionGroup).forEach((jsonSetExpr: any) => {\n queryFunctions.forEach((queryFunction: any, index: number) => {\n const columnPath = `\"${queryFunction.path}\"`;\n if (columnPath === jsonSetExpr) {\n jsonSetExpressionGroup[jsonSetExpr].push({\n ...queryFunction,\n isCommonColumn: true,\n });\n delete queryFunctions[index];\n }\n });\n });\n }\n\n /**\n * @description Builds a jsonb expression like jsonb_insert, or jsonb_set\n * @param jsonSetExpressions\n * @param functionName\n * @returns\n */\n private buildJSONBExpression(\n jsonSetExpressions: any,\n functionName: string,\n ) {\n let jsonSetStringExpr = '';\n jsonSetExpressions.forEach((expression: any, index: number) => {\n let _tempFunctionName = functionName;\n let { columnName, jsonExpr } = expression;\n //Is a common column for dynamoDBFunctions\n if (expression.isCommonColumn) {\n const jsonExpression = expression.value.jsonExpression[0];\n _tempFunctionName = jsonExpression.functionName;\n jsonExpr = jsonExpression.jsonExpr;\n columnName = jsonExpression.columnName;\n }\n if (index === 0) {\n jsonSetStringExpr = `${_tempFunctionName}(${columnName},${jsonExpr})`;\n } else {\n jsonSetStringExpr = `${_tempFunctionName}(${jsonSetStringExpr},${jsonExpr})`;\n }\n });\n return jsonSetStringExpr;\n }\n\n /**\n * @description Serializes a JSON value\n * @param value\n * @returns\n */\n private serializeJSONValue(value: any) {\n const valueSerialized =\n typeof value == 'object'\n ? `${JSON.stringify(value).replace(/'/g, \"''\")}`\n : value;\n return valueSerialized;\n }\n\n private getJSONBSetExpressionByAction(\n path: string,\n value: any,\n options: any,\n ) {\n path = path.replace(/\\[(\\d+)\\]/g, '.$1');\n const pathSplitted = path.split('.');\n const parentPath = pathSplitted[0];\n const { createNewColumn, actionName } = options;\n\n const pathSerialized = pathSplitted.slice(1).join(',');\n const valueSerialized = `'${JSON.stringify(value).replace(\n /'/g,\n \"''\",\n )}'`;\n\n if (actionName == DYNAMO_DB_UPDATE_ACTIONS.ADD) {\n if (typeof value != 'string' && !isNaN(value)) {\n const resultExpr = {\n jsonExpr: `'{${pathSerialized}}',to_jsonb(COALESCE((\"${parentPath}\"#>'{${pathSerialized}}')::numeric,0) + ${valueSerialized})`,\n columnName: `\"${parentPath}\"`,\n };\n return resultExpr;\n }\n }\n return {\n jsonExpr: `'{${pathSerialized}}',${valueSerialized},${createNewColumn}`,\n columnName: `\"${parentPath}\"`,\n };\n }\n\n private getListAppendDefFromValue(queryValue: string, columnType: string) {\n const regexListAppend = /list_append\\(([^)]+)\\)/gm;\n const listAppendString = 'list_append(';\n\n const matchList = queryValue.match(regexListAppend) || [];\n const groupResult = matchList[0];\n\n if (groupResult) {\n const attributesFromGroup = groupResult\n .slice(listAppendString.length, -1)\n .split(',');\n const attributes = {\n originalString: groupResult,\n path: attributesFromGroup[0].trim(),\n value: attributesFromGroup.slice(1).join(',').trim(),\n isDynamoFunction: true,\n functionExpr: '',\n jsonExpression: [{}],\n };\n if (columnType == 'array') {\n attributes['functionExpr'] =\n this.buildArrayAppendExpr(attributes);\n } else {\n attributes['jsonExpression'] =\n this.buildJsonbInsertExpr(attributes);\n }\n return attributes;\n }\n\n return null;\n }\n\n private buildArrayAppendExpr(params: any) {\n const arrayPath = params.path.split('.');\n const columnName = arrayPath.shift();\n return `ARRAY_APPEND(\"${columnName}\",${params.value})`;\n }\n\n private buildJsonbInsertExpr(params: any) {\n const arrayPath = params.path.split('.');\n const columnName = arrayPath.shift();\n const options = {\n isDynamoFunction: params?.isDynamoFunction,\n relativePath:\n arrayPath.length && Array.isArray(arrayPath) ? arrayPath : [],\n };\n const jsonbInsertExpressions =\n this.getExpressionsByDefinitionForJSONBInsert(\n columnName,\n params.value,\n options,\n );\n\n return jsonbInsertExpressions;\n }\n\n private getExpressionsByDefinitionForJSONBInsert(\n columnName: string,\n value: string,\n options: any,\n ) {\n const jsonbInsertExpressions = [];\n let pathToAffect = '0';\n if (options.isDynamoFunction == true) {\n options.relativePath.push('0');\n pathToAffect = options.relativePath.join(',');\n }\n try {\n const parsedValue = JSON.parse(value);\n\n if (Array.isArray(parsedValue)) {\n parsedValue.forEach((arrayValue) => {\n arrayValue =\n typeof arrayValue == 'string'\n ? `\"${arrayValue}\"`\n : arrayValue;\n jsonbInsertExpressions.push({\n jsonExpr: `'{${pathToAffect}}','${this.serializeJSONValue(\n arrayValue,\n )}'`,\n columnName: `\"${columnName}\"`,\n functionName: 'jsonb_insert',\n });\n });\n } else {\n jsonbInsertExpressions.push({\n jsonExpr: `'{${pathToAffect}}','${this.serializeJSONValue(\n parsedValue,\n )}'`,\n columnName: `\"${columnName}\"`,\n functionName: 'jsonb_insert',\n });\n }\n } catch (error) {\n jsonbInsertExpressions.push({\n jsonExpr: `'{${pathToAffect}}','${value}'`,\n columnName: `\"${columnName}\"`,\n functionName: 'jsonb_insert',\n });\n }\n return jsonbInsertExpressions;\n }\n\n private getInsertExprFromJsonbDef(queryValue: string, columnType: string) {\n const listAppendParams = this.getListAppendDefFromValue(\n queryValue,\n columnType,\n );\n if (\n listAppendParams != null &&\n listAppendParams?.jsonExpression.length === 0\n ) {\n queryValue = queryValue.replace(\n listAppendParams.originalString,\n listAppendParams.functionExpr,\n );\n } else {\n return listAppendParams;\n }\n\n return queryValue;\n }\n\n private replacePathAndValueByAttributeNames(\n actions: any[],\n options: IUpdateExpressionsOptions,\n columns: any,\n actionName: string,\n ) {\n return actions.map((action) => {\n action.path = this.replaceExpressionAttributeNames(\n action.path,\n options,\n );\n if (\n typeof action.value == 'string' &&\n action.value.includes('list_append')\n ) {\n action.path = action.path.split('.')[0];\n const column = columns[action.path];\n action.value =\n this.replaceExpressionAttributeValuesForDynamoFunctions(\n action.value,\n options,\n );\n action.value = this.getInsertExprFromJsonbDef(\n action.value,\n column.type,\n );\n action.dynamoFuncName = 'list_append';\n } else {\n action.value = this.replaceExpressionAttributeValues(\n action.value,\n options,\n );\n }\n\n action.actionName = actionName;\n action.createNewColumn = true;\n return action;\n });\n }\n\n private replaceExpressionAttributeValuesForDynamoFunctions(\n value: string,\n options: any,\n ) {\n const { expressionAttributeNames, expressionAttributeValues } = options;\n const exprAttributeNamesKeys = expressionAttributeNames\n ? Object.keys(expressionAttributeNames)\n : [];\n const exprAttributeValuesKeys = expressionAttributeValues\n ? Object.keys(expressionAttributeValues)\n : [];\n\n //Set for attribute names\n if (exprAttributeNamesKeys.length > 0) {\n exprAttributeNamesKeys.forEach((exprAttribute) => {\n value = value.replace(\n exprAttribute,\n expressionAttributeNames[exprAttribute],\n );\n });\n }\n\n //Set for attribute values\n if (exprAttributeValuesKeys.length > 0) {\n exprAttributeValuesKeys.forEach((exprAttribute) => {\n const valueSerialized = this.serializeJSONValue(\n expressionAttributeValues[exprAttribute],\n );\n value = value.replace(exprAttribute, `${valueSerialized}`);\n });\n }\n return value;\n }\n\n private replaceExpressionAttributeNames(\n path: string,\n options: IUpdateExpressionsOptions,\n ) {\n const { expressionAttributeNames } = options;\n\n if (expressionAttributeNames) {\n Object.keys(expressionAttributeNames).forEach(\n (attributeName: string) => {\n const attributeNameValue: string =\n expressionAttributeNames[attributeName];\n path = path.replace(attributeName, attributeNameValue);\n },\n );\n }\n return path;\n }\n\n private replaceExpressionAttributeValues(\n value: string,\n options: IUpdateExpressionsOptions,\n ) {\n const { expressionAttributeValues } = options;\n if (expressionAttributeValues[value] != undefined) {\n return expressionAttributeValues[value];\n }\n\n return value;\n }\n\n private getValueTypeAsPostgresDefinition(value: any) {\n switch (typeof value) {\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'string':\n default:\n return 'text';\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport PostgresqlClientService from './postgreSqlClient.service';\nimport {\n ICompositeFilter,\n ICreateMultipleResponse,\n ICrudService,\n IFilter,\n IFindOptions,\n IFindResult,\n IRemoveOptions,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n IUpdateOptions,\n} from '../../../interfaces';\nimport { CrudSchema } from '../../../schemas';\nimport { findIdColumnName } from '../../../helpers/tableHelper';\nimport { AGGREGATE_FUNCTIONS } from '../../../utils/constants';\nimport { buildAggFunctionAlias } from '../../../helpers/queryHelpers';\nimport { PersistenceErrorWrapper } from '../../../helpers/errorHelper';\nimport { DbPool } from '../../../types';\nexport class PostgreSqlCrudService<T>\n extends PostgresqlClientService<T>\n implements ICrudService<T>\n{\n constructor(\n private tableSchema: typeof CrudSchema,\n poolClient?: DbPool,\n ) {\n super(tableSchema, poolClient);\n }\n\n private get idColumnName(): string | undefined {\n return findIdColumnName(this.tableSchema.columns);\n }\n\n normalizeInputData(inputData: any) {\n inputData.qvAttributes = {};\n for (const key in inputData) {\n if (!this.tableSchema.columns[key] && key !== 'qvAttributes') {\n inputData.qvAttributes[key] = inputData[key];\n delete inputData[key];\n } else if (\n Array.isArray(inputData[key]) &&\n this.tableSchema.columns[key]?.type !== 'array'\n ) {\n inputData[key] = JSON.stringify(inputData[key]);\n }\n }\n }\n\n getItem(data: { [key: string]: any }): any {\n const schemaColumns = Object.entries(this.tableSchema.columns);\n schemaColumns.forEach(([key, value]) => {\n if (value.type === 'big_number') {\n if (data[key]) data[key] = Number(data[key]);\n }\n });\n const resultItem = { ...data, ...data.qvAttributes };\n delete resultItem['qvAttributes'];\n return resultItem;\n }\n\n prepareData(data: T): any {\n const inputData = { ...data } as { [key: string]: any };\n this.normalizeInputData(inputData);\n return inputData;\n }\n\n buildCreateResponseBatch(result: any): ICreateMultipleResponse {\n const rows = Array.isArray(result?.rows) ? result.rows : [];\n return {\n items: rows.map((r: any) => this.getItem(r)),\n unprocessedItems: [],\n };\n }\n\n create(data: T | T[]): Promise<T | ICreateMultipleResponse> {\n if (Array.isArray(data)) {\n const inputDataArray = data.map((item) => this.prepareData(item));\n return this.createCommand(inputDataArray).then((result) => {\n return this.buildCreateResponseBatch(result);\n });\n } else {\n const inputData = this.prepareData(data);\n return this.createCommand([inputData]).then((result) =>\n result.rowCount ? this.getItem(result.rows[0]) : null,\n );\n }\n }\n\n findItem(findOptions: IFindOptions): Promise<T | null> {\n return this.findCommand(findOptions).then((data) => {\n return data?.length\n ? this.getItem(data[0] as { [key: string]: any })\n : null;\n });\n }\n\n private async processQueryResult(\n findOptions: IFindOptions,\n omitPagination: boolean = false,\n ): Promise<IFindResult<T>> {\n const rows = await this.findCommand(findOptions);\n const items = rows.map((row) =>\n this.getItem(row as { [key: string]: any }),\n );\n\n const { limit, from } = findOptions?.pagination || {};\n const hasMoreRecords = items.length && items.length === limit;\n const newFrom = limit && hasMoreRecords ? limit + (from || 0) : null;\n\n const result: IFindResult<T> = {\n items,\n pagination: omitPagination ? null : { limit: limit, from: newFrom },\n count: items.length,\n };\n return result;\n }\n\n async find(findOptions: IFindOptions): Promise<IFindResult<T>> {\n return this.processQueryResult(findOptions);\n }\n\n async findAll(findOptions: IFindOptions): Promise<IFindResult<T>> {\n return this.processQueryResult(findOptions, true);\n }\n\n async findCount(findOptions: IFindOptions): Promise<number> {\n const items = await this.findCommand({\n ...findOptions,\n aggregateFunction: AGGREGATE_FUNCTIONS.COUNT,\n });\n\n const aggFunctionProperty = buildAggFunctionAlias(\n AGGREGATE_FUNCTIONS.COUNT,\n );\n const item: any = items.length ? items[0] : {};\n return item[aggFunctionProperty] || 0;\n }\n\n async update(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<T>,\n options: IUpdateOptions = {},\n ): Promise<any> {\n const savedRecord = options?.skipFindItems\n ? {}\n : await this.findItem({ filters });\n\n const inputData: any = {\n ...savedRecord,\n ...data,\n } as {\n [key: string]: any;\n };\n\n const result = await this.updateCommand(filters, this.prepareData(inputData));\n if (options?.returnRowsAffected) {\n return result.rowCount || 0;\n }\n\n return this.getItem(inputData);\n }\n\n async upsert(\n keyColumnNames: string[],\n data: T,\n ): Promise<any> {\n const inputData = this.prepareData(data);\n return this.upsertCommand(keyColumnNames, inputData).then((result) =>\n result.rowCount && result.rows?.length ? this.getItem(result.rows[0]) : null,\n );\n }\n\n async remove(\n filters: IFilter[] | ICompositeFilter | IFilter[][],\n options: IRemoveOptions,\n ): Promise<void> {\n await this.deleteCommand(filters, options?.filterGroups);\n }\n\n runQuery(querySentence: string, values?: any[]) {\n return super.runQuery(querySentence, values);\n }\n\n async updateExpressions(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: IUpdateExpressionsOptions,\n ): Promise<any> {\n const result = await this.updateExpressionCommand(\n filters,\n actions,\n options,\n );\n return PersistenceErrorWrapper(result);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n runRawQuery(query: string, params: any[]): Promise<any> {\n return super.runQuery(query, params);\n }\n}\n","import { Pool } from 'pg';\nimport { ICrudService } from '../interfaces';\nimport { CrudSchema } from '../schemas';\nimport { PostgreSqlCrudService, DynamoDbCrudService } from './cruds/';\nexport class CrudFactory {\n static databaseClientService<T>(\n crudSchema: typeof CrudSchema,\n pool?: Pool,\n ): ICrudService<T> {\n const isMultiPlatformMode =\n process.env.PLATFORM_TYPE?.toLowerCase() === 'container';\n\n if (isMultiPlatformMode)\n return new PostgreSqlCrudService<T>(crudSchema, pool);\n return new DynamoDbCrudService<T>(crudSchema);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Pool } from 'pg';\nimport {\n buildQueryIndex,\n buildFilter,\n buildSort,\n} from '../helpers/crudHelpers';\nimport {\n ICompositeFilter,\n ICreateMultipleResponse,\n IFilter,\n IFindOptions,\n IRemoveOptions,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n IUpdateOptions,\n} from '../interfaces';\nimport { CrudSchema } from '../schemas';\nimport { CrudFactory } from './crudFactory.service';\n\nclass CrudService<T> {\n private crudSchema: typeof CrudSchema;\n\n constructor(\n crudSchema: typeof CrudSchema,\n private pool?: Pool,\n ) {\n this.crudSchema = crudSchema;\n }\n\n private async getCrudServiceInstance() {\n const crudService = await CrudFactory.databaseClientService(\n this.crudSchema,\n this.pool,\n );\n return crudService;\n }\n\n private getDefaultValue(columnName: string): any {\n const column = this.crudSchema.columns[columnName];\n return column ? column.default : undefined;\n }\n\n private setDefaultValues(data: any) {\n const defaultValues: { [key: string]: any } = {};\n const columns = this.crudSchema.columns;\n\n for (const columnName in columns) {\n const missingColumnValue = !(columnName in data);\n const columnDefaultValue = this.getDefaultValue(columnName);\n if (missingColumnValue && columnDefaultValue) {\n defaultValues[columnName] = columnDefaultValue;\n }\n }\n\n return { ...defaultValues, ...data };\n }\n\n create(data: T | T[]): Promise<unknown | ICreateMultipleResponse> {\n const processedData = Array.isArray(data)\n ? data.map(this.setDefaultValues.bind(this))\n : this.setDefaultValues(data);\n\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.create(processedData),\n );\n }\n\n find(options: IFindOptions) {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.find(options),\n );\n }\n\n findItem(options: IFindOptions) {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.findItem(options),\n );\n }\n\n update(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<T>,\n options: IUpdateOptions = {},\n ): Promise<T | null> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.update(filters, data, options),\n );\n }\n\n upsert(\n keyColumnNames: string[],\n data: T,\n ): Promise<T | null> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.upsert(keyColumnNames, data),\n );\n }\n\n remove(\n filters: IFilter[] | ICompositeFilter | IFilter[][],\n options: IRemoveOptions = {},\n ): Promise<void> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.remove(filters, options),\n );\n }\n\n findAll(options: IFindOptions) {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const { pagination, ...findAllOptions } = options;\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.findAll(findAllOptions),\n );\n }\n\n findCount(findCountOptions: IFindOptions): Promise<number> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.findCount(findCountOptions),\n );\n }\n\n buildFilter(\n attribute: string,\n value: any,\n operator = 'EQUAL',\n relativePath = undefined,\n ) {\n return buildFilter(attribute, value, operator, relativePath);\n }\n\n buildQueryIndex(indexName: string, columns: string[]) {\n return buildQueryIndex(indexName, columns);\n }\n\n buildSort(column: string, direction: string) {\n return buildSort(column, direction);\n }\n\n updateExpression(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options?: IUpdateExpressionsOptions,\n ): Promise<T | null> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.updateExpressions(filters, actions, options),\n );\n }\n\n runRawQuery(query: string, params: any[]) {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.runRawQuery(query, params),\n );\n }\n}\n\nexport default CrudService;\n","import { PoolClient } from 'pg';\nimport { ITableName, ITableColumns } from '../interfaces';\n\nexport class CrudSchema {\n static table: string | ITableName;\n static columns: ITableColumns;\n static usePool?: boolean = false;\n static schema: string | null = null;\n static poolClient?: PoolClient;\n static isTemporalTable: boolean = false;\n}\n","import { FILTER_LOGIC_OPERATORS } from '../utils/constants';\n\nconst VALID_FILTER_LOGIC_OPERATORS: FILTER_LOGIC_OPERATORS[] = Object.values(\n FILTER_LOGIC_OPERATORS,\n);\n\nexport type FilterLogicOperator = (typeof VALID_FILTER_LOGIC_OPERATORS)[number];\n","import { CONNECTION_CLOSING_MODES } from '../utils/constants';\n\nconst VALID_CONNECTION_CLOSING_MODES: CONNECTION_CLOSING_MODES[] =\n Object.values(CONNECTION_CLOSING_MODES);\n\nexport type ConnectionClosingMode =\n (typeof VALID_CONNECTION_CLOSING_MODES)[number];\n","import { Pool, PoolConfig } from 'pg';\nimport { getConnectionAlias, isMultiPlatformMode } from '../utils/constants';\n\nexport const DEFAULT_DB_POOL_CONFIG: PoolConfig = {\n max: 20,\n connectionTimeoutMillis: 10 * 1000,\n idleTimeoutMillis: 30 * 1000 /** DB cluster's idle timeout is 60 s */,\n keepAlive: true,\n};\n\nexport function getDbPool(poolConfig?: PoolConfig) {\n if (!isMultiPlatformMode()) return undefined;\n\n const pool = new Pool({\n ...DEFAULT_DB_POOL_CONFIG,\n connectionString: process.env.MULTIPLATFORM_PG_CONNECTION_STRING,\n application_name: getConnectionAlias(),\n ...poolConfig /** Custom implementer config */,\n });\n\n pool.on('error', (error: Error) => {\n /** Prevent idle-client connection drops from becoming uncaught exceptions. */\n console.error(\n '[data-persistence] Unexpected PG pool error on idle client',\n error,\n );\n });\n\n return pool;\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/constants.ts","../../src/helpers/crudHelpers.ts","../../src/services/cruds/dynamodb/dynamoDbClient.service.ts","../../src/helpers/queryHelpers.ts","../../src/services/cruds/dynamodb/queryBuilderCondition.service.ts","../../src/services/cruds/dynamodb/queryBuilder.service.ts","../../src/helpers/tableHelper.ts","../../src/error/NoRecordsAffectedException.ts","../../src/helpers/errorHelper.ts","../../src/services/cruds/dynamodb/dynamoDbCrud.service.ts","../../src/services/connectionRegistry.ts","../../src/services/cruds/postgresql/connection.service.ts","../../src/services/cruds/postgresql/query.service.ts","../../src/services/cruds/postgresql/postgreSqlClient.service.ts","../../src/services/cruds/postgresql/postgreSqlCrud.service.ts","../../src/services/crudFactory.service.ts","../../src/services/crud.service.ts","../../src/schemas/crudSchema.ts","../../src/types/filterLogicOperator.type.ts","../../src/types/connectionClosingMode.type.ts","../../src/services/dbPool.service.ts"],"names":["CONNECTION_CLOSING_MODES","FILTER_LOGIC_OPERATORS","_a","_b","isMultiPlatformMode"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAO,IAAM,mBAAA,GAAiD;AAAA,EAC1D,QAAA,EAAU,UAAA;AAAA,EACV,YAAA,EAAc,aAAA;AAAA,EACd,KAAA,EAAO,IAAA;AAAA,EACP,WAAA,EAAa,YAAA;AAAA,EACb,SAAA,EAAW,OAAA;AAAA,EACX,EAAA,EAAI,IAAA;AAAA,EACJ,YAAA,EAAc,IAAA;AAAA,EACd,EAAA,EAAI,IAAA;AAAA,EACJ,kBAAA,EAAoB,KAAA;AAAA,EACpB,GAAA,EAAK,KAAA;AAAA,EACL,SAAA,EAAW,IAAA;AAAA,EACX,EAAA,EAAI,IAAA;AAAA,EACJ,eAAA,EAAiB,KAAA;AAAA,EACjB,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,kBAAA;AAAA,EACP,SAAA,EAAW,sBAAA;AAAA,EACX,OAAA,EAAS;AACb,CAAA;AAEO,IAAM,kBAAA,GAAgD;AAAA,EACzD,KAAA,EAAO;AACX,CAAA;AAOO,IAAK,wBAAA,qBAAAA,yBAAAA,KAAL;AACH,EAAAA,0BAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,0BAAA,QAAA,CAAA,GAAS,QAAA;AAFD,EAAA,OAAAA,yBAAAA;AAAA,CAAA,EAAA,wBAAA,IAAA,EAAA,CAAA;AAKL,IAAK,sBAAA,qBAAAC,uBAAAA,KAAL;AACH,EAAAA,wBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,wBAAA,IAAA,CAAA,GAAK,IAAA;AAFG,EAAA,OAAAA,uBAAAA;AAAA,CAAA,EAAA,sBAAA,IAAA,EAAA,CAAA;AAqBL,IAAM,4BAAA,GAA+B;AAAA,EACxC,KAAA,EAAO,GAAA;AAAA,EACP,SAAA,EAAW,IAAA;AAAA,EACX,YAAA,EAAc,GAAA;AAAA,EACd,EAAA,EAAI,GAAA;AAAA,EACJ,GAAA,EAAK,IAAA;AAAA,EACL,kBAAA,EAAoB,IAAA;AAAA,EACpB,GAAA,EAAK,IAAA;AAAA,EACL,eAAA,EAAiB,IAAA;AAAA,EACjB,SAAA,EAAW,GAAA;AAAA,EACX,EAAA,EAAI,GAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,WAAA,EAAa,MAAA;AAAA,EACb,QAAA,EAAU,MAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,aAAA;AAAA,EACP,SAAA,EAAW;AACf,CAAA;AAEO,IAAM,iBAAA,GAAoB,QAAA;AAM1B,IAAM,wBAAA,GAAsD;AAAA,EAC/D,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAEO,SAAS,mBAAA,GAAsB;AAxFtC,EAAA,IAAA,EAAA;AAyFI,EAAA,OAAA,CAAA,CAAO,EAAA,GAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,KAAZ,IAAA,GAAA,MAAA,GAAA,EAAA,CAA2B,WAAA,EAAA,MAAkB,WAAA;AACxD;AAEO,SAAS,kBAAA,GAA6B;AACzC,EAAA,OAAO,OAAA,CAAQ,IAAI,mBAAA,IAAuB,OAAA,CAAQ,IAAI,QAAA,IAAY,OAAA,CAAQ,IAAI,YAAA,IAAgB,eAAA;AAClG;;;ACzFO,SAAS,YACZ,SAAA,EACA,KAAA,EACA,QAAA,GAAW,OAAA,EACX,eAAe,MAAA,EACjB;AACE,EAAA,OAAO;AAAA,IACH,SAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAEO,SAAS,eAAA,CAAgB,WAAmB,OAAA,EAAmB;AAClE,EAAA,OAAO;AAAA,IACH,SAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAEO,SAAS,SAAA,CACZ,QACA,SAAA,GAAA,KAAA,YACQ;AACR,EAAA,OAAO;AAAA,IACH,MAAA;AAAA,IACA;AAAA,GACJ;AACJ;ACZA,IAAM,UAAA,GAAa,QAAQ,GAAA,CAAI,kBAAA;AAO/B,IAAqB,wBAArB,MAA2C;AAAA,EAIvC,YAAY,SAAA,EAAmB;AAC3B,IAAA,IAAI,CAAC,SAAA;AACD,MAAA,MAAM,IAAI,KAAA;AAAA,QACN;AAAA,OACJ;AACJ,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,MAAM,SAAS,IAAI,cAAA,CAAe,EAAE,MAAA,EAAQ,YAAY,CAAA;AACxD,IAAA,IAAA,CAAK,cAAA,GAAiB,sBAAA,CAAuB,IAAA,CAAK,MAAA,EAAQ;AAAA,MACtD,eAAA,EAAiB;AAAA,QACb,qBAAA,EAAuB;AAAA;AAC3B,KACH,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,QAAA,CAET,SAAA,EACA,OAAA,GAAoC,EAAC,EACvC;AACE,IAAA,MAAM,MAAA,GAA0B,cAAA,CAAA;AAAA,MAC5B,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,GAAA,EAAK;AAAA,KAAA,EACF,OAAA,CAAA;AAEP,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,UAAA,CAAW,MAAM,CAAC,CAAA;AACpE,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,KAAA,CACT,OAAA,GAAgD,EAAC,EACH;AAC9C,IAAA,MAAM,MAAA,GAA4B,cAAA,CAAA;AAAA,MAC9B,WAAW,IAAA,CAAK;AAAA,KAAA,EACb,OAAA,CAAA;AAEP,IAAA,MAAM,MAAA,GACF,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,YAAA,CAAa,MAAM,CAAC,CAAA;AAE3D,IAAA,IAAI,MAAA,CAAO,SAAA,EAAW,OAAO,MAAA,CAAO,SAAA;AACpC,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,KACT,KAAA,EAC8C;AAC9C,IAAA,MAAM,MAAA,GAA2B,iCAC1B,KAAA,CAAA,EAD0B;AAAA,MAE7B,WAAW,IAAA,CAAK;AAAA,KACpB,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,CAAY,MAAM,CAAA;AACtC,IAAA,MAAM,QAAA,GACF,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,OAAO,CAAA;AAC1C,IAAA,IAAI,QAAA,CAAS,SAAA,EAAW,OAAO,QAAA,CAAS,SAAA;AACxC,IAAA,OAAO,QAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,IAAI,KAAA,EAA4B;AACzC,IAAA,MAAM,MAAA,GAA0B;AAAA,MAC5B,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,IAAA,EAAM,KAAA;AAAA,MACN,YAAA,EAAc;AAAA,KAClB;AACA,IAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,MAAA,CAET,SAAA,EACA,OAAA,GAAuC,EAAC,EAC1C;AACE,IAAA,MAAM,MAAA,GAA6B,cAAA,CAAA;AAAA,MAC/B,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,GAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAc;AAAA,KAAA,EACX,OAAA,CAAA;AAEP,IAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,OAAO,SAAA,EAAgC;AAChD,IAAA,MAAM,MAAA,GAA6B;AAAA,MAC/B,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,GAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAc;AAAA,KAClB;AACA,IAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,EACnE;AAAA,EAEO,gBAAgB,IAAA,EAA2B;AAC9C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,MACzC,UAAA,EAAY;AAAA,QACR,IAAA,EAAM;AAAA;AACV,KACJ,CAAE,CAAA;AACF,IAAA,MAAM,MAAA,GAAS;AAAA,MACX,YAAA,EAAc;AAAA,QACV,CAAC,IAAA,CAAK,SAAS,GAAG;AAAA;AACtB,KACJ;AACA,IAAA,MAAM,aAAA,GAAgB,IAAI,iBAAA,CAAkB,MAAM,CAAA;AAClD,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,aAAa,CAAA;AAAA,EACjD;AAAA,EAEQ,uBAAuB,OAAA,EAAoB;AAC/C,IAAA,MAAM,oBAAyB,EAAC;AAChC,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AACxB,MAAA,iBAAA,CAAkB,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA,CAAO,KAAA;AAAA,IACjD,CAAC,CAAA;AACD,IAAA,OAAO,iBAAA;AAAA,EACX;AAAA,EAEA,MAAM,YAAY,YAAA,EAA0C;AACxD,IAAA,IAAI,EAAC,6CAAc,MAAA,CAAA,EAAQ;AAE3B,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,GAAA,CAAI,CAAC,WAAA,MAA4B;AAAA,MACjE,aAAA,EAAe;AAAA,QACX,GAAA,EAAK,IAAA,CAAK,sBAAA,CAAuB,WAAW;AAAA;AAChD,KACJ,CAAE,CAAA;AAEF,IAAA,MAAM,MAAA,GAAS;AAAA,MACX,YAAA,EAAc;AAAA,QACV,CAAC,IAAA,CAAK,SAAS,GAAG;AAAA;AACtB,KACJ;AAEA,IAAA,MAAM,KAAK,cAAA,CAAe,IAAA,CAAK,IAAI,iBAAA,CAAkB,MAAM,CAAC,CAAA;AAAA,EAChE;AAAA,EAEA,MAAa,iBAAA,CAET,SAAA,EACA,OAAA,GAAuC,EAAC,EAC1C;AACE,IAAA,MAAM,MAAA,GAA6B,cAAA,CAAA;AAAA,MAC/B,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,GAAA,EAAK;AAAA,KAAA,EACF,OAAA,CAAA;AAGP,IAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,EACnE;AACJ,CAAA;;;ACvMO,SAAS,sBACZ,iBAAA,EACM;AACN,EAAA,OAAO,UAAU,iBAAiB,CAAA,CAAA;AACtC;;;ACLA,IAAqB,+BAArB,MAEA;AAAA,EAqBI,YAAY,KAAA,EAAsB;AAVlC,IAAA,IAAA,CAAQ,OAAA,GAAkB,EAAA;AAC1B,IAAA,IAAA,CAAQ,iBAAA,GAAmC,IAAA;AAE3C,IAAA,IAAA,CAAQ,SAAmB,EAAC;AAC5B,IAAA,IAAA,CAAQ,UAAoB,EAAC;AAC7B,IAAA,IAAA,CAAQ,UAAoB,EAAC;AAC7B,IAAA,IAAA,CAAQ,iBAAyC,EAAC;AAElD;AAAA,IAAA,IAAA,CAAQ,kBAAuC,EAAC;AAG5C,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EACpB;AAAA,EAEO,GAAA,GAAM;AACT,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA,EAEO,OAAO,GAAA,EAAa;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,GAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EACA,cAAc,OAAA,EAAiB;AAC3B,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,UAAU,MAAA,EAAa;AACnB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEO,KAAK,UAAA,EAA6B;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,UAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,GAAG,QAAA,EAAkB;AACjB,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AACrD,IAAA,IAAI,UAAA,GAAkB,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA;AACvC,IAAA,IAAI,IAAA,CAAK,iBAAA;AACL,MAAA,UAAA,GAAa,EAAE,UAAA,EAAY,aAAA,EAAe,KAAK,iBAAA,EAAmB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC1F,IAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,MAAM,QAAA,EAAkB;AACpB,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AACrD,IAAA,IAAI,UAAA,GAAkB,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA;AACxC,IAAA,IAAI,IAAA,CAAK,iBAAA;AACL,MAAA,UAAA,GAAa,EAAE,UAAA,EAAY,aAAA,EAAe,KAAK,iBAAA,EAAmB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC1F,IAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,SAAS,QAAA,EAAkB;AACvB,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AACrD,IAAA,IAAI,UAAA,GAAkB,CAAA,SAAA,EAAY,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAA;AAC/C,IAAA,IAAI,IAAA,CAAK,iBAAA;AACL,MAAA,UAAA,GAAa,EAAE,UAAA,EAAY,aAAA,EAAe,KAAK,iBAAA,EAAmB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC1F,IAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,YAAY,QAAA,EAAkB;AAC1B,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AACrD,IAAA,IAAI,UAAA,GAAkB,CAAA,aAAA,EAAgB,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAA;AACnD,IAAA,IAAI,IAAA,CAAK,iBAAA;AACL,MAAA,UAAA,GAAa,EAAE,UAAA,EAAY,aAAA,EAAe,KAAK,iBAAA,EAAmB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC1F,IAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,GAAG,QAAA,EAAe;AACd,IAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA;AAChE,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,IAAA,CAAK,iBAAiB,SAAS,CAAA;AACtD,IAAA,IAAI,UAAA,GAAkB,CAAA,EAAG,GAAG,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA,CAAA;AACzC,IAAA,IAAI,IAAA,CAAK,iBAAA;AACL,MAAA,UAAA,GAAa,EAAE,UAAA,EAAY,aAAA,EAAe,KAAK,iBAAA,EAAmB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC1F,IAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,WAAW,QAAA,EAAkB;AACzB,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AACrD,IAAA,IAAI,UAAA,GAAkB,CAAA,YAAA,EAAe,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAA;AAClD,IAAA,IAAI,IAAA,CAAK,iBAAA;AACL,MAAA,UAAA,GAAa,EAAE,UAAA,EAAY,aAAA,EAAe,KAAK,iBAAA,EAAmB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC1F,IAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,QAAQ,QAAA,EAA0B;AAC9B,IAAA,MAAM,GAAA,GAAM,IAAI,QAAQ,CAAA,CAAA;AACxB,IAAA,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,GAAI,QAAA;AAC3B,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEA,GAAG,QAAA,EAAe;AACd,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AACrD,IAAA,IAAI,UAAA,GAAkB,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA;AACvC,IAAA,IAAI,IAAA,CAAK,iBAAA;AACL,MAAA,UAAA,GAAa,EAAE,UAAA,EAAY,aAAA,EAAe,KAAK,iBAAA,EAAmB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC1F,IAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,IAAI,QAAA,EAAe;AACf,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AACrD,IAAA,IAAI,UAAA,GAAkB,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA;AACxC,IAAA,IAAI,IAAA,CAAK,iBAAA;AACL,MAAA,UAAA,GAAa,EAAE,UAAA,EAAY,aAAA,EAAe,KAAK,iBAAA,EAAmB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC1F,IAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,IAAI,QAAA,EAAe;AACf,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AACrD,IAAA,IAAI,UAAA,GAAkB,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA;AACxC,IAAA,IAAI,IAAA,CAAK,iBAAA;AACL,MAAA,UAAA,GAAa,EAAE,UAAA,EAAY,aAAA,EAAe,KAAK,iBAAA,EAAmB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC1F,IAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,GAAG,QAAA,EAAe;AACd,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AACrD,IAAA,IAAI,UAAA,GAAkB,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA;AACvC,IAAA,IAAI,IAAA,CAAK,iBAAA;AACL,MAAA,UAAA,GAAa,EAAE,UAAA,EAAY,aAAA,EAAe,KAAK,iBAAA,EAAmB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC1F,IAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,iBAAiB,QAAA,EAAkB;AAC/B,IAAA,MAAM,EAAE,GAAA,EAAI,GAAI,KAAK,gBAAA,CAAiB,QAAA,EAAU,MAAM,IAAI,CAAA;AAC1D,IAAA,IAAI,UAAA,GAAkB,oBAAoB,GAAG,CAAA,CAAA,CAAA;AAC7C,IAAA,IAAI,IAAA,CAAK,iBAAA;AACL,MAAA,UAAA,GAAa,EAAE,UAAA,EAAY,aAAA,EAAe,KAAK,iBAAA,EAAmB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC1F,IAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,qBAAqB,QAAA,EAAkB;AACnC,IAAA,MAAM,EAAE,GAAA,EAAI,GAAI,KAAK,gBAAA,CAAiB,QAAA,EAAU,MAAM,IAAI,CAAA;AAC1D,IAAA,IAAI,UAAA,GAAkB,wBAAwB,GAAG,CAAA,CAAA,CAAA;AACjD,IAAA,IAAI,IAAA,CAAK,iBAAA;AACL,MAAA,UAAA,GAAa,EAAE,UAAA,EAAY,aAAA,EAAe,KAAK,iBAAA,EAAmB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC1F,IAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,QAAQ,SAAA,EAAgB;AACpB,IAAA,MAAM,gBACF,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,IAAA,CAAK,uCAAW,MAAA,MAAW,CAAA;AACtD,IAAA,IAAI,CAAC,aAAA;AACD,MAAA,MAAM,IAAI,KAAA;AAAA,QACN;AAAA,OACJ;AAEJ,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,KAAU,IAAA,CAAK,gBAAA,CAAiB,WAAW,MAAM,CAAA;AAC9D,IAAA,IAAI,UAAA,GAAkB,CAAA,EAAG,GAAG,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA;AAC7C,IAAA,IAAI,IAAA,CAAK,iBAAA;AACL,MAAA,UAAA,GAAa,EAAE,UAAA,EAAY,aAAA,EAAe,KAAK,iBAAA,EAAmB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAC1F,IAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEQ,cAAc,UAAA,EAA0B;AAC5C,IAAA,QAAQ,KAAK,SAAA;AAAW,MACpB,KAAA,QAAA;AACI,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,UAAU,CAAA;AAC5B,QAAA;AAAA,MACJ,KAAA,QAAA;AACI,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,UAAU,CAAA;AAC5B,QAAA;AAAA,MACJ;AACI,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,UAAU,CAAA;AAC3B,QAAA;AAAA;AACR,EACJ;AAAA,EAEQ,gBAAA,CACJ,KAAA,EACA,kBAAA,GAAoC,GAAA,EACpC,sBAA+B,KAAA,EAIjC;AACE,IAAA,MAAM,aAAA,GAAgB,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,CAAA,CAAA;AAEtC,IAAA,IAAA,CAAK,cAAA,CAAe,aAAa,CAAA,GAAI,IAAA,CAAK,OAAA;AAE1C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtB,MAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,GAAA,CAAI,CAAC,KAAK,KAAA,KAAU;AAC/C,QAAA,IAAI,kBAAkB,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,EAAG,QAAQ,CAAC,CAAA,CAAA,CAAA;AAClD,QAAA,KAAA,MAAW,CAAC,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,eAAe,CAAA,EAAG;AACpD,UAAA,IAAI,CAAA,KAAM,iBAAiB,eAAA,IAAmB,GAAA;AAAA,QAClD;AACA,QAAA,IAAA,CAAK,eAAA,CAAgB,eAAe,CAAA,GAAI,GAAA;AACxC,QAAA,OAAO,eAAA;AAAA,MACX,CAAC,CAAA;AACD,MAAA,OAAO;AAAA,QACH,GAAA,EAAK,aAAA;AAAA,QACL,KAAA,EAAO,gBAAA,CAAiB,IAAA,CAAK,CAAA,EAAG,kBAAkB,CAAA,CAAA,CAAG;AAAA,OACzD;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,IAAI,eAAA,GAAkB,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,CAAA,CAAA;AACtC,MAAA,IAAI,eAAA,IAAmB,KAAK,eAAA,EAAiB;AACzC,QAAA,KAAA,MAAW,CAAC,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,eAAe,CAAA,EAAG;AACxD,UAAA,IAAI,KAAA,KAAU,iBAAiB,eAAA,IAAmB,GAAA;AAAA,QACtD;AAAA,MACJ;AACA,MAAA,IAAI,CAAC,mBAAA;AACD,QAAA,IAAA,CAAK,eAAA,CAAgB,eAAe,CAAA,GAAI,KAAA;AAC5C,MAAA,OAAO,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,eAAA,EAAgB;AAAA,IACxD;AAAA,EACJ;AAAA,EAEQ,KAAA,GAAc;AAlP1B,IAAA,IAAA,EAAA;AAmPQ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACxB,MAAA,MAAM,sBAAA,GAAyB,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACvD,MAAA,IAAA,CAAK,OAAA,CAAQ,wBAAwB,CAAA,GAAI,sBAAA;AAAA,IAC7C;AACA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACzB,MAAA,IAAI,gBAAA,GAAmB,EAAA;AAEvB,MAAA,CAAA,EAAA,GAAA,IAAA,CAAK,OAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,OAAA,CAAQ,CAAC,QAAa,KAAA,KAAU;AA1P1D,QAAA,IAAAC,GAAAA,EAAA,EAAA;AA2PgB,QAAA,IAAI,iCAAQ,aAAA,EAAe;AACvB,UAAA,IAAA,CAAIA,GAAAA,GAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,MAAA,KAAR,IAAA,GAAA,MAAA,GAAAA,IAAgB,cAAA,EAAgB;AAChC,YAAA,gBAAA,GAAmB,iBAAiB,OAAA,CAAQ,iBAAA,EAAmB,IAAI,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,EAAA,CAAI,CAAA;AAC9F,YAAA,IAAI,gBAAA,KAAqB,IAAI,gBAAA,IAAoB,GAAA;AACjD,YAAA,gBAAA,IAAoB,CAAA,EAAG,MAAA,CAAO,UAAU,CAAA,CAAA,EAAI,OAAO,aAAa,CAAA,CAAA,CAAA;AAAA,UACpE,CAAA,MAAA,IAAA,CAAW,EAAA,GAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,MAAA,KAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAgB,eAAA,EAAiB;AACxC,YAAA,gBAAA,IAAoB,GAAG,MAAA,CAAO,UAAU,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,SAAS,CAAA,CAAA,CAAA;AAAA,UACxE,CAAA,MAAO;AACH,YAAA,gBAAA,IAAoB,CAAA,EAAG,MAAA,CAAO,UAAU,CAAA,CAAA,EAAI,OAAO,aAAa,CAAA,CAAA,CAAA;AAAA,UACpE;AAAA,QACJ;AAAA,MACJ,CAAA,CAAA;AACA,MAAA,gBAAA,GAAmB,gBAAA,CAAiB,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA;AACjE,MAAA,IAAA,CAAK,OAAA,CAAQ,kBAAkB,CAAA,GAAI,gBAAA;AAAA,IACvC;AACA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACzB,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAC/C,MAAA,IAAA,CAAK,OAAA,CAAQ,kBAAkB,CAAA,GAAI,CAAA,IAAA,EAAO,gBAAgB,CAAA,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,cAAc,EAAE,MAAA,GAAS,CAAA;AAC5C,MAAA,IAAA,CAAK,OAAA,CAAQ,0BAA0B,CAAA,GAAI,IAAA,CAAK,cAAA;AAEpD,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,eAAe,EAAE,MAAA,GAAS,CAAA;AAC7C,MAAA,IAAA,CAAK,OAAA,CAAQ,2BAA2B,CAAA,GAAI,IAAA,CAAK,eAAA;AAAA,EACzD;AACJ,CAAA;;;AC7QA,IAAqB,sBAArB,MAAkE;AAAA,EAI9D,WAAA,CAAoB,UAAU,KAAA,EAAO;AAAjB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAChB,IAAA,IAAA,CAAK,UAAU,EAAC;AAEhB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,4BAAA,CAA6B,IAAI,CAAA;AAAA,EAC1D;AAAA,EAEA,GAAA,GAAM;AACF,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,EAAI;AACrC,IAAA,OAAO,cAAA,CAAA,cAAA,CAAA,EAAA,EAAK,KAAK,OAAA,CAAA,EAAY,SAAA,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,GAAA,EAA4B;AAC9B,IAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,GAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,WAAW,SAAA,EAAkC;AACzC,IAAA,IAAA,CAAK,QAAQ,SAAA,GAAY,SAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,SAAA,GAA2B;AACvB,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,QAAQ,gBAAA,GAAmB,IAAA;AACnD,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,UAAA,GAA4B;AACxB,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,QAAQ,gBAAA,GAAmB,KAAA;AACnD,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGA,SAAS,gBAAA,EAAsD;AAC3D,IAAA,IAAA,CAAK,QAAQ,iBAAA,GAAoB,gBAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,UAAA,CAAW,MAAA,GAAmB,EAAC,EAAG;AAC9B,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,IAAA;AAE3B,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACtB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA;AACxC,MAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,IACvB,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,OAAA,CAAQ,oBAAA,GAAuB,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AACvD,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,MAAM,OAAA,EAAyC;AAC3C,IAAA,IAAA,CAAK,UACA,MAAA,CAAO,OAAO,EACd,aAAA,CAAc,IAAI,EAClB,IAAA,CAAA,OAAA,aAA0B;AAC/B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA,EAEA,MAAA,CACI,OAAA,EACA,aAAA,GAAwB,KAAA,EACxB,MAAA,EACsB;AACtB,IAAA,IAAA,CAAK,SAAA,CACA,MAAA,CAAO,OAAO,CAAA,CACd,aAAA,CAAc,aAAa,CAAA,CAC3B,SAAA,CAAU,MAAM,CAAA,CAChB,IAAA,CAAA,QAAA,cAA2B;AAChC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA,EAEA,OAAO,SAAA,EAAkD;AACrD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAClD,MAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAA,QAAA,cAA2B;AACtD,MAAA,IAAA,CAAK,SAAA,CAAU,GAAG,KAAK,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,eAAe,cAAA,EAAwC;AACnD,IAAA,IAAA,CAAK,QAAQ,cAAA,GAAiB,cAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,KAAA,GAAuB;AACnB,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAA,OAAA;AACb,IAAA,OAAO,IAAA;AAAA,EACX;AACJ,CAAA;;;AChGO,SAAS,oBAAoB,OAAA,EAAkC;AAClE,EAAA,OAAO,MAAA,CAAO,KAAK,OAAO,CAAA;AAC9B;AAEO,SAAS,iBAAiB,OAAA,EAA4C;AACzE,EAAA,OAAO,mBAAA,CAAoB,OAAO,CAAA,CAAE,IAAA;AAAA,IAChC,CAAC,UAAA,KAAe,OAAA,CAAQ,UAAU,EAAE,QAAA,KAAa;AAAA,GACrD;AACJ;AAEO,SAAS,YAAA,CACZ,KAAA,EACA,QAAA,GAAW,MAAA,EACL;AACN,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAEpD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAEtC,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,KAAA;AACxB,EAAA,OAAO,QAAA,KAAa,OAAA,IAAW,KAAA,GAAQ,KAAA,GAAQ,IAAA;AACnD;AAEO,SAAS,qBAAqB,OAAA,EAAkC;AACnE,EAAA,OAAO,mBAAA,CAAoB,OAAO,CAAA,CAAE,MAAA;AAAA,IAChC,CAAC,UAAA,KAAe,OAAA,CAAQ,UAAU,EAAE,OAAA,KAAY;AAAA,GACpD;AACJ;;;AC5BO,IAAM,0BAAA,GAAN,cAAyC,KAAA,CAAM;AAAA,EAClD,WAAA,GAAc;AACV,IAAA,KAAA,CAAM,+BAA+B,CAAA;AACrC,IAAA,IAAA,CAAK,IAAA,GAAO,4BAAA;AAAA,EAChB;AACJ,CAAA;;;ACHO,SAAS,QAAA,CAAS,SAAiB,GAAA,EAAoB;AAC1D,EAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,KAAA,GAAQ,MAAA;AACjD,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAA,CAAA,EAAK,OAAO,CAAA;AACvD,EAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA;AAClC;AAEO,SAAS,wBAAwB,WAAA,EAAkB;AACtD,EAAA,MAAM,iCAAA,GAAoC;AAAA,IACtC;AAAA,GACJ;AAEA,EAAA,IAAI,uBAAuB,KAAA,EAAO;AAE9B,IAAA,IACI,YAAY,IAAA,IACZ,iCAAA,CAAkC,QAAA,CAAS,WAAA,CAAY,IAAI,CAAA,EAC7D;AACE,MAAA,MAAM,IAAI,0BAAA,EAA2B;AAAA,IACzC,CAAA,MAAO;AACH,MAAA,MAAM,WAAA;AAAA,IACV;AAAA,EACJ,CAAA,MAAO;AAEH,IAAA,IAAI,WAAA,CAAY,aAAa,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,0BAAA,EAA2B;AAAA,IACzC;AAAA,EACJ;AAEA,EAAA,OAAO,WAAA;AACX;;;AChCA,IAAA,8BAAA,EAAA,oCAAA,EAAA,6BAAA,EAAA,kCAAA,EAAA,6BAAA,EAAA,4CAAA;AAmCO,IAAM,sBAAN,MAAwD;AAAA,EAG3D,YAAoB,WAAA,EAAgC;AAAhC,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAHjB,IAAA,YAAA,CAAA,IAAA,EAAA,8BAAA,CAAA;AAIC,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAI,qBAAA,CAAsB,IAAA,CAAK,SAAS,CAAA;AAAA,EACzE;AAAA,EAEA,IAAY,SAAA,GAAoB;AAC5B,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAAA,EAC9C;AAAA,EAEA,IAAY,YAAA,GAAmC;AAC3C,IAAA,OAAO,gBAAA,CAAiB,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAAA,EACpD;AAAA,EAEA,IAAY,kBAAA,GAA+B;AACvC,IAAA,OAAO,oBAAA,CAAqB,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAAA,EACxD;AAAA,EAEA,MAAM,OAAO,IAAA,EAAqD;AAtDtE,IAAA,IAAA,EAAA;AAuDQ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACrB,MAAA,MAAM,QAAA,GACF,MAAM,IAAA,CAAK,qBAAA,CAAsB,gBAAgB,IAAI,CAAA;AACzD,MAAA,OAAO;AAAA,QACH,gBAAA,EAAA,CAAkB,EAAA,GAAA,QAAA,CAAS,gBAAA,KAAT,IAAA,GAAA,EAAA,GAA6B;AAAC,OACpD;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,IAA2B,CAAA;AAChE,MAAA,OAAO,IAAA;AAAA,IACX;AAAA,EACJ;AAAA;AAAA,EAGA,SAAS,YAAA,EAAiC;AACtC,IAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,EAC7C;AAAA,EAEA,IAAA,CAAK,OAAA,GAAwB,EAAC,EAAiB;AAxEnD,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAyEQ,IAAA,MAAM,KAAA,GAAQ,IAAI,mBAAA,CAAoB,OAAA,CAAQ,OAAO,CAAA;AAErD,IAAA,IAAA,CAAI,EAAA,GAAA,OAAA,CAAQ,UAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,SAAA;AACf,MAAA,KAAA,CAAM,UAAA,CAAA,CAAW,EAAA,GAAA,OAAA,CAAQ,KAAA,KAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,SAAS,CAAA;AAE7C,IAAA,IAAA,CAAK,aAAa,KAAA,EAAO,OAAA,CAAQ,UAAS,EAAA,GAAA,OAAA,CAAQ,KAAA,KAAR,mBAAe,SAAS,CAAA;AAClE,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,OAAA,CAAQ,UAAU,CAAA;AAE9C,IAAA,IAAI,OAAA,CAAQ,cAAA;AACR,MAAA,KAAA,CAAM,cAAA,CAAe,QAAQ,cAAc,CAAA;AAE/C,IAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,KAAA,CAAM,UAAA,CAAW,QAAQ,MAAM,CAAA;AAEnD,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,OAAO,CAAA;AAEhC,IAAA,IAAI,OAAA,CAAQ,iBAAA,KAAA,OAAA;AACR,MAAA,KAAA,CAAM,KAAA,EAAM;AAEhB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACR,MAAM,GAAA,EAAI;AAAA,MAAA,CACV,EAAA,GAAA,OAAA,CAAQ,eAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAoB,KAAA;AAAA,MACpB,OAAA,CAAQ;AAAA,KACZ,CAAE,IAAA,CAAK,CAAC,GAAA,KAAa;AA/F7B,MAAA,IAAAA,GAAAA,EAAAC,GAAAA;AAgGY,MAAA,MAAM,aAA8B,EAAC;AACrC,MAAA,IAAI,GAAA,CAAI,gBAAA,EAAkB,UAAA,CAAW,IAAA,GAAO,GAAA,CAAI,gBAAA;AAChD,MAAA,IAAA,CAAID,GAAAA,GAAA,OAAA,CAAQ,UAAA,KAAR,IAAA,GAAA,MAAA,GAAAA,GAAAA,CAAoB,KAAA;AACpB,QAAA,UAAA,CAAW,KAAA,GAAA,CAAQC,GAAAA,GAAA,OAAA,CAAQ,UAAA,KAAR,gBAAAA,GAAAA,CAAoB,KAAA;AAC3C,MAAA,OAAO;AAAA,QACH,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,UAAA;AAAA,QACA,OAAO,GAAA,CAAI;AAAA,OACf;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,YAAA,CACF,OAAA,EACA,KAAA,GAAgB,GAAA,EAChB,UAAmB,KAAA,EACH;AAhHxB,IAAA,IAAA,EAAA,EAAA,EAAA;AAiHQ,IAAA,IAAI,UAAqB,EAAC;AAC1B,IAAA,IAAI,mBAA4C,EAAC;AACjD,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,GAAG;AACC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA;AAAA,QACtB,OAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACJ;AACA,MAAA,MAAM,IAAA,GAAA,CAAO,EAAA,GAAA,MAAA,CAAO,KAAA,KAAP,IAAA,GAAA,EAAA,GAAgB,EAAC;AAC9B,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAO,IAAI,CAAA;AAC7B,MAAA,gBAAA,GAAA,CAAmB,EAAA,GAAA,MAAA,CAAO,gBAAA,KAAP,IAAA,GAAA,EAAA,GAA2B,EAAC;AAC/C,MAAA,SAAA,IAAa,MAAA,CAAO,SAAS,IAAA,CAAK,MAAA;AAAA,IACtC,CAAA,QAAS,SAAA,GAAY,KAAA,IAAS,IAAA,CAAK,iBAAiB,gBAAgB,CAAA;AAEpE,IAAA,MAAM,4BAA4B,IAAA,CAAK,gBAAA;AAAA,MACnC;AAAA,KACJ,GACM,IAAA,CAAK,oBAAA,CAAqB,gBAAgB,CAAA,GAC1C,IAAA;AACN,IAAA,OAAO;AAAA,MACH,KAAA,EAAO,OAAA;AAAA,MACP,gBAAA,EAAkB,yBAAA;AAAA,MAClB,KAAA,EAAO;AAAA,KACX;AAAA,EACJ;AAAA,EAEA,MAAM,UAAA,CACF,OAAA,EACA,OAAA,EACA,gBAAA,EACoC;AAjJ5C,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAkJQ,IAAA,IAAI,IAAA,CAAK,iBAAiB,gBAAgB,CAAA;AACtC,MAAA,OAAA,CAAQ,iBAAA,GAAoB,gBAAA;AAEhC,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,GAChB,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA,GACvC,IAAA,CAAK,qBAAA,CAAsB,KAAA,CAAM,OAAO,CAAA,CAAA;AAE9C,IAAA,IAAI,QAAQ,MAAA,KAAA,OAAA,cAAsC;AAC9C,MAAA,OAAA,CAAQ,KAAA,GAAA,CAAA,CAAS,aAAQ,KAAA,KAAR,IAAA,GAAA,EAAA,GAAiB,OAAM,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,KAAA,KAAP,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,MAAA,KAAd,IAAA,GAAA,EAAA,GAAwB,CAAA,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,eAAA,CACI,OACA,UAAA,EACF;AACE,IAAA,IAAI,UAAA,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAY,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,WAAW,KAAK,CAAA;AACnD,IAAA,IAAI,UAAA,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAY,IAAA;AACZ,MAAA,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,oBAAA,CAAqB,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EACjE;AAAA,EAEA,MAAM,QACF,OAAA,GAAwB,IACxB,UAAA,GAAoB,EAAC,EACrB,SAAA,GAAoB,CAAA,EACR;AACZ,IAAA,MAAM,EAAE,OAAO,UAAA,EAAY,KAAA,KAAU,MAAM,IAAA,CAAK,KAAK,OAAO,CAAA;AAC5D,IAAA,UAAA,CAAW,IAAA,CAAK,GAAG,KAAK,CAAA;AACxB,IAAA,SAAA,IAAa,KAAA;AAEb,IAAA,IAAI,UAAA,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAY,IAAA;AACZ,MAAA,MAAM,KAAK,OAAA,CAAQ,aAAA,CAAA,cAAA,CAAA,EAAA,EAAK,UAAL,EAAc,UAAA,KAAc,UAAU,CAAA;AAE7D,IAAA,OAAO;AAAA,MACH,KAAA,EAAO,UAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACX;AAAA,EACJ;AAAA,EAEA,MAAM,SAAA,CAAU,OAAA,GAAwB,EAAC,EAAoB;AA5LjE,IAAA,IAAA,EAAA;AA6LQ,IAAA,MAAM,WAAA,GAAc,iCACb,OAAA,CAAA,EADa;AAAA,MAEhB,iBAAA,EAAA,OAAA;AAAA,KACJ,CAAA;AACA,IAAA,IAAA,CAAI,EAAA,GAAA,OAAA,CAAQ,UAAA,KAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAoB,IAAA,EAAM;AAC1B,MAAA,OAAO,IAAA,CAAK,KAAK,WAAW,CAAA,CAAE,KAAK,CAAC,GAAA,KAAQ,IAAI,KAAK,CAAA;AAAA,IACzD,CAAA,MAAO;AACH,MAAA,OAAO,IAAA,CAAK,QAAQ,WAAW,CAAA,CAAE,KAAK,CAAC,GAAA,KAAQ,IAAI,KAAK,CAAA;AAAA,IAC5D;AAAA,EACJ;AAAA,EAEA,mBAAmB,OAAA,EAA4C;AAxMnE,IAAA,IAAA,EAAA;AAyMQ,IAAA,MAAM,KAAA,GAAQ,IAAI,mBAAA,EAAoB;AAEtC,IAAA,IAAA,CAAI,EAAA,GAAA,OAAA,CAAQ,UAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,SAAA,QAAiB,UAAA,CAAW,OAAA,CAAQ,MAAM,SAAS,CAAA;AAEtE,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,OAAO,CAAA;AAChC,IAAA,KAAA,CAAM,UAAA,CAAW,QAAQ,MAAM,CAAA;AAC/B,IAAA,KAAA,CAAM,MAAM,CAAC,CAAA;AAEb,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,SAAS,OAAA,EAA0C;AAC/C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAC7C,IAAA,OAAO,IAAA,CAAK,sBAAsB,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AAtN9E,MAAA,IAAA,EAAA;AAuNY,MAAA,IAAA,CAAI,YAAO,KAAA,KAAP,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,QAAQ,OAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAC/C,MAAA,IAAI,OAAA,CAAQ,gBAAA,EAAkB,MAAM,IAAI,MAAM,WAAW,CAAA;AACzD,MAAA,OAAO,IAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,gBAAA,CAAiB,OAA4B,MAAA,EAAiB;AA7NlE,IAAA,IAAA,EAAA,EAAA,EAAA;AA8NQ,IAAA,MAAM,QAAA,GACF,qBACI,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,QAAA,KAAP,mBAAiB,WAAA,EAAA,KAAjB,IAAA,GAAA,EAAA,GAAkC,mBAAmB,KACzD,CAAA;AACJ,IAAC,KAAA,CAAM,MAAM,MAAA,CAAO,SAAS,EAAU,QAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EACjE;AAAA,EAEA,iBAAA,CACI,KAAA,EACA,MAAA,EACA,aAAA,GAAwB,OACxB,MAAA,EACF;AA1ON,IAAA,IAAA,EAAA,EAAA,EAAA;AA2OQ,IAAA,MAAM,QAAA,GACF,qBACI,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,QAAA,KAAP,mBAAiB,WAAA,EAAA,KAAjB,IAAA,GAAA,EAAA,GAAkC,mBAAmB,KACzD,CAAA;AACJ,IAAC,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,aAAA,EAAe,MAAM,CAAA,CACjD,QACJ,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,EAClB;AAAA,EAEA,YAAA,CAAa,OAA4B,OAAA,EAAuB;AAC5D,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,OAAO,CAAA;AAAA,IAC1C,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,oBAAA,CAAqB,OAAO,OAAO,CAAA;AAAA,IAC5C;AAAA,EACJ;AAAA,EAEA,kBAAA,CAAmB,OAA4B,OAAA,EAAuB;AA5P1E,IAAA,IAAA,EAAA,EAAA,EAAA;AA6PQ,IAAA,MAAM,qBAAoB,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,KAAA,KAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,OAAA,KAAf,YAA0B,EAAC;AACrD,IAAA,MAAM,yBAAyB,IAAA,CAAK,kBAAA;AAEpC,IAAA,MAAM,eAAA,GAAA,CAA4B,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAmB,MAAA,IAC/C,iBAAA,GACA,sBAAA;AACN,IAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAoB;AACjC,MAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,QAAA,CAAS,MAAA,CAAO,SAAS,CAAA;AACjE,MAAA,eAAA,IAAmB,CAAC,OAAA,CAAQ,OAAA,GACtB,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,MAAM,CAAA,GACnC,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,MAAM,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,oBAAA,CAAqB,OAA4B,OAAA,EAAuB;AACpE,IAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACtB,IAAA,IAAA,CAAK,qBAAA,CAAsB,OAAO,OAAO,CAAA;AAAA,EAC7C;AAAA,EAEA,qBAAA,CACI,KAAA,EACA,OAAA,EACA,SAAA,EACF;AArRN,IAAA,IAAA,EAAA;AAsRQ,IAAA,MAAM,mBAAmB,OAAA,CAAQ,OAAA;AACjC,IAAA,MAAM,iBAAA,GAAA,CAAA,CAAoB,EAAA,GAAA,OAAA,CAAQ,KAAA,KAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,YAAW,EAAC;AACrD,IAAA,MAAM,yBAAyB,IAAA,CAAK,kBAAA;AAEpC,IAAA,MAAM,eAAA,GAAA,CAAkB,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAmB,MAAA,IACrC,iBAAA,GACA,sBAAA;AAEN,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AACzD,MAAA,KAAA,CAAM,OAAA;AAAA,QACF,CAAC,QAAoC,KAAA,KAAkB;AACnD,UAAA,MAAM,iBAAA,GAAoB,IAAA,IAAQ,MAAA,IAAU,KAAA,IAAS,MAAA;AACrD,UAAA,IAAI,iBAAA,EAAmB;AACnB,YAAA,MAAM,UAAA,GAAa,iCACZ,OAAA,CAAA,EADY;AAAA,cAEf,OAAA,EAAS;AAAA,aACb,CAAA;AACA,YAAA,IAAA,CAAK,qBAAA,CAAsB,KAAA,EAAO,UAAA,EAAY,GAAG,CAAA;AAAA,UACrD,CAAA,MAAO;AACH,YAAA,MAAM,YAAA,GAAe,MAAA;AACrB,YAAA,MAAM,kBAAkB,eAAA,CAAgB,QAAA;AAAA,cACpC,YAAA,CAAa;AAAA,aACjB;AACA,YAAA,IAAI,MAAA;AACJ,YAAA,IAAI,SAAA,EAAW;AACX,cAAA,MAAA,GAAS;AAAA,gBACL,SAAA;AAAA,gBACA,gBAAgB,KAAA,KAAU,CAAA;AAAA,gBAC1B,eAAA,EAAiB,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS;AAAA,eAC9C;AAAA,YACJ;AAEA,YAAA,eAAA,IAAmB,CAAC,QAAQ,OAAA,GACtB,IAAA,CAAK,iBAAiB,KAAA,EAAO,YAAY,IACzC,IAAA,CAAK,iBAAA;AAAA,cACD,KAAA;AAAA,cACA,YAAA;AAAA,cACA,GAAA;AAAA,cACA;AAAA,aACJ;AAAA,UACV;AAAA,QACJ;AAAA,OACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,YAAA,CAAa,KAAA,EAA4B,OAAA,EAAc,SAAA,EAAoB;AACvE,IAAA,IAAI,mCAAS,MAAA,EAAQ;AACjB,MAAA,IAAI,SAAA,EAAW,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA;AACzC,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,SAAA,KAAc,MAAA,EAAQ;AACjC,QAAA,KAAA,CAAM,UAAA,EAAW;AAAA,MACrB,CAAA,MAAO;AACH,QAAA,KAAA,CAAM,SAAA,EAAU;AAAA,MACpB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,iBAAiB,GAAA,EAAc;AAC3B,IAAA,OACI,GAAA,KAAQ,QACR,OAAO,GAAA,KAAQ,YACf,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EAElC;AAAA,EAEA,qBAAqB,GAAA,EAAkC;AACnD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAClC,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,EACjD;AAAA,EAEA,qBAAqB,UAAA,EAAyC;AAC1D,IAAA,MAAM,aAAa,MAAA,CAAO,IAAA,CAAK,YAAY,QAAQ,CAAA,CAAE,SAAS,OAAO,CAAA;AACrE,IAAA,OAAO,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,MAAA,CACF,OAAA,EACA,IAAA,EACA,OAAA,EACY;AACZ,IAAA,MAAM,eAAc,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,aAAA,IACvB,EAAC,GACD,MAAM,KAAK,QAAA,CAAS;AAAA,MAChB;AAAA,KACH,CAAA;AAEP,IAAA,MAAM,OAAA,GAAe,kCACd,WAAA,CAAA,EACA,IAAA,CAAA;AAGP,IAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,OAAO,CAAA;AAE5C,IAAA,IAAI,mCAAS,kBAAA,EAAoB;AAC7B,MAAA,OAAO,CAAA;AAAA,IACX;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,MAAM,MAAA,CACF,cAAA,EACA,IAAA,EACiB;AACjB,IAAA,MAAM,UAAU,EAAC;AAEjB,IAAA,cAAA,CAAe,IAAI,CAAA,GAAA,KAAO;AACtB,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,SAAA,EAAW,GAAA,EAAK,KAAA,EAAQ,KAAa,GAAG,CAAA,EAAG,QAAA,EAAU,OAAA,EAAS,CAAA;AAAA,IACjF,CAAC,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,QAAA,CAAS;AAAA,MACpC;AAAA,KACH,CAAA;AAED,IAAA,MAAM,OAAA,GAAe,kCACd,WAAA,CAAA,EACA,IAAA,CAAA;AAGP,IAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,OAAO,CAAA;AAC5C,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,MAAM,MAAA,CACF,OAAA,EACA,OAAA,EACF;AACE,IAAA,IAAI,mCAAS,YAAA,EAAc;AACvB,MAAA,MAAM,KAAK,qBAAA,CAAsB,WAAA;AAAA,QAC7B;AAAA,OACJ;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,MAAM,GAAA,GAAO,OAAA,CAAsB,MAAA,CAAO,CAAC,KAAU,IAAA,KAAc;AAC/D,QAAA,MAAM,WAAW,IAAA,CAAK,SAAA;AACtB,QAAA,GAAA,CAAI,QAAQ,IAAI,IAAA,CAAK,KAAA;AACrB,QAAA,OAAO,GAAA;AAAA,MACX,CAAA,EAAG,EAAE,CAAA;AACL,MAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,MAAA,CAAO,GAAG,CAAA;AAAA,IAC/C;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAA,CACF,OAAA,EACA,OAAA,EACA,OAAA,EACY;AACZ,IAAA,IAAI;AACA,MAAA,OAAO,MAAM,eAAA,CAAA,IAAA,EAAK,8BAAA,EAAA,oCAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EACT,SACA,OAAA,EACA,OAAA,CAAA;AAAA,IAER,SAAS,KAAA,EAAY;AACjB,MAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,IACjC;AAAA,EACJ;AAAA;AAAA,EAuIA,WAAA,CAAY,OAAe,MAAA,EAA6B;AACpD,IAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,EAC7C;AACJ,CAAA;AAxhBO,8BAAA,GAAA,IAAA,OAAA,EAAA;AAgZG,oCAAA,GAAkC,eACpC,OAAA,EACA,OAAA,EACA,OAAA,EACF;AACE,EAAA,MAAM,cAAc,eAAA,CAAA,IAAA,EAAK,8BAAA,EAAA,6BAAA,CAAA,CAAL,WAAiC,EAAE,OAAA,IAAW,GAAA,EAAI;AACtE,EAAA,MAAM,cAAc,IAAA,CAAK,kBAAA;AAEzB,EAAA,MAAM,SAAA,GAAiB,eAAA,CAAA,IAAA,EAAK,8BAAA,EAAA,kCAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EACnB,WAAA,EACA,WAAA,CAAA;AAGJ,EAAA,MAAM,oBAAyB,EAAC;AAEhC,EAAA,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,MAAA,KAAmB;AAC7C,IAAA,MAAM,sBAAA,GACF,eAAA,CAAA,IAAA,EAAK,8BAAA,EAAA,4CAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EACI,OAAA,EACA,MAAA,CAAA;AAER,IAAA,iBAAA,CAAkB,KAAK,sBAAsB,CAAA;AAAA,EACjD,CAAC,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,cAAA,CAAA;AAAA,IACb,gBAAA,EAAkB,iBAAA,CAAkB,IAAA,CAAK,GAAG;AAAA,GAAA,EACzC,eAAA,CAAA,IAAA,EAAK,+DAAL,IAAA,CAAA,IAAA,EAAiC,OAAA,CAAA,CAAA;AAGxC,EAAA,MAAM,EAAE,yBAAA,EAA2B,wBAAA,EAAyB,GACxD,WAAA;AACJ,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,yBAAyB,CAAA,CAAE,SAAS,CAAA,EAAG;AACnD,IAAA,QAAA,CAAS,2BAA2B,CAAA,GAAI,cAAA,CAAA,cAAA,CAAA,EAAA,EACjC,yBAAA,CAAA,EACA,QAAA,CAAS,yBAAA,CAAA;AAAA,EAEpB;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,wBAAwB,CAAA,CAAE,SAAS,CAAA,EAAG;AAClD,IAAA,QAAA,CAAS,0BAA0B,CAAA,GAAI,cAAA,CAAA,cAAA,CAAA,EAAA,EAChC,wBAAA,CAAA,EACA,QAAA,CAAS,wBAAA,CAAA;AAAA,EAEpB;AACA,EAAA,IAAI,WAAA,CAAY,gBAAA;AACZ,IAAA,QAAA,CAAS,qBAAqB,IAAI,WAAA,CAAY,gBAAA;AAElD,EAAA,OAAO,KAAK,qBAAA,CAAsB,iBAAA;AAAA,IAC9B,SAAA;AAAA,IACA;AAAA,GACJ;AACJ,CAAA;AAEA,6BAAA,GAA2B,SAAC,OAAA,EAA4C;AAxe5E,EAAA,IAAA,EAAA;AAyeQ,EAAA,MAAM,KAAA,GAAQ,IAAI,mBAAA,EAAoB;AAEtC,EAAA,IAAA,CAAI,EAAA,GAAA,OAAA,CAAQ,UAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,SAAA,QAAiB,UAAA,CAAW,OAAA,CAAQ,MAAM,SAAS,CAAA;AACtE,EAAA,IAAA,CAAK,YAAA,CAAa,OAAO,OAAO,CAAA;AAEhC,EAAA,OAAO,KAAA;AACX,CAAA;AAEA,kCAAA,GAAgC,SAAC,aAAkB,WAAA,EAAkB;AACjE,EAAA,MAAM,YAAiB,EAAC;AAExB,EAAA,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,wBAAwB,CAAA,CAAE,OAAA;AAAA,IAC9C,CAAC,SAAA,KAAc;AACX,MAAA,MAAM,kBAAA,GAAqB,UACtB,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA,CACf,OAAA,CAAQ,KAAK,EAAE,CAAA;AACpB,MAAA,IAAI,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC1C,QAAA,MAAM,SAAA,GAAY,IAAI,kBAAkB,CAAA,CAAA,CAAA;AACxC,QAAA,SAAA,CAAU,kBAAkB,CAAA,GACxB,WAAA,CAAY,yBAAA,CAA0B,SAAS,CAAA;AACnD,QAAA,OAAO,WAAA,CAAY,0BAA0B,SAAS,CAAA;AACtD,QAAA,OAAO,WAAA,CAAY,yBAAyB,SAAS,CAAA;AAAA,MACzD;AAAA,IACJ;AAAA,GACJ;AAEA,EAAA,OAAO,SAAA;AACX,CAAA;AAEA,6BAAA,GAA2B,SAAC,OAAA,EAAoC;AAC5D,EAAA,MAAM,iBAAA,GAAyB;AAAA,IAC3B,cAAc,OAAA,CAAQ;AAAA,GAC1B;AAEA,EAAA,IAAI,OAAA,CAAQ,wBAAA;AACR,IAAA,iBAAA,CAAkB,2BACd,OAAA,CAAQ,wBAAA;AAChB,EAAA,IAAI,OAAA,CAAQ,yBAAA;AACR,IAAA,iBAAA,CAAkB,4BACd,OAAA,CAAQ,yBAAA;AAEhB,EAAA,OAAO,iBAAA;AACX,CAAA;AAEA,4CAAA,GAA0C,SACtC,SACA,UAAA,EACF;AACE,EAAA,MAAM,0BAA+B,EAAC;AAEtC,EAAA,OAAA,CAAQ,UAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,MAAA,KAAgB;AACzC,IAAA,QAAQ,UAAA;AAAY,MAChB,KAAK,wBAAA,CAAyB,MAAA;AAAA,MAC9B,KAAK,wBAAA,CAAyB,MAAA;AAC1B,QAAA,uBAAA,CAAwB,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAC7C,QAAA;AAAA,MAEJ,KAAK,wBAAA,CAAyB,GAAA;AAAA,MAC9B,KAAK,wBAAA,CAAyB,GAAA;AAC1B,QAAA;AACI,UAAA,IAAI,QAAA,GAAW,EAAA;AACf,UAAA,IAAI,cAAc,wBAAA,CAAyB,GAAA;AACvC,YAAA,QAAA,GAAW,GAAA;AACf,UAAA,uBAAA,CAAwB,IAAA;AAAA,YACpB,GAAG,MAAA,CAAO,IAAI,IAAI,QAAQ,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,WAC7C;AAAA,QACJ;AACA,QAAA;AAAA;AACR,EACJ,CAAC,CAAA;AAED,EAAA,MAAM,sBAAA,GAAyB,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,uBAAA,CAAwB,IAAA;AAAA,IACpE;AAAA,GACH,CAAA,CAAA;AAED,EAAA,OAAO,sBAAA;AACX,CAAA;;;ACljBJ,IAAM,YAAA,uBAAmB,GAAA,EAAU;AACnC,IAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,IAAI,0BAAA,GAA6B,KAAA;AAEjC,SAAS,wBAAA,GAAiC;AACtC,EAAA,IAAI,0BAAA,EAA4B;AAChC,EAAA,0BAAA,GAA6B,IAAA;AAE7B,EAAA,MAAM,OAAA,GAAU,OAAO,MAAA,KAAmB;AACtC,IAAA,MAAM,YAAY,YAAA,CAAa,IAAA;AAC/B,IAAA,MAAM,cAAc,cAAA,CAAe,IAAA;AACnC,IAAA,OAAA,CAAQ,GAAA;AAAA,MACJ,CAAA,mBAAA,EAAsB,MAAM,CAAA,mBAAA,EAAsB,SAAS,gBAAgB,WAAW,CAAA,aAAA;AAAA,KAC1F;AACA,IAAA,IAAI;AACA,MAAA,MAAM,aAAA,EAAc;AACpB,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AAAA,IAC3D,SAAS,GAAA,EAAK;AACV,MAAA,QAAA,CAAS,oCAAoC,GAAG,CAAA;AAAA,IACpD;AAAA,EACJ,CAAA;AACA,EAAA,OAAA,CAAQ,GAAG,SAAA,EAAW,MAAM,KAAK,OAAA,CAAQ,SAAS,CAAC,CAAA;AACnD,EAAA,OAAA,CAAQ,GAAG,QAAA,EAAU,MAAM,KAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACrD;AAEA,eAAsB,aAAA,GAA+B;AACjD,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,YAAY,CAAA;AAC9B,EAAA,YAAA,CAAa,KAAA,EAAM;AACnB,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,EAAK,CAAC,CAAA;AACxE,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,CAAA,KAAM;AAC3B,IAAA,IAAI,MAAA,CAAO,WAAW,UAAA,EAAY;AAC9B,MAAA,QAAA,CAAS,CAAA,KAAA,EAAQ,CAAC,CAAA,iBAAA,CAAA,EAAqB,MAAA,CAAO,MAAM,CAAA;AAAA,IACxD;AAAA,EACJ,CAAC,CAAA;AACL;AAEA,eAAsB,eAAA,GAAiC;AACnD,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,cAAc,CAAA;AAClC,EAAA,cAAA,CAAe,KAAA,EAAM;AACrB,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA;AAAA,IAC1B,QAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,KAAK;AAAA,GACxC;AACA,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,CAAA,KAAM;AAC3B,IAAA,IAAI,MAAA,CAAO,WAAW,UAAA,EAAY;AAC9B,MAAA,QAAA,CAAS,CAAA,OAAA,EAAU,CAAC,CAAA,iBAAA,CAAA,EAAqB,MAAA,CAAO,MAAM,CAAA;AAAA,IAC1D;AAAA,EACJ,CAAC,CAAA;AACL;AAEO,SAAS,aAAa,IAAA,EAAkB;AAC3C,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,IAAI;AACA,IAAA,YAAA,CAAa,IAAI,IAAI,CAAA;AACrB,IAAA,wBAAA,EAAyB;AAAA,EAC7B,SAAS,GAAA,EAAK;AACV,IAAA,QAAA,CAAS,yCAAyC,GAAG,CAAA;AACrD,IAAA,KAAK,IAAA,CACA,KAAI,CACJ,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA,CAAS,iCAAA,EAAmC,CAAC,CAAC,CAAA;AAChE,IAAA,MAAM,GAAA;AAAA,EACV;AACJ;AAEO,SAAS,eAAe,MAAA,EAAsB;AACjD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,IAAI;AACA,IAAA,cAAA,CAAe,IAAI,MAAM,CAAA;AACzB,IAAA,wBAAA,EAAyB;AAAA,EAC7B,SAAS,GAAA,EAAK;AACV,IAAA,QAAA,CAAS,6CAA6C,GAAG,CAAA;AACzD,IAAA,KAAK,MAAA,CACA,KAAI,CACJ,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA,CAAS,mCAAA,EAAqC,CAAC,CAAC,CAAA;AAClE,IAAA,MAAM,GAAA;AAAA,EACV;AACJ;AAEO,SAAS,iBAAiB,MAAA,EAAsB;AACnD,EAAA,IAAI;AACA,IAAA,cAAA,CAAe,OAAO,MAAM,CAAA;AAAA,EAChC,SAAS,GAAA,EAAK;AACV,IAAA,QAAA,CAAS,+BAA+B,GAAG,CAAA;AAAA,EAC/C;AACJ;;;AClFA,IAAqB,oBAArB,MAAuC;AAAA,EACnC,IAAI,gBAAA,GAAmB;AACnB,IAAA,MAAM,gBAAA,GACF,OAAA,CAAQ,GAAA,CAAI,kCAAA,IAAsC,EAAA;AACtD,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACN;AAAA,OACJ;AAAA,IACJ;AACA,IAAA,OAAO,gBAAA;AAAA,EACX;AAAA,EAEA,MAAM,SAAA,GAA6B;AAC/B,IAAA,MAAM,MAAA,GAAiB,IAAI,MAAA,CAAO;AAAA,MAC9B,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,kBAAkB,kBAAA;AAAmB,KACxC,CAAA;AACD,IAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,IAAA,cAAA,CAAe,MAAM,CAAA;AACrB,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,cAAc,MAAA,EAAsB;AAChC,IAAA,IAAI;AACA,MAAA,gBAAA,CAAiB,MAAM,CAAA;AAAA,IAC3B,SAAS,GAAA,EAAK;AACV,MAAA,QAAA,CAAS,8BAA8B,GAAG,CAAA;AAAA,IAC9C;AACA,IAAA,KAAK,MAAA,CACA,KAAI,CACJ,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA,CAAS,kCAAA,EAAoC,CAAC,CAAC,CAAA;AAAA,EACrE;AACJ,CAAA;;;AC/BA,IAAqB,eAArB,MAAkC;AAAA,EAG9B,YAAoB,IAAA,EAAe;AAAf,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAChB,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAI,iBAAA,EAAkB;AAAA,EACnD;AAAA,EAEA,MAAM,QAAA,CACF,SAAA,EACA,MAAA,EACyB;AACzB,IAAA,MAAM,MAAA,GAAoC,OAAO,IAAA,CAAK,IAAA,GAChD,IAAA,CAAK,KAAK,OAAA,EAAQ,GAClB,IAAA,CAAK,iBAAA,CAAkB,SAAA,EAAU,CAAA;AAEvC,IAAA,IAAI;AACA,MAAA,IAAI,OAAA,CAAQ,IAAI,QAAA,KAAa,aAAA;AACzB,QAAA,OAAA,CAAQ,IAAA,CAAK,qCAAqC,SAAS,CAAA;AAC/D,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAAM,WAAW,MAAM,CAAA;AACnD,MAAA,OAAO,MAAA;AAAA,IACX,CAAA,SAAE;AACE,MAAA,IAAI,KAAK,IAAA,EAAM;AACX,QAAA,MAAM,OAAO,OAAA,EAAQ;AAAA,MACzB,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,iBAAA,CAAkB,cAAc,MAAgB,CAAA;AAAA,MACzD;AAAA,IACJ;AAAA,EACJ;AACJ,CAAA;;;ACLA,IAAqB,uBAAA,GAArB,cAAwD,YAAA,CAAa;AAAA,EAEjE,WAAA,CAAY,aAAgC,UAAA,EAAqB;AAC7D,IAAA,KAAA,CAAM,UAAU,CAAA;AA6IpB,IAAA,IAAA,CAAQ,iBAAA,GAAoB,SAAU,KAAA,EAAY;AAC9C,MAAA,OAAO,IAAA,IAAQ,SAAS,KAAA,IAAS,KAAA;AAAA,IACrC,CAAA;AA9II,IAAA,IAAA,CAAK,UAAA,GAAa,WAAA;AAAA,EACtB;AAAA,EAEA,IAAI,QAAA,GAAW;AACX,IAAA,OAAO,IAAA,CAAK,WAAW,MAAA,IAAU,iBAAA;AAAA,EACrC;AAAA,EAEA,IAAI,SAAA,GAAY;AACZ,IAAA,OACI,YAAA,CAAa,KAAK,UAAA,CAAW,KAAA,EAAO,OAAO,CAAA,IAC3C,YAAA,CAAa,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AAAA,EAE1C;AAAA,EAEA,IAAI,eAAA,GAAkB;AA/C1B,IAAA,IAAA,EAAA;AAgDQ,IAAA,OAAA,CAAO,EAAA,GAAA,IAAA,CAAK,eAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAiB,eAAA;AAAA,EAC5B;AAAA,EAEA,gBAAA,CAAiB,UAA0B,KAAA,EAAuB;AAC9D,IAAA,IACI,0CACA,QAAA,KAAA,cAAA,qBACF;AACE,MAAA,OAAO,MAAM,KAAA,GAAQ,GAAA;AAAA,IACzB,WAAW,QAAA,KAAA,aAAA,oBAAyC;AAChD,MAAA,OAAO,KAAA,GAAQ,GAAA;AAAA,IACnB,CAAA,MAAO;AACH,MAAA,OAAO,KAAA;AAAA,IACX;AAAA,EACJ;AAAA,EAEQ,WAAA,CACJ,QAAA,EACA,SAAA,EACA,YAAA,EACA,KAAA,EACM;AArEd,IAAA,IAAA,EAAA;AAsEQ,IAAA,MAAM,cAAA,GAAiB,QAAQ,KAAK,CAAA;AACpC,IAAA,QAAA,GAAW,QAAA,GACJ,SAAS,WAAA,EAAY,GAAA,OAAA;AAE5B,IAAA,MAAM,gBAAA,GAAmB,6BAA6B,QAAQ,CAAA;AAE9D,IAAA,IAAI,CAAC,gBAAA;AACD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,QAAQ,CAAA,CAAE,CAAA;AAE9D,IAAA,IAAI,QAAA;AACJ,IAAA,MAAM,cAAA,GAAiB,MAAM,SAAS,CAAA;AACtC,IAAA,MAAM,eAAe,CAAC,CAAC,IAAA,CAAK,UAAA,CAAW,QAAQ,SAAS,CAAA;AACxD,IAAA,MAAM,aACF,YAAA,KAAA,CAAgB,EAAA,GAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,SAAS,MAAjC,IAAA,GAAA,MAAA,GAAA,EAAA,CAAoC,IAAA,CAAA;AAExD,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC3B,MAAA,MAAM,gBAAgB,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAEtD,MAAA,QAAA,GAAW,CAAA,EAAA,EAAK,SAAS,CAAA,OAAA,EAAU,aAAa,CAAA,GAAA,CAAA;AAChD,MAAA,IAAI,SAAS,IAAA,EAAM;AACf,QAAA,MAAM,mBAAA,GACF,IAAA,CAAK,gCAAA,CAAiC,KAAK,CAAA;AAC/C,QAAA,QAAA,IAAY,KAAK,mBAAmB,CAAA,CAAA;AAAA,MACxC;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,QAAA,GAAW,YAAA,GACL,cAAA,GACA,CAAA,qBAAA,EAAwB,SAAS,CAAA,EAAA,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAI,QAAA,KAAA,IAAA,WAAgC;AAChC,MAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACrC,MAAM,GAAA,CAAI,OAAO,CAAA,GACjB,CAAC,cAAc,CAAA;AACrB,MAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,gBAAgB,KAAK,eAAA,CAAgB,IAAA;AAAA,QACvD;AAAA,OACH,CAAA,CAAA,CAAA;AAAA,IACL;AAEA,IAAA,IAAI,QAAA,KAAA,SAAA,gBAAqC;AACrC,MAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,KAAA,EAAQ,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,IACtE;AAKA,IAAA,IAAI,QAAA,KAAA,WAAA,oBAAyC,UAAU,IAAA,EAAM;AACzD,MAAA,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAA,EAAI,OAAA;AAAA,QACvC;AAAA,OACH,OAAO,QAAQ,CAAA,SAAA,CAAA;AAAA,IACpB;AAEA,IAAA,IACI,4CACA,QAAA,KAAA,OAAA,cACF;AACE,MAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAA;AAAA,IAC1C;AAEA,IAAA,IAAA,CACK,QAAA,KAAA,UAAA,mBACG,QAAA,KAAA,cAAA,wBACJ,UAAA,KAAe,OAAA,EACjB;AACE,MAAA,MAAM,cACF,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAI,KAAK,CAAA,CAAA,CAAA;AACjD,MAAA,IAAI,YAAA,GAAe,CAAA,EAAG,WAAW,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,CAAA;AAEnD,MAAA,IAAI,QAAA,KAAA,cAAA,qBAA0C;AAC1C,QAAA,IAAI,UAAU,IAAA,EAAM;AAChB,UAAA,YAAA,GAAe,SAAS,YAAY,CAAA,EAAA,CAAA;AAAA,QACxC,CAAA,MAAO;AACH,UAAA,YAAA,GAAe,CAAA,MAAA,EAAS,YAAY,CAAA,KAAA,EAAQ,QAAQ,CAAA,SAAA,CAAA;AAAA,QACxD;AAAA,MACJ;AACA,MAAA,OAAO,YAAA;AAAA,IACX;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,KAAK,CAAA;AAC3D,IAAA,OAAO,GAAG,QAAQ,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAA,EAAI,OAAA,CAAQ,aAAa,CAAC,CAAA,CAAA;AAAA,EACpE;AAAA,EAEQ,iBAAA,CACJ,SACA,aAAA,EACM;AACN,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACxB,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC1C,QAAA,OAAO,IAAA,CAAK,WAAA;AAAA,UACR,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,SAAA;AAAA,UACP,MAAA,CAAO,YAAA;AAAA,UACP,MAAA,CAAO;AAAA,SACX;AAAA,MACJ,CAAC,CAAA;AACD,MAAA,OAAO,aAAA,CAAc,IAAA;AAAA,QACjB,IAAI,aAAA,IAAA,IAAA,GAAA,aAAA,GAAA,KAAA,WAA2C,CAAA;AAAA,OACnD;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,IAC1C;AAAA,EACJ;AAAA,EAMA,mBAAmB,OAAA,EAA+C;AAC9D,IAAA,IAAI,aAAA,GAAwB,EAAA;AAC5B,IAAA,IAAI,aAAA,GAAgB,IAAA;AAEpB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAChD,MAAA,IAAI,CAAC,aAAA,EAAe;AAChB,QAAA,aAAA,IAAiB,GAAA,KAAQ,QAAQ,OAAA,GAAU,MAAA;AAAA,MAC/C;AAEA,MAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC/B,QAAA,aAAA,IAAiB,GAAA;AACjB,QAAA,aAAA,IAAiB,IAAA,CAAK,kBAAA;AAAA,UAClB;AAAA,SACJ;AACA,QAAA,aAAA,IAAiB,GAAA;AAAA,MACrB,CAAA,MAAO;AACH,QAAC,KAAA,CAAoB,OAAA,CAAQ,CAAC,MAAA,KAAoB;AAC9C,UAAA,IAAI,MAAA,GAAS,EAAA;AACb,UAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA,EAAG;AAChC,YAAA,MAAA,GAAS,IAAI,IAAA,CAAK,kBAAA;AAAA,cACd;AAAA,aACH,CAAA,CAAA,CAAA;AAAA,UACL,CAAA,MAAO;AACH,YAAA,MAAA,GAAS,IAAA,CAAK,WAAA;AAAA,cACV,MAAA,CAAO,QAAA;AAAA,cACP,MAAA,CAAO,SAAA;AAAA,cACP,MAAA,CAAO,YAAA;AAAA,cACP,MAAA,CAAO;AAAA,aACX;AAAA,UACJ;AACA,UAAA,aAAA,IAAiB,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAA;AAAA,QACrC,CAAC,CAAA;AAAA,MACL;AAEA,MAAA,aAAA,GAAgB,KAAA;AAAA,IACpB;AAEA,IAAA,aAAA,GAAgB,aAAA,CAAc,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA;AAC3D,IAAA,OAAO,aAAA;AAAA,EACX;AAAA,EAEQ,kBAAkB,IAAA,EAAwB;AAC9C,IAAA,OAAO,GAAG,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,EAAI,KAAK,SAAA,IAAA,KAAA,WAAgC,CAAA;AAAA,EACzE;AAAA,EAEQ,mBAAmB,YAAA,EAAkC;AACzD,IAAA,IAAI;AACA,MAAA,OAAO,aAAa,GAAA,CAAI,IAAA,CAAK,iBAAiB,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IAC7D,SAAS,KAAA,EAAO;AACZ,MAAA,OAAO,EAAA;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,YAAY,KAAA,EAAc;AACtB,IAAA,MAAM,aAAA,GAAgB,OAAO,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA;AAC1C,IAAA,IAAI,aAAA,EAAe;AACf,MAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IAC9B,CAAA,MAAO;AACH,MAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IACvD;AAAA,EACJ;AAAA,EAEA,YAAY,KAAA,EAAY;AACpB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtB,MAAA,IAAI,EAAC,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,MAAA,CAAA,EAAQ,OAAO,IAAA;AAC3B,MAAA,MAAM,aAAA,GAAgB,OAAO,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA;AAC1C,MAAA,IAAI,aAAA,EAAe;AACf,QAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,MAC9B,CAAA,MAAO;AACH,QAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAa,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,MAC5D;AAAA,IACJ;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,MAAM,cAAc,IAAA,EAA2B;AAC3C,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AAChC,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,IAAA,KACrB,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAC;AAAA,KACjD;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAA;AAAA,MACV,CAAA,YAAA,EAAe,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA;AAAA,QACnC,IAAA,CAAK;AAAA,OACR,CAAA,4BAAA,CAAA;AAAA,MACD,IAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC9B;AAAA,EAEQ,oBACJ,OAAA,EACO;AACP,IAAA,MAAM,sBACF,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAA,CAAK,mCAAS,MAAA,IAAS,CAAA;AAChD,IAAA,MAAM,uBAAA,GAA0B,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AAC9D,IAAA,OAAO,mBAAA,IAAuB,uBAAA;AAAA,EAClC;AAAA,EAEQ,0BAAA,CACJ,OACA,OAAA,EACF;AACE,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAErB,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA,EAAG;AACnC,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AACnD,MAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,cAAA,EAAgB,YAAY,CAAA;AAAA,IACrD;AAAA,EACJ;AAAA,EAEQ,iBAAA,CACJ,OACA,OAAA,EACM;AACN,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAErB,IAAA,IAAI,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAChC,MAAA,KAAA,IAAS,CAAA,OAAA,EAAU,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAC,CAAA,CAAA;AACtD,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,iBAAA,CAAkB,OAAe,OAAA,EAA8B;AAC3D,IAAA,IAAI,SAAS,KAAA,IAAS,CAAA,UAAA,EAAa,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AACnE,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEQ,oBAAA,CACJ,OACA,UAAA,EACM;AACN,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,UAAA;AACxB,MAAA,IAAI,KAAA,EAAO,KAAA,IAAS,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AACnC,MAAA,IAAI,IAAA,EAAM,KAAA,IAAS,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEQ,eAAA,CACJ,iBAAA,EACA,MAAA,GAAmB,EAAC,EACtB;AACE,IAAA,IAAI,iBAAA;AACA,MAAA,OAAO,CAAA,KAAA,EAAQ,iBAAiB,CAAA,oBAAA,EAAuB,qBAAA;AAAA,QACnD;AAAA,OACH,CAAA,CAAA,CAAA;AACL,IAAA,IAAI,EAAC,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,MAAA,CAAA,EAAQ,OAAO,GAAA;AAE5B,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEQ,YAAY,MAAA,EAA4B;AAC5C,IAAA,MAAM,oBAA8B,MAAA,CAAO,IAAA;AAAA,MACvC,KAAK,UAAA,CAAW;AAAA,KACpB;AACA,IAAA,MAAM,aAAuB,MAAA,CACxB,MAAA,CAAO,CAAC,KAAA,KAAU,kBAAkB,OAAA,CAAQ,KAAK,CAAA,KAAM,EAAE,EACzD,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAEhC,IAAA,MAAA,CACK,MAAA,CAAO,CAAC,KAAA,KAAU,iBAAA,CAAkB,OAAA,CAAQ,KAAK,CAAA,KAAM,EAAE,CAAA,CACzD,OAAA,CAAQ,CAAC,KAAA,KAAU;AAChB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,oBAAA,EAAuB,KAAK,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IACjE,CAAC,CAAA;AACL,IAAA,OAAO,UAAA;AAAA,EACX;AAAA,EAEQ,mBAAmB,OAAA,EAAmC;AAC1D,IAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,KAAA,EAAO,SAAQ,KAAM;AAC3D,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,OAAO,CAAA;AAChE,MAAA,OAAO,CAAA,EAAG,KAAK,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,CAAA;AAAA,IACpC,CAAC,CAAA;AACD,IAAA,OAAO,WAAA;AAAA,EACX;AAAA,EAEA,iBAAiB,OAAA,EAAkC;AAC/C,IAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,IAAA,IAAI,mCAAS,MAAA,EAAQ;AACjB,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AACnD,MAAA,aAAA,GAAgB,OAAA,GAAU,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,aAAA;AAAA,EACX;AAAA,EAEA,YAAA,GAAe;AACX,IAAA,OAAO,IAAA,CAAK,eAAA,GACN,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,GACpB,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,WAAA,CAAY,OAAA,GAAwB,EAAC,EAAiB;AACxD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,OAAO,CAAA;AAC3D,IAAA,IAAI,KAAA,GAAQ,UAAU,IAAA,CAAK,eAAA;AAAA,MACvB,OAAA,CAAQ,iBAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACX,CAAA,MAAA,EAAS,IAAA,CAAK,YAAA,EAAc,CAAA,CAAA;AAC7B,IAAA,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AACrD,IAAA,IAAI,CAAC,QAAQ,iBAAA,EAAmB;AAC5B,MAAA,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AACrD,MAAA,KAAA,GAAQ,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,OAAA,CAAQ,UAAU,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,aAAA,EAAe;AACf,MAAA,KAAA,GAAQ,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,IACrC;AACA,IAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG,IAAA;AAAA,EACxC;AAAA,EAEA,cAAc,KAAA,EAAoB;AAC9B,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtB,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,MAAA,MAAM,cAAA,GAAiB,KAAA,CAClB,GAAA,CAAI,CAAC,IAAA,KAAS;AACX,QAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC1B,UAAA,OAAO,IAAI,IAAI,CAAA,CAAA,CAAA;AAAA,QACnB,CAAA,MAAA,IAAW,OAAO,IAAA,KAAS,QAAA,EAAU;AACjC,UAAA,OAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,QAC9B,CAAA,MAAO;AACH,UAAA,OAAO,IAAA;AAAA,QACX;AAAA,MACJ,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AAEb,MAAA,OAAO,IAAA,CAAK,UAAU,cAAc,CAAA;AAAA,IACxC,CAAA,MAAO;AACH,MAAA,OAAO,QAAQ,KAAK,CAAA;AAAA,IACxB;AAAA,EACJ;AAAA,EAEA,MAAM,aAAA,CACF,OAAA,EACA,IAAA,EACyB;AACzB,IAAA,IAAI,QAAQ,CAAA,OAAA,EAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA;AAAA,MAC1C,IAAA,CAAK;AAAA,KACR,CAAA,IAAA,CAAA;AAED,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC7D,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA;AAC/C,MAAA,OAAO,CAAA,EAAG,KAAA,CAAM,GAAG,CAAC,MAAM,OAAO,CAAA,CAAA;AAAA,IACrC,CAAC,CAAA;AACD,IAAA,KAAA,IAAS,CAAA,CAAA,EAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAErC,IAAA,KAAA,IAAS,SAAA;AACT,IAAA,KAAA,IAAS,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAEvC,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,aAAA,CACF,cAAA,EACA,IAAA,EACY;AACZ,IAAA,MAAM,aAAA,GAAA,CAAiB,iDAAgB,MAAA,KACnC,MAAA,CAAO,QAAQ,IAAW,CAAA,CACzB,MAAA,CAAO,CAAC,CAAC,GAAG,MAAM,CAAC,cAAA,CAAe,QAAA,CAAS,GAAG,CAAC,CAAA,CAC/C,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACnB,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA;AAC/C,MAAA,OAAO,CAAA,EAAG,KAAA,CAAM,GAAG,CAAC,MAAM,OAAO,CAAA,CAAA;AAAA,IACrC,CAAC,KAAM,EAAC;AAEZ,IAAA,IAAI,EAAC,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,MAAA,CAAA;AAChB,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,CAAC,IAAI,CAAC,CAAA;AAEpC,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,IAAW,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,KAAQ,KAAK,WAAA,CAAa,IAAA,CAAa,GAAG,CAAC,CAAC,CAAA;AAE5E,IAAA,IAAI,QAAQ,MAAA,CAAO,CAAA,YAAA,EAAe,MAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA;AAAA,MAClD,IAAA,CAAK;AAAA,KACR,CAAA,gDAAA,CAAA,EAAoD,WAAA,EAAa,MAAA,EAAQ,cAAc,CAAA;AAE5F,IAAA,KAAA,IAAS,CAAA,CAAA,EAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,aAAA,CAAA;AAErC,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC9B;AAAA,EAEQ,iCACJ,YAAA,EACM;AACN,IAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,GAAA,CAAI,CAAC,WAAA,KAAgB;AACpD,MAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,iBAAA,CAAkB,WAAW,CAAC,CAAA,CAAA,CAAA;AAAA,IAClD,CAAC,CAAA;AACD,IAAA,OAAO,aAAA,CAAc,KAAK,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,aAAA,CACF,OAAA,EACA,eAAA,GAA2B,KAAA,EACF;AACzB,IAAA,IAAI,QAAQ,CAAA,YAAA,EAAe,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA;AAAA,MAC/C,IAAA,CAAK;AAAA,KACR,CAAA,CAAA;AACD,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,KAAA,IAAS,SAAA;AAET,MAAA,IAAI,eAAA,EAAiB;AACjB,QAAA,KAAA,IAAS,IAAA,CAAK,gCAAA;AAAA,UACV;AAAA,SACJ;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,KAAA,IAAS,IAAA,CAAK,iBAAA;AAAA,UACV;AAAA,SACJ;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC9B;AAAA,EAEA,KAAA,CAAM,WAAmB,MAAA,EAAgB;AACrC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAa,uBAAA,CAET,OAAA,EACA,OAAA,EACA,OAAA,GAA8C,EAAC,EACjD;AACE,IAAA,IAAI,QAAQ,CAAA,OAAA,EAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA;AAAA,MAC1C,IAAA,CAAK;AAAA,KACR,CAAA,IAAA,CAAA;AAED,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,EAAC;AAC5B,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,EAAC;AAC5B,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,CAAW,OAAA;AAEhC,IAAA,MAAM,YAAY,IAAA,CAAK,mCAAA;AAAA,MACnB,GAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,wBAAA,CAAyB;AAAA,KAC7B;AACA,IAAA,MAAM,YAAY,IAAA,CAAK,mCAAA;AAAA,MACnB,GAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,wBAAA,CAAyB;AAAA,KAC7B;AAEA,IAAA,MAAM,qBAAA,GAA6B,SAAA,CAAU,MAAA,CAAO,SAAS,CAAA;AAE7D,IAAA,MAAM,gBAAqB,EAAC;AAC5B,IAAA,MAAM,yBAA8B,EAAC;AACrC,IAAA,MAAM,iBAAsB,EAAC;AAE7B,IAAA,qBAAA,CAAsB,OAAA,CAAQ,CAAC,UAAA,KAAoB;AAC/C,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,eAAA,EAAiB,UAAA,EAAY,gBAAe,GAC7D,UAAA;AAGJ,MAAA,IAAI,cAAA,EAAgB;AAChB,QAAA,cAAA,CAAe,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,gBAAgB,CAAA;AAAA,MACvD;AAEA,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,cAAA,EAAgB;AACvC,QAAA,MAAM,WAAW,IAAA,CAAK,6BAAA;AAAA,UAClB,IAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,YACI,eAAA;AAAA,YACA;AAAA;AACJ,SACJ;AACA,QAAA,MAAM,aAAqB,QAAA,CAAS,UAAA;AACpC,QAAA,IAAI,CAAC,sBAAA,CAAuB,UAAU,CAAA,EAAG;AACrC,UAAA,sBAAA,CAAuB,UAAU,CAAA,GAAI,CAAC,QAAQ,CAAA;AAAA,QAClD,CAAA,MAAO;AACH,UAAA,sBAAA,CAAuB,UAAU,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AAAA,QACpD;AAAA,MACJ,CAAA,MAAA,IAAW,CAAC,cAAA,EAAgB;AACxB,QAAA,IAAI,QAAA;AACJ,QAAA,IAAI,UAAA,GAAa,IAAA;AACjB,QAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,QAAA,IAAI,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAE/C,QAAA,IAAI,aAAa,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,IAAA;AACzB,QAAA,IAAI,CAAC,UAAA,EAAY;AACb,UAAA,cAAA,GAAiB,IAAA;AACjB,UAAA,UAAA,GAAa,cAAA;AACb,UAAA,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAC3C,UAAA,IAAA,CAAI,iCAAQ,IAAA,KAAQ,MAAA;AAChB,YAAA,MAAM,uCAAuC,IAAI,CAAA,2BAAA,CAAA;AAErD,UAAA,UAAA,GAAa,KAAA,CAAM,QAAQ,KAAK,CAAA,GAAI,UAChC,OAAO,KAAA,IAAS,WAAW,QAAA,GAC3B,SAAA;AAAA,QACR;AAEA,QAAA,QAAQ,UAAA;AAAY,UAChB,KAAK,QAAA;AACD,YAAA;AACI,cAAA,MAAM,eAAA,GAAkB,GAAG,IAAA,CAAK,SAAA;AAAA,gBAC5B;AAAA,eACJ,CAAE,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA;AACrB,cAAA,QAAA,GAAW,IAAI,eAAe,CAAA,QAAA,CAAA;AAAA,YAClC;AACA,YAAA;AAAA,UACJ,KAAK,OAAA;AACD,YAAA,QAAA,GAAW,CAAA,MAAA,EAAS,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAAA;AAClC,YAAA;AAAA,UACJ;AACI,YAAA,QAAA,GAAW,QAAQ,KAAK,CAAA;AACxB,YAAA;AAAA;AAGR,QAAA,IAAI,cAAA,EAAgB;AAChB,UAAA,QAAA,GAAW,aAAa,KAAA,CAAM,UAAU,CAAC,CAAA,IAAA,EAAO,IAAI,OAAO,QAAQ,CAAA,OAAA,CAAA;AAAA,QACvE;AAEA,QAAA,aAAA,CAAc,KAAK,CAAA,EAAG,KAAA,CAAM,UAAU,CAAC,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC3D;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,8BAAA;AAAA,MACD,sBAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,sBAAsB,CAAA,CAAE,SAAS,CAAA,EAAG;AAChD,MAAA,MAAA,CAAO,IAAA,CAAK,sBAAsB,CAAA,CAAE,OAAA,CAAQ,CAAC,UAAA,KAAe;AACxD,QAAA,MAAM,oBAAoB,IAAA,CAAK,oBAAA;AAAA,UAC3B,uBAAuB,UAAU,CAAA;AAAA,UACjC;AAAA,SACJ;AAEA,QAAA,aAAA,CAAc,IAAA,CAAK,CAAA,EAAG,UAAU,CAAA,GAAA,EAAM,iBAAiB,CAAA,CAAE,CAAA;AAAA,MAC7D,CAAC,CAAA;AAAA,IACL;AAGA,IAAA,IAAA,CAAK,qCAAA;AAAA,MACD,cAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,KAAA,IAAS,CAAA,CAAA,EAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAErC,IAAA,KAAA,IAAS,SAAA;AACT,IAAA,KAAA,IAAS,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAEvC,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC9B;AAAA,EAEQ,qCAAA,CACJ,gBACA,aAAA,EACF;AACE,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC3B,MAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,aAAA,KAAuB;AAC3C,QAAA,IAAI,OAAO,aAAA,CAAc,KAAA,IAAS,QAAA,EAAU;AACxC,UAAA,MAAM,WAAW,IAAA,CAAK,oBAAA;AAAA,YAClB,cAAc,KAAA,CAAM,cAAA;AAAA,YACpB;AAAA,WACJ;AACA,UAAA,aAAA,CAAc,IAAA;AAAA,YACV,GAAG,KAAA,CAAM,aAAA,CAAc,IAAI,CAAC,MAAM,QAAQ,CAAA;AAAA,WAC9C;AAAA,QACJ,CAAA,MAAO;AACH,UAAA,aAAA,CAAc,IAAA;AAAA,YACV,GAAG,KAAA,CAAM,aAAA,CAAc,IAAI,CAAC,CAAA,GAAA,EAAM,cAAc,KAAK,CAAA;AAAA,WACzD;AAAA,QACJ;AAAA,MACJ,CAAC,CAAA;AAAA,IACL;AAAA,EACJ;AAAA,EAEQ,8BAAA,CACJ,wBACA,cAAA,EACF;AACE,IAAA,MAAA,CAAO,IAAA,CAAK,sBAAsB,CAAA,CAAE,OAAA,CAAQ,CAAC,WAAA,KAAqB;AAC9D,MAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,aAAA,EAAoB,KAAA,KAAkB;AAC1D,QAAA,MAAM,UAAA,GAAa,CAAA,CAAA,EAAI,aAAA,CAAc,IAAI,CAAA,CAAA,CAAA;AACzC,QAAA,IAAI,eAAe,WAAA,EAAa;AAC5B,UAAA,sBAAA,CAAuB,WAAW,CAAA,CAAE,IAAA,CAAK,aAAA,CAAA,cAAA,CAAA,EAAA,EAClC,aAAA,CAAA,EADkC;AAAA,YAErC,cAAA,EAAgB;AAAA,WACpB,CAAC,CAAA;AACD,UAAA,OAAO,eAAe,KAAK,CAAA;AAAA,QAC/B;AAAA,MACJ,CAAC,CAAA;AAAA,IACL,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,oBAAA,CACJ,oBACA,YAAA,EACF;AACE,IAAA,IAAI,iBAAA,GAAoB,EAAA;AACxB,IAAA,kBAAA,CAAmB,OAAA,CAAQ,CAAC,UAAA,EAAiB,KAAA,KAAkB;AAC3D,MAAA,IAAI,iBAAA,GAAoB,YAAA;AACxB,MAAA,IAAI,EAAE,UAAA,EAAY,QAAA,EAAS,GAAI,UAAA;AAE/B,MAAA,IAAI,WAAW,cAAA,EAAgB;AAC3B,QAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,KAAA,CAAM,cAAA,CAAe,CAAC,CAAA;AACxD,QAAA,iBAAA,GAAoB,cAAA,CAAe,YAAA;AACnC,QAAA,QAAA,GAAW,cAAA,CAAe,QAAA;AAC1B,QAAA,UAAA,GAAa,cAAA,CAAe,UAAA;AAAA,MAChC;AACA,MAAA,IAAI,UAAU,CAAA,EAAG;AACb,QAAA,iBAAA,GAAoB,CAAA,EAAG,iBAAiB,CAAA,CAAA,EAAI,UAAU,IAAI,QAAQ,CAAA,CAAA,CAAA;AAAA,MACtE,CAAA,MAAO;AACH,QAAA,iBAAA,GAAoB,CAAA,EAAG,iBAAiB,CAAA,CAAA,EAAI,iBAAiB,IAAI,QAAQ,CAAA,CAAA,CAAA;AAAA,MAC7E;AAAA,IACJ,CAAC,CAAA;AACD,IAAA,OAAO,iBAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,mBAAmB,KAAA,EAAY;AACnC,IAAA,MAAM,eAAA,GACF,OAAO,KAAA,IAAS,QAAA,GACV,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,GAC5C,KAAA;AACV,IAAA,OAAO,eAAA;AAAA,EACX;AAAA,EAEQ,6BAAA,CACJ,IAAA,EACA,KAAA,EACA,OAAA,EACF;AACE,IAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,KAAK,CAAA;AACvC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACnC,IAAA,MAAM,UAAA,GAAa,aAAa,CAAC,CAAA;AACjC,IAAA,MAAM,EAAE,eAAA,EAAiB,UAAA,EAAW,GAAI,OAAA;AAExC,IAAA,MAAM,iBAAiB,YAAA,CAAa,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AACrD,IAAA,MAAM,eAAA,GAAkB,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,OAAA;AAAA,MAC9C,IAAA;AAAA,MACA;AAAA,KACH,CAAA,CAAA,CAAA;AAED,IAAA,IAAI,UAAA,IAAc,yBAAyB,GAAA,EAAK;AAC5C,MAAA,IAAI,OAAO,KAAA,IAAS,QAAA,IAAY,CAAC,KAAA,CAAM,KAAK,CAAA,EAAG;AAC3C,QAAA,MAAM,UAAA,GAAa;AAAA,UACf,QAAA,EAAU,KAAK,cAAc,CAAA,uBAAA,EAA0B,UAAU,CAAA,KAAA,EAAQ,cAAc,qBAAqB,eAAe,CAAA,CAAA,CAAA;AAAA,UAC3H,UAAA,EAAY,IAAI,UAAU,CAAA,CAAA;AAAA,SAC9B;AACA,QAAA,OAAO,UAAA;AAAA,MACX;AAAA,IACJ;AACA,IAAA,OAAO;AAAA,MACH,UAAU,CAAA,EAAA,EAAK,cAAc,CAAA,GAAA,EAAM,eAAe,IAAI,eAAe,CAAA,CAAA;AAAA,MACrE,UAAA,EAAY,IAAI,UAAU,CAAA,CAAA;AAAA,KAC9B;AAAA,EACJ;AAAA,EAEQ,yBAAA,CAA0B,YAAoB,UAAA,EAAoB;AACtE,IAAA,MAAM,eAAA,GAAkB,0BAAA;AACxB,IAAA,MAAM,gBAAA,GAAmB,cAAA;AAEzB,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,eAAe,KAAK,EAAC;AACxD,IAAA,MAAM,WAAA,GAAc,UAAU,CAAC,CAAA;AAE/B,IAAA,IAAI,WAAA,EAAa;AACb,MAAA,MAAM,mBAAA,GAAsB,YACvB,KAAA,CAAM,gBAAA,CAAiB,QAAQ,EAAE,CAAA,CACjC,MAAM,GAAG,CAAA;AACd,MAAA,MAAM,UAAA,GAAa;AAAA,QACf,cAAA,EAAgB,WAAA;AAAA,QAChB,IAAA,EAAM,mBAAA,CAAoB,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,QAClC,KAAA,EAAO,oBAAoB,KAAA,CAAM,CAAC,EAAE,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AAAA,QACnD,gBAAA,EAAkB,IAAA;AAAA,QAClB,YAAA,EAAc,EAAA;AAAA,QACd,cAAA,EAAgB,CAAC,EAAE;AAAA,OACvB;AACA,MAAA,IAAI,cAAc,OAAA,EAAS;AACvB,QAAA,UAAA,CAAW,cAAc,CAAA,GACrB,IAAA,CAAK,oBAAA,CAAqB,UAAU,CAAA;AAAA,MAC5C,CAAA,MAAO;AACH,QAAA,UAAA,CAAW,gBAAgB,CAAA,GACvB,IAAA,CAAK,oBAAA,CAAqB,UAAU,CAAA;AAAA,MAC5C;AACA,MAAA,OAAO,UAAA;AAAA,IACX;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,qBAAqB,MAAA,EAAa;AACtC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACvC,IAAA,MAAM,UAAA,GAAa,UAAU,KAAA,EAAM;AACnC,IAAA,OAAO,CAAA,cAAA,EAAiB,UAAU,CAAA,EAAA,EAAK,MAAA,CAAO,KAAK,CAAA,CAAA,CAAA;AAAA,EACvD;AAAA,EAEQ,qBAAqB,MAAA,EAAa;AACtC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACvC,IAAA,MAAM,UAAA,GAAa,UAAU,KAAA,EAAM;AACnC,IAAA,MAAM,OAAA,GAAU;AAAA,MACZ,kBAAkB,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,gBAAA;AAAA,MAC1B,YAAA,EACI,UAAU,MAAA,IAAU,KAAA,CAAM,QAAQ,SAAS,CAAA,GAAI,YAAY;AAAC,KACpE;AACA,IAAA,MAAM,yBACF,IAAA,CAAK,wCAAA;AAAA,MACD,UAAA;AAAA,MACA,MAAA,CAAO,KAAA;AAAA,MACP;AAAA,KACJ;AAEJ,IAAA,OAAO,sBAAA;AAAA,EACX;AAAA,EAEQ,wCAAA,CACJ,UAAA,EACA,KAAA,EACA,OAAA,EACF;AACE,IAAA,MAAM,yBAAyB,EAAC;AAChC,IAAA,IAAI,YAAA,GAAe,GAAA;AACnB,IAAA,IAAI,OAAA,CAAQ,oBAAoB,IAAA,EAAM;AAClC,MAAA,OAAA,CAAQ,YAAA,CAAa,KAAK,GAAG,CAAA;AAC7B,MAAA,YAAA,GAAe,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA;AAAA,IAChD;AACA,IAAA,IAAI;AACA,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAEpC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC5B,QAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,UAAA,KAAe;AAChC,UAAA,UAAA,GACI,OAAO,UAAA,IAAc,QAAA,GACf,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAA,GACd,UAAA;AACV,UAAA,sBAAA,CAAuB,IAAA,CAAK;AAAA,YACxB,QAAA,EAAU,CAAA,EAAA,EAAK,YAAY,CAAA,IAAA,EAAO,IAAA,CAAK,kBAAA;AAAA,cACnC;AAAA,aACH,CAAA,CAAA,CAAA;AAAA,YACD,UAAA,EAAY,IAAI,UAAU,CAAA,CAAA,CAAA;AAAA,YAC1B,YAAA,EAAc;AAAA,WACjB,CAAA;AAAA,QACL,CAAC,CAAA;AAAA,MACL,CAAA,MAAO;AACH,QAAA,sBAAA,CAAuB,IAAA,CAAK;AAAA,UACxB,QAAA,EAAU,CAAA,EAAA,EAAK,YAAY,CAAA,IAAA,EAAO,IAAA,CAAK,kBAAA;AAAA,YACnC;AAAA,WACH,CAAA,CAAA,CAAA;AAAA,UACD,UAAA,EAAY,IAAI,UAAU,CAAA,CAAA,CAAA;AAAA,UAC1B,YAAA,EAAc;AAAA,SACjB,CAAA;AAAA,MACL;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,sBAAA,CAAuB,IAAA,CAAK;AAAA,QACxB,QAAA,EAAU,CAAA,EAAA,EAAK,YAAY,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,CAAA;AAAA,QACvC,UAAA,EAAY,IAAI,UAAU,CAAA,CAAA,CAAA;AAAA,QAC1B,YAAA,EAAc;AAAA,OACjB,CAAA;AAAA,IACL;AACA,IAAA,OAAO,sBAAA;AAAA,EACX;AAAA,EAEQ,yBAAA,CAA0B,YAAoB,UAAA,EAAoB;AACtE,IAAA,MAAM,mBAAmB,IAAA,CAAK,yBAAA;AAAA,MAC1B,UAAA;AAAA,MACA;AAAA,KACJ;AACA,IAAA,IACI,gBAAA,IAAoB,IAAA,IAAA,CACpB,gBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,gBAAA,CAAkB,cAAA,CAAe,YAAW,CAAA,EAC9C;AACE,MAAA,UAAA,GAAa,UAAA,CAAW,OAAA;AAAA,QACpB,gBAAA,CAAiB,cAAA;AAAA,QACjB,gBAAA,CAAiB;AAAA,OACrB;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,OAAO,gBAAA;AAAA,IACX;AAEA,IAAA,OAAO,UAAA;AAAA,EACX;AAAA,EAEQ,mCAAA,CACJ,OAAA,EACA,OAAA,EACA,OAAA,EACA,UAAA,EACF;AACE,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC3B,MAAA,MAAA,CAAO,OAAO,IAAA,CAAK,+BAAA;AAAA,QACf,MAAA,CAAO,IAAA;AAAA,QACP;AAAA,OACJ;AACA,MAAA,IACI,OAAO,OAAO,KAAA,IAAS,QAAA,IACvB,OAAO,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,EACrC;AACE,QAAA,MAAA,CAAO,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACtC,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAClC,QAAA,MAAA,CAAO,QACH,IAAA,CAAK,kDAAA;AAAA,UACD,MAAA,CAAO,KAAA;AAAA,UACP;AAAA,SACJ;AACJ,QAAA,MAAA,CAAO,QAAQ,IAAA,CAAK,yBAAA;AAAA,UAChB,MAAA,CAAO,KAAA;AAAA,UACP,MAAA,CAAO;AAAA,SACX;AACA,QAAA,MAAA,CAAO,cAAA,GAAiB,aAAA;AAAA,MAC5B,CAAA,MAAO;AACH,QAAA,MAAA,CAAO,QAAQ,IAAA,CAAK,gCAAA;AAAA,UAChB,MAAA,CAAO,KAAA;AAAA,UACP;AAAA,SACJ;AAAA,MACJ;AAEA,MAAA,MAAA,CAAO,UAAA,GAAa,UAAA;AACpB,MAAA,MAAA,CAAO,eAAA,GAAkB,IAAA;AACzB,MAAA,OAAO,MAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,kDAAA,CACJ,OACA,OAAA,EACF;AACE,IAAA,MAAM,EAAE,wBAAA,EAA0B,yBAAA,EAA0B,GAAI,OAAA;AAChE,IAAA,MAAM,yBAAyB,wBAAA,GACzB,MAAA,CAAO,IAAA,CAAK,wBAAwB,IACpC,EAAC;AACP,IAAA,MAAM,0BAA0B,yBAAA,GAC1B,MAAA,CAAO,IAAA,CAAK,yBAAyB,IACrC,EAAC;AAGP,IAAA,IAAI,sBAAA,CAAuB,SAAS,CAAA,EAAG;AACnC,MAAA,sBAAA,CAAuB,OAAA,CAAQ,CAAC,aAAA,KAAkB;AAC9C,QAAA,KAAA,GAAQ,KAAA,CAAM,OAAA;AAAA,UACV,aAAA;AAAA,UACA,yBAAyB,aAAa;AAAA,SAC1C;AAAA,MACJ,CAAC,CAAA;AAAA,IACL;AAGA,IAAA,IAAI,uBAAA,CAAwB,SAAS,CAAA,EAAG;AACpC,MAAA,uBAAA,CAAwB,OAAA,CAAQ,CAAC,aAAA,KAAkB;AAC/C,QAAA,MAAM,kBAAkB,IAAA,CAAK,kBAAA;AAAA,UACzB,0BAA0B,aAAa;AAAA,SAC3C;AACA,QAAA,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,aAAA,EAAe,CAAA,EAAG,eAAe,CAAA,CAAE,CAAA;AAAA,MAC7D,CAAC,CAAA;AAAA,IACL;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEQ,+BAAA,CACJ,MACA,OAAA,EACF;AACE,IAAA,MAAM,EAAE,0BAAyB,GAAI,OAAA;AAErC,IAAA,IAAI,wBAAA,EAA0B;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,wBAAwB,CAAA,CAAE,OAAA;AAAA,QAClC,CAAC,aAAA,KAA0B;AACvB,UAAA,MAAM,kBAAA,GACF,yBAAyB,aAAa,CAAA;AAC1C,UAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,kBAAkB,CAAA;AAAA,QACzD;AAAA,OACJ;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,gCAAA,CACJ,OACA,OAAA,EACF;AACE,IAAA,MAAM,EAAE,2BAA0B,GAAI,OAAA;AACtC,IAAA,IAAI,yBAAA,CAA0B,KAAK,CAAA,IAAK,MAAA,EAAW;AAC/C,MAAA,OAAO,0BAA0B,KAAK,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEQ,iCAAiC,KAAA,EAAY;AACjD,IAAA,QAAQ,OAAO,KAAA;AAAO,MAClB,KAAK,QAAA;AACD,QAAA,OAAO,QAAA;AAAA,MACX,KAAK,SAAA;AACD,QAAA,OAAO,SAAA;AAAA,MACX,KAAK,QAAA;AAAA,MACL;AACI,QAAA,OAAO,MAAA;AAAA;AACf,EACJ;AACJ,CAAA;;;AC57BO,IAAM,qBAAA,GAAN,cACK,uBAAA,CAEZ;AAAA,EACI,WAAA,CACY,aACR,UAAA,EACF;AACE,IAAA,KAAA,CAAM,aAAa,UAAU,CAAA;AAHrB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAIZ;AAAA,EAEA,IAAY,YAAA,GAAmC;AAC3C,IAAA,OAAO,gBAAA,CAAiB,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAAA,EACpD;AAAA,EAEA,mBAAmB,SAAA,EAAgB;AAnCvC,IAAA,IAAA,EAAA;AAoCQ,IAAA,SAAA,CAAU,eAAe,EAAC;AAC1B,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AACzB,MAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,QAAQ,GAAG,CAAA,IAAK,QAAQ,cAAA,EAAgB;AAC1D,QAAA,SAAA,CAAU,YAAA,CAAa,GAAG,CAAA,GAAI,SAAA,CAAU,GAAG,CAAA;AAC3C,QAAA,OAAO,UAAU,GAAG,CAAA;AAAA,MACxB,CAAA,MAAA,IACI,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,GAAG,CAAC,CAAA,IAAA,CAAA,CAC5B,EAAA,GAAA,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,GAAG,CAAA,KAA5B,IAAA,GAAA,MAAA,GAAA,EAAA,CAA+B,UAAS,OAAA,EAC1C;AACE,QAAA,SAAA,CAAU,GAAG,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,QAAQ,IAAA,EAAmC;AACvC,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,YAAY,OAAO,CAAA;AAC7D,IAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACpC,MAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC7B,QAAA,IAAI,IAAA,CAAK,GAAG,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,MAC/C;AAAA,IACJ,CAAC,CAAA;AACD,IAAA,MAAM,UAAA,GAAa,cAAA,CAAA,cAAA,CAAA,EAAA,EAAK,IAAA,CAAA,EAAS,IAAA,CAAK,YAAA,CAAA;AACtC,IAAA,OAAO,WAAW,cAAc,CAAA;AAChC,IAAA,OAAO,UAAA;AAAA,EACX;AAAA,EAEA,YAAY,IAAA,EAAc;AACtB,IAAA,MAAM,YAAY,cAAA,CAAA,EAAA,EAAK,IAAA,CAAA;AACvB,IAAA,IAAA,CAAK,mBAAmB,SAAS,CAAA;AACjC,IAAA,OAAO,SAAA;AAAA,EACX;AAAA,EAEA,yBAAyB,MAAA,EAAsC;AAC3D,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,IAAI,CAAA,GAAI,MAAA,CAAO,OAAO,EAAC;AAC1D,IAAA,OAAO;AAAA,MACH,KAAA,EAAO,KAAK,GAAA,CAAI,CAAC,MAAW,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC3C,kBAAkB;AAAC,KACvB;AAAA,EACJ;AAAA,EAEA,OAAO,IAAA,EAAqD;AACxD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACrB,MAAA,MAAM,cAAA,GAAiB,KAAK,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,WAAA,CAAY,IAAI,CAAC,CAAA;AAChE,MAAA,OAAO,KAAK,aAAA,CAAc,cAAc,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AACvD,QAAA,OAAO,IAAA,CAAK,yBAAyB,MAAM,CAAA;AAAA,MAC/C,CAAC,CAAA;AAAA,IACL,CAAA,MAAO;AACH,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACvC,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,CAAC,SAAS,CAAC,CAAA,CAAE,IAAA;AAAA,QAAK,CAAC,MAAA,KACzC,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA,GAAI;AAAA,OACrD;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,SAAS,WAAA,EAA8C;AACnD,IAAA,OAAO,KAAK,WAAA,CAAY,WAAW,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS;AAChD,MAAA,OAAA,CAAO,6BAAM,MAAA,IACP,IAAA,CAAK,QAAQ,IAAA,CAAK,CAAC,CAA2B,CAAA,GAC9C,IAAA;AAAA,IACV,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAc,kBAAA,CACV,WAAA,EACA,cAAA,GAA0B,KAAA,EACH;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,WAAA,CAAY,WAAW,CAAA;AAC/C,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,GAAA,KACpB,IAAA,CAAK,OAAA,CAAQ,GAA6B;AAAA,KAC9C;AAEA,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAA,CAAI,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAa,eAAc,EAAC;AACpD,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,KAAW,KAAA;AACxD,IAAA,MAAM,OAAA,GAAU,KAAA,IAAS,cAAA,GAAiB,KAAA,IAAS,QAAQ,CAAA,CAAA,GAAK,IAAA;AAEhE,IAAA,MAAM,MAAA,GAAyB;AAAA,MAC3B,KAAA;AAAA,MACA,YAAY,cAAA,GAAiB,IAAA,GAAO,EAAE,KAAA,EAAc,MAAM,OAAA,EAAQ;AAAA,MAClE,OAAO,KAAA,CAAM;AAAA,KACjB;AACA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,MAAM,KAAK,WAAA,EAAoD;AAC3D,IAAA,OAAO,IAAA,CAAK,mBAAmB,WAAW,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,QAAQ,WAAA,EAAoD;AAC9D,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,WAAA,EAAa,IAAI,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,UAAU,WAAA,EAA4C;AACxD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,iCAC9B,WAAA,CAAA,EAD8B;AAAA,MAEjC,iBAAA,EAAA,OAAA;AAAA,KACJ,CAAC,CAAA;AAED,IAAA,MAAM,mBAAA,GAAsB,qBAAA;AAAA,MAAA,OAAA;AAAA,KAE5B;AACA,IAAA,MAAM,OAAY,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,CAAC,IAAI,EAAC;AAC7C,IAAA,OAAO,IAAA,CAAK,mBAAmB,CAAA,IAAK,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,MAAA,CACF,OAAA,EACA,IAAA,EACA,OAAA,GAA0B,EAAC,EACf;AACZ,IAAA,MAAM,WAAA,GAAA,CAAc,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,aAAA,IACvB,EAAC,GACD,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,OAAA,EAAS,CAAA;AAErC,IAAA,MAAM,SAAA,GAAiB,kCAChB,WAAA,CAAA,EACA,IAAA,CAAA;AAKP,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,CAAc,SAAS,IAAA,CAAK,WAAA,CAAY,SAAS,CAAC,CAAA;AAC5E,IAAA,IAAI,mCAAS,kBAAA,EAAoB;AAC7B,MAAA,OAAO,OAAO,QAAA,IAAY,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,MAAA,CACF,cAAA,EACA,IAAA,EACY;AACZ,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACvC,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,cAAA,EAAgB,SAAS,CAAA,CAAE,IAAA;AAAA,MAAK,CAAC,MAAA,KAAQ;AAzK3E,QAAA,IAAA,EAAA;AA0KY,QAAA,OAAA,MAAA,CAAO,QAAA,KAAA,CAAY,EAAA,GAAA,MAAA,CAAO,IAAA,KAAP,IAAA,GAAA,MAAA,GAAA,EAAA,CAAa,MAAA,CAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA,GAAI,IAAA;AAAA,MAAA;AAAA,KAC5E;AAAA,EACJ;AAAA,EAEA,MAAM,MAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,YAAY,CAAA;AAAA,EAC3D;AAAA,EAEA,QAAA,CAAS,eAAuB,MAAA,EAAgB;AAC5C,IAAA,OAAO,KAAA,CAAM,QAAA,CAAS,aAAA,EAAe,MAAM,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,iBAAA,CACF,OAAA,EACA,OAAA,EACA,OAAA,EACY;AACZ,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,uBAAA;AAAA,MACtB,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACJ;AACA,IAAA,OAAO,wBAAwB,MAAM,CAAA;AAAA,EACzC;AAAA;AAAA,EAGA,WAAA,CAAY,OAAe,MAAA,EAA6B;AACpD,IAAA,OAAO,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAAA,EACvC;AACJ,CAAA;;;ACtMO,IAAM,cAAN,MAAkB;AAAA,EACrB,OAAO,qBAAA,CACH,UAAA,EACA,IAAA,EACe;AARvB,IAAA,IAAA,EAAA;AASQ,IAAA,MAAMC,oBAAAA,GAAAA,CAAAA,CACF,EAAA,GAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,KAAZ,mBAA2B,WAAA,EAAA,MAAkB,WAAA;AAEjD,IAAA,IAAIA,oBAAAA;AACA,MAAA,OAAO,IAAI,qBAAA,CAAyB,UAAA,EAAY,IAAI,CAAA;AACxD,IAAA,OAAO,IAAI,oBAAuB,UAAU,CAAA;AAAA,EAChD;AACJ,CAAA;;;ACIA,IAAM,cAAN,MAAqB;AAAA,EAGjB,WAAA,CACI,YACQ,IAAA,EACV;AADU,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAER,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACtB;AAAA,EAEA,MAAc,sBAAA,GAAyB;AACnC,IAAA,MAAM,WAAA,GAAc,MAAM,WAAA,CAAY,qBAAA;AAAA,MAClC,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACT;AACA,IAAA,OAAO,WAAA;AAAA,EACX;AAAA,EAEQ,gBAAgB,UAAA,EAAyB;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AACjD,IAAA,OAAO,MAAA,GAAS,OAAO,OAAA,GAAU,MAAA;AAAA,EACrC;AAAA,EAEQ,iBAAiB,IAAA,EAAW;AAChC,IAAA,MAAM,gBAAwC,EAAC;AAC/C,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,CAAW,OAAA;AAEhC,IAAA,KAAA,MAAW,cAAc,OAAA,EAAS;AAC9B,MAAA,MAAM,kBAAA,GAAqB,EAAE,UAAA,IAAc,IAAA,CAAA;AAC3C,MAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAC1D,MAAA,IAAI,sBAAsB,kBAAA,EAAoB;AAC1C,QAAA,aAAA,CAAc,UAAU,CAAA,GAAI,kBAAA;AAAA,MAChC;AAAA,IACJ;AAEA,IAAA,OAAO,kCAAK,aAAA,CAAA,EAAkB,IAAA,CAAA;AAAA,EAClC;AAAA,EAEA,OAAO,IAAA,EAA2D;AAC9D,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,IAAI,IAClC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,gBAAA,CAAiB,KAAK,IAAI,CAAC,CAAA,GACzC,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAEhC,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,MAAA,CAAO,aAAa;AAAA,KACpC;AAAA,EACJ;AAAA,EAEA,KAAK,OAAA,EAAuB;AACxB,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,IAAA,CAAK,OAAO;AAAA,KAC5B;AAAA,EACJ;AAAA,EAEA,SAAS,OAAA,EAAuB;AAC5B,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,QAAA,CAAS,OAAO;AAAA,KAChC;AAAA,EACJ;AAAA,EAEA,MAAA,CACI,OAAA,EACA,IAAA,EACA,OAAA,GAA0B,EAAC,EACV;AACjB,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,MAAA,CAAO,OAAA,EAAS,MAAM,OAAO;AAAA,KAC7C;AAAA,EACJ;AAAA,EAEA,MAAA,CACI,gBACA,IAAA,EACiB;AACjB,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,MAAA,CAAO,gBAAgB,IAAI;AAAA,KAC3C;AAAA,EACJ;AAAA,EAEA,MAAA,CACI,OAAA,EACA,OAAA,GAA0B,EAAC,EACd;AACb,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,MAAA,CAAO,SAAS,OAAO;AAAA,KACvC;AAAA,EACJ;AAAA,EAEA,QAAQ,OAAA,EAAuB;AAE3B,IAAA,MAA0C,cAAlC,EAAA,UAAA,EA9GhB,GA8GkD,EAAA,EAAnB,cAAA,GAAA,SAAA,CAAmB,IAAnB,CAAf,YAAA,CAAA,CAAA;AACR,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,OAAA,CAAQ,cAAc;AAAA,KACtC;AAAA,EACJ;AAAA,EAEA,UAAU,gBAAA,EAAiD;AACvD,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,SAAA,CAAU,gBAAgB;AAAA,KAC1C;AAAA,EACJ;AAAA,EAEA,YACI,SAAA,EACA,KAAA,EACA,QAAA,GAAW,OAAA,EACX,eAAe,MAAA,EACjB;AACE,IAAA,OAAO,WAAA,CAAY,SAAA,EAAW,KAAA,EAAO,QAAA,EAAU,YAAY,CAAA;AAAA,EAC/D;AAAA,EAEA,eAAA,CAAgB,WAAmB,OAAA,EAAmB;AAClD,IAAA,OAAO,eAAA,CAAgB,WAAW,OAAO,CAAA;AAAA,EAC7C;AAAA,EAEA,SAAA,CAAU,QAAgB,SAAA,EAAmB;AACzC,IAAA,OAAO,SAAA,CAAU,QAAQ,SAAS,CAAA;AAAA,EACtC;AAAA,EAEA,gBAAA,CACI,OAAA,EACA,OAAA,EACA,OAAA,EACiB;AACjB,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,iBAAA,CAAkB,OAAA,EAAS,SAAS,OAAO;AAAA,KAC3D;AAAA,EACJ;AAAA,EAEA,WAAA,CAAY,OAAe,MAAA,EAAe;AACtC,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,WAAA,CAAY,OAAO,MAAM;AAAA,KACzC;AAAA,EACJ;AACJ,CAAA;AAEA,IAAO,oBAAA,GAAQ;;;ACzJR,IAAM,aAAN,MAAiB;AAOxB;AAPa,UAAA,CAGF,OAAA,GAAoB,KAAA;AAHlB,UAAA,CAIF,MAAA,GAAwB,IAAA;AAJtB,UAAA,CAMF,eAAA,GAA2B,KAAA;;;ACPyB,MAAA,CAAO,MAAA;AAAA,EAClE;AACJ;;;ACDI,MAAA,CAAO,MAAA,CAAO,wBAAwB;ACCnC,IAAM,sBAAA,GAAqC;AAAA,EAC9C,GAAA,EAAK,EAAA;AAAA,EACL,yBAAyB,EAAA,GAAK,GAAA;AAAA,EAC9B,mBAAmB,EAAA,GAAK,GAAA;AAAA,EACxB,SAAA,EAAW;AACf;AAEO,SAAS,UAAU,UAAA,EAAyB;AAC/C,EAAA,IAAI,CAAC,mBAAA,EAAoB,EAAG,OAAO,MAAA;AAEnC,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,cAAA,CAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACf,sBAAA,CAAA,EADe;AAAA,IAElB,gBAAA,EAAkB,QAAQ,GAAA,CAAI,kCAAA;AAAA,IAC9B,kBAAkB,kBAAA;AAAmB,GAAA,CAAA,EAClC,UAAA,CACN,CAAA;AAED,EAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,EAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAiB;AAE/B,IAAA,OAAA,CAAQ,KAAA;AAAA,MACJ,4DAAA;AAAA,MACA;AAAA,KACJ;AAAA,EACJ,CAAC,CAAA;AAED,EAAA,OAAO,IAAA;AACX","file":"index.mjs","sourcesContent":["export const FILTER_OPERATOR_MAP: { [key: string]: string } = {\n CONTAINS: 'contains',\n NOT_CONTAINS: 'notContains',\n EQUAL: 'eq',\n STARTS_WITH: 'beginsWith',\n NOT_EQUAL: 'notEq',\n IN: 'in',\n GREATER_THAN: 'gt',\n GT: 'gt',\n GREATER_THAN_EQUAL: 'gte',\n GTE: 'gte',\n LESS_THAN: 'lt',\n LT: 'lt',\n LESS_THAN_EQUAL: 'lte',\n LTE: 'lte',\n EXIST: 'attribute_exists',\n NOT_EXIST: 'attribute_not_exists',\n BETWEEN: 'between',\n};\n\nexport const DYNAMODB_OPERATORS: { [key: string]: string } = {\n EQUAL: 'EQUAL',\n};\n\nexport enum SORT_DIRECTIONS {\n ASC = 'ASC',\n DESC = 'DESC',\n}\n\nexport enum CONNECTION_CLOSING_MODES {\n AUTO = 'AUTO',\n MANUAL = 'MANUAL',\n}\n\nexport enum FILTER_LOGIC_OPERATORS {\n AND = 'AND',\n OR = 'OR',\n}\n\nexport enum FilterOperator {\n EQUAL = 'EQUAL',\n NOT_EQUAL = 'NOT_EQUAL',\n CONTAINS = 'CONTAINS',\n GREATER_THAN = 'GREATER_THAN',\n GREATER_THAN_EQUAL = 'GREATER_THAN_EQUAL',\n LESS_THAN = 'LESS_THAN',\n LESS_THAN_EQUAL = 'LESS_THAN_EQUAL',\n IN = 'IN',\n STARTS_WITH = 'STARTS_WITH',\n NOT_CONTAINS = 'NOT_CONTAINS',\n BETWEEN = 'BETWEEN',\n EXIST = 'EXIST',\n NOT_EXIST = 'NOT_EXIST',\n}\n\nexport const POSTGRES_FILTER_OPERATOR_MAP = {\n EQUAL: '=',\n NOT_EQUAL: '<>',\n GREATER_THAN: '>',\n GT: '>',\n GTE: '>=',\n GREATER_THAN_EQUAL: '>=',\n LTE: '<=',\n LESS_THAN_EQUAL: '<=',\n LESS_THAN: '<',\n LT: '<',\n IN: 'IN',\n STARTS_WITH: 'LIKE',\n CONTAINS: 'LIKE',\n NOT_CONTAINS: 'NOT LIKE',\n BETWEEN: 'BETWEEN',\n EXIST: 'IS NOT NULL',\n NOT_EXIST: 'IS NULL',\n};\n\nexport const DEFAULT_PG_SCHEMA = 'public';\n\nexport enum AGGREGATE_FUNCTIONS {\n COUNT = 'COUNT',\n}\n\nexport const DYNAMO_DB_UPDATE_ACTIONS: { [key: string]: string } = {\n SET: 'SET',\n ADD: 'ADD',\n DELETE: 'DELETE',\n REMOVE: 'REMOVE',\n};\n\nexport function isMultiPlatformMode() {\n return process.env.PLATFORM_TYPE?.toLowerCase() === 'container';\n}\n\nexport function getConnectionAlias(): string {\n return process.env.PG_CONNECTION_ALIAS || process.env.HOSTNAME || process.env.SERVICE_NAME || 'qrvey-service';\n}\n","import { ISorting } from '../interfaces';\nimport { SortDirection } from '../types';\nimport { SORT_DIRECTIONS } from '../utils/constants';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function buildFilter(\n attribute: string,\n value: any,\n operator = 'EQUAL',\n relativePath = undefined,\n) {\n return {\n attribute,\n operator,\n value,\n relativePath,\n };\n}\n\nexport function buildQueryIndex(indexName: string, columns: string[]) {\n return {\n indexName,\n columns,\n };\n}\n\nexport function buildSort(\n column: string,\n direction: string = SORT_DIRECTIONS.ASC,\n): ISorting {\n return {\n column,\n direction: direction as SortDirection,\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DynamoDBDocumentClient,\n GetCommand,\n QueryCommand,\n PutCommand,\n UpdateCommand,\n DeleteCommand,\n GetCommandInput,\n QueryCommandInput,\n PutCommandInput,\n UpdateCommandInput,\n DeleteCommandInput,\n QueryCommandOutput,\n ScanCommandInput,\n ScanCommand,\n BatchWriteCommandInput,\n BatchWriteCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport { IFilter } from '../../../interfaces';\n\nconst AWS_REGION = process.env.AWS_DEFAULT_REGION;\n\n/**\n * Ref:\n * - https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html\n * - https://www.fernandomc.com/posts/eight-examples-of-fetching-data-from-dynamodb-with-node/\n */\nexport default class DynamoDbClientService {\n private tableName: string;\n protected dynamoDBClient: DynamoDBDocumentClient;\n\n constructor(tableName: string) {\n if (!tableName)\n throw new Error(\n 'The \"tableName\" is required to use a DynamoDbClientService.',\n );\n this.tableName = tableName;\n const client = new DynamoDBClient({ region: AWS_REGION });\n this.dynamoDBClient = DynamoDBDocumentClient.from(client, {\n marshallOptions: {\n removeUndefinedValues: true,\n },\n });\n }\n\n /**\n * Get an item by key\n * @param {Object} keyObject - Ex: { jobId: 1234 }\n * @param {GetCommandInput} options\n */\n public async getByKey(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n keyObject: Record<string, any>,\n options: Partial<GetCommandInput> = {},\n ) {\n const params: GetCommandInput = {\n TableName: this.tableName,\n Key: keyObject,\n ...options,\n };\n const result = await this.dynamoDBClient.send(new GetCommand(params));\n return result.Item;\n }\n\n /**\n * Query a table\n * @param {QueryCommandInput} options\n */\n public async query(\n options: Omit<QueryCommandInput, 'TableName'> = {},\n ): Promise<Omit<QueryCommandOutput, '$metadata'>> {\n const params: QueryCommandInput = {\n TableName: this.tableName,\n ...options,\n };\n const result: Partial<QueryCommandOutput> =\n await this.dynamoDBClient.send(new QueryCommand(params));\n\n if (result.$metadata) delete result.$metadata;\n return result;\n }\n\n /**\n * Scan a table\n * @param {ScanInput} options\n */\n public async scan(\n input: ScanCommandInput,\n ): Promise<Omit<QueryCommandOutput, '$metadata'>> {\n const params: ScanCommandInput = {\n ...input,\n TableName: this.tableName,\n };\n\n const command = new ScanCommand(params);\n const response: Partial<QueryCommandOutput> =\n await this.dynamoDBClient.send(command);\n if (response.$metadata) delete response.$metadata;\n return response;\n }\n\n /**\n * Create/Replace a item object\n * To take care:\n * - https://stackoverflow.com/questions/43667229/difference-between-dynamodb-putitem-vs-updateitem\n * @param {Object} input\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public async put(input: Record<string, any>) {\n const params: PutCommandInput = {\n TableName: this.tableName,\n Item: input,\n ReturnValues: 'NONE',\n };\n return await this.dynamoDBClient.send(new PutCommand(params));\n }\n\n /**\n * Update a item object\n * To take care:\n * - https://stackoverflow.com/questions/43667229/difference-between-dynamodb-putitem-vs-updateitem\n * @param {Object} keyObject - Ex: { jobId: 1234 }\n * @param {UpdateCommandInput} updateObject\n */\n public async update(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n keyObject: Record<string, any>,\n options: Partial<UpdateCommandInput> = {},\n ) {\n const params: UpdateCommandInput = {\n TableName: this.tableName,\n Key: keyObject,\n ReturnValues: 'NONE',\n ...options,\n };\n return await this.dynamoDBClient.send(new UpdateCommand(params));\n }\n\n /**\n * Delete/Remove an item object\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public async remove(keyObject: Record<string, any>) {\n const params: DeleteCommandInput = {\n TableName: this.tableName,\n Key: keyObject,\n ReturnValues: 'NONE',\n };\n return await this.dynamoDBClient.send(new DeleteCommand(params));\n }\n\n public batchWrittenPut(data: Record<string, any>) {\n const putRequests = data.map((item: any) => ({\n PutRequest: {\n Item: item,\n },\n }));\n const params = {\n RequestItems: {\n [this.tableName]: putRequests,\n },\n } as BatchWriteCommandInput;\n const insertCommand = new BatchWriteCommand(params);\n return this.dynamoDBClient.send(insertCommand);\n }\n\n private buildDeleteRequestKeys(filters: IFilter[]) {\n const deleteRequestKeys: any = {};\n filters.forEach((filter) => {\n deleteRequestKeys[filter.attribute] = filter.value;\n });\n return deleteRequestKeys;\n }\n\n async batchRemove(filterGroups: IFilter[][]): Promise<void> {\n if (!filterGroups?.length) return;\n\n const deleteRequests = filterGroups.map((filterGroup: IFilter[]) => ({\n DeleteRequest: {\n Key: this.buildDeleteRequestKeys(filterGroup),\n },\n }));\n\n const params = {\n RequestItems: {\n [this.tableName]: deleteRequests,\n },\n } as BatchWriteCommandInput;\n\n await this.dynamoDBClient.send(new BatchWriteCommand(params));\n }\n\n public async updateExpressions(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n keyObject: Record<string, any>,\n options: Partial<UpdateCommandInput> = {},\n ) {\n const params: UpdateCommandInput = {\n TableName: this.tableName,\n Key: keyObject,\n ...options,\n };\n\n return await this.dynamoDBClient.send(new UpdateCommand(params));\n }\n}\n","import { AggregateFunction } from '../types';\n\nexport enum METHOD_TO_QUERY {\n where = 'where',\n filter = 'filter',\n update = 'update',\n}\n\nexport function buildAggFunctionAlias(\n aggregateFunction: AggregateFunction,\n): string {\n return `AGG_FN_${aggregateFunction}`;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { QueryCommandInput } from '@aws-sdk/client-dynamodb';\nimport { UpdateCommandInput } from '@aws-sdk/lib-dynamodb';\nimport { IQueryBuilder } from '../../../interfaces/queryBuilder.interface';\nimport { METHOD_TO_QUERY } from '../../../helpers/queryHelpers';\nimport { IQueryBuilderCondition } from '../../../interfaces/queryBuilderCondition.interface';\n\nexport default class QueryBuilderConditionService\n implements IQueryBuilderCondition\n{\n private query;\n private command: Pick<\n QueryCommandInput,\n | 'FilterExpression'\n | 'KeyConditionExpression'\n | 'ExpressionAttributeNames'\n | 'ExpressionAttributeValues'\n > &\n Pick<UpdateCommandInput, 'UpdateExpression'>;\n private queryFrom: METHOD_TO_QUERY | undefined;\n private tempKey: string = '';\n private tempLogicOperator: string | null = null;\n private config: any;\n private wheres: string[] = [];\n private filters: string[] = [];\n private updates: string[] = [];\n private attributeNames: Record<string, string> = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private attributeValues: Record<string, any> = {};\n\n constructor(query: IQueryBuilder) {\n this.query = query;\n this.command = {};\n }\n\n public get() {\n this.build();\n return this.command;\n }\n\n public setKey(key: string) {\n this.tempKey = key;\n return this;\n }\n setTmpLogicOp(logicOp: string) {\n this.tempLogicOperator = logicOp;\n return this;\n }\n\n setConfig(config: any) {\n this.config = config;\n return this;\n }\n\n public from(methodName: METHOD_TO_QUERY) {\n this.queryFrom = methodName;\n return this;\n }\n\n eq(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} = ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n notEq(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} <> ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n contains(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `contains(${key}, ${value})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n notContains(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `NOT contains(${key}, ${value})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n in(keyValue: any) {\n const keyValues = Array.isArray(keyValue) ? keyValue : [keyValue];\n const { key, value } = this.generateKeyValue(keyValues);\n let expression: any = `${key} IN (${value})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n beginsWith(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `begins_with(${key}, ${value})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n project(keyValue: string): string {\n const key = `#${keyValue}`;\n this.attributeNames[key] = keyValue;\n return key;\n }\n\n gt(keyValue: any) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} > ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n gte(keyValue: any) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} >= ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n lte(keyValue: any) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} <= ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n lt(keyValue: any) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} < ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n attribute_exists(keyValue: string) {\n const { key } = this.generateKeyValue(keyValue, null, true);\n let expression: any = `attribute_exists(${key})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n attribute_not_exists(keyValue: string) {\n const { key } = this.generateKeyValue(keyValue, null, true);\n let expression: any = `attribute_not_exists(${key})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n between(keyValues: any) {\n const isValidValues =\n Array.isArray(keyValues) && keyValues?.length === 2;\n if (!isValidValues)\n throw new Error(\n 'The value for between filter operator should be an Array with 2 values.',\n );\n\n const { key, value } = this.generateKeyValue(keyValues, ' AND');\n let expression: any = `${key} between ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n private setExpression(expression: string): void {\n switch (this.queryFrom) {\n case METHOD_TO_QUERY.filter:\n this.filters.push(expression);\n break;\n case METHOD_TO_QUERY.update:\n this.updates.push(expression);\n break;\n default:\n this.wheres.push(expression);\n break;\n }\n }\n\n private generateKeyValue(\n value: string[] | string,\n separatorCharacter: string | null = ',',\n omitAttributeValues: boolean = false,\n ): {\n key: string;\n value: string;\n } {\n const keyExpression = `#${this.tempKey}1`;\n\n this.attributeNames[keyExpression] = this.tempKey;\n\n if (Array.isArray(value)) {\n const valueExpressions = value.map((val, index) => {\n let valueExpression = `:${this.tempKey}${index + 1}1`;\n for (const [i] of Object.entries(this.attributeValues)) {\n if (i === valueExpression) valueExpression += '1';\n }\n this.attributeValues[valueExpression] = val;\n return valueExpression;\n });\n return {\n key: keyExpression,\n value: valueExpressions.join(`${separatorCharacter} `),\n };\n } else {\n let valueExpression = `:${this.tempKey}1`;\n if (valueExpression in this.attributeValues) {\n for (const [index] of Object.entries(this.attributeValues)) {\n if (index === valueExpression) valueExpression += '1';\n }\n }\n if (!omitAttributeValues)\n this.attributeValues[valueExpression] = value;\n return { key: keyExpression, value: valueExpression };\n }\n }\n\n private build(): void {\n if (this.wheres.length > 0) {\n const keyConditionExpression = this.wheres.join(' AND ');\n this.command['KeyConditionExpression'] = keyConditionExpression;\n }\n if (this.filters.length > 0) {\n let filterExpression = '';\n\n this.filters?.forEach((filter: any, index) => {\n if (filter?.logicOperator) {\n if (filter?.config?.openExpression) {\n filterExpression = filterExpression.replace(/\\s+(AND|OR)\\s*$/, ` ${filter.config.parentKey} (`);\n if (filterExpression === '') filterExpression += '('\n filterExpression += `${filter.expression} ${filter.logicOperator} `;\n } else if (filter?.config?.closeExpression) {\n filterExpression += `${filter.expression}) ${filter.config.parentKey} `; \n } else {\n filterExpression += `${filter.expression} ${filter.logicOperator} `;\n }\n }\n });\n filterExpression = filterExpression.replace(/\\s+(AND|OR)\\s*$/, '');\n this.command['FilterExpression'] = filterExpression;\n }\n if (this.updates.length > 0) {\n const filterExpression = this.updates.join(', ');\n this.command['UpdateExpression'] = `SET ${filterExpression}`;\n }\n if (Object.values(this.attributeNames).length > 0)\n this.command['ExpressionAttributeNames'] = this.attributeNames;\n\n if (Object.values(this.attributeValues).length > 0)\n this.command['ExpressionAttributeValues'] = this.attributeValues;\n }\n}\n","import { QueryCommandInput, ScanCommandInput } from '@aws-sdk/client-dynamodb';\nimport { IQueryBuilderCondition } from '../../../interfaces/queryBuilderCondition.interface';\nimport QueryBuilderConditionService from './queryBuilderCondition.service';\nimport { METHOD_TO_QUERY } from '../../../helpers/queryHelpers';\nimport { IQueryBuilder } from '../../../interfaces/queryBuilder.interface';\nimport { AGGREGATE_FUNCTIONS } from '../../../utils/constants';\n\nexport default class QueryBuilderService implements IQueryBuilder {\n private command: Omit<QueryCommandInput & ScanCommandInput, 'TableName'>;\n private condition: IQueryBuilderCondition;\n\n constructor(private useScan = false) {\n this.command = {};\n\n this.condition = new QueryBuilderConditionService(this);\n }\n\n get() {\n const condition = this.condition.get();\n return { ...this.command, ...condition };\n }\n\n limit(num: number): IQueryBuilder {\n this.command.Limit = num;\n return this;\n }\n\n usingIndex(indexName: string): IQueryBuilder {\n this.command.IndexName = indexName;\n return this;\n }\n\n ascending(): IQueryBuilder {\n if (!this.useScan) this.command.ScanIndexForward = true;\n return this;\n }\n\n descending(): IQueryBuilder {\n if (!this.useScan) this.command.ScanIndexForward = false;\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n startKey(lastEvaluatedKey: Record<string, any>): IQueryBuilder {\n this.command.ExclusiveStartKey = lastEvaluatedKey;\n return this;\n }\n\n projection(fields: string[] = []) {\n if (!fields.length) return this;\n\n const expression: string[] = [];\n fields.forEach((field) => {\n const key = this.condition.project(field);\n expression.push(key);\n });\n this.command.ProjectionExpression = expression.join(',');\n return this;\n }\n\n where(keyName: string): IQueryBuilderCondition {\n this.condition\n .setKey(keyName)\n .setTmpLogicOp(null)\n .from(METHOD_TO_QUERY.where);\n return this.condition;\n }\n\n filter(\n keyName: string,\n logicOperator: string = 'AND',\n config?: any\n ): IQueryBuilderCondition {\n this.condition\n .setKey(keyName)\n .setTmpLogicOp(logicOperator)\n .setConfig(config)\n .from(METHOD_TO_QUERY.filter);\n return this.condition;\n }\n\n update(attribute: Record<string, string>): IQueryBuilder {\n for (const [key, value] of Object.entries(attribute)) {\n this.condition.setKey(key).from(METHOD_TO_QUERY.update);\n this.condition.eq(value);\n }\n return this;\n }\n\n consistentRead(consistentRead: boolean): IQueryBuilder {\n this.command.ConsistentRead = consistentRead;\n return this;\n }\n\n count(): IQueryBuilder {\n this.command.Select = AGGREGATE_FUNCTIONS.COUNT;\n return this;\n }\n}\n","import { ITableColumns, ITableName } from '../interfaces';\n\nexport function getTableColumnNames(columns: ITableColumns): string[] {\n return Object.keys(columns);\n}\n\nexport function findIdColumnName(columns: ITableColumns): string | undefined {\n return getTableColumnNames(columns).find(\n (columnName) => columns[columnName].columnId === true,\n );\n}\n\nexport function getTableName(\n table: string | ITableName,\n property = 'name',\n): string {\n if (!table) throw new Error('missing table property');\n\n if (typeof table === 'string') return table;\n\n const { name, alias } = table;\n return property === 'alias' && alias ? alias : name;\n}\n\nexport function getPrimaryKeyColumns(columns: ITableColumns): string[] {\n return getTableColumnNames(columns).filter(\n (columnName) => columns[columnName].primary === true,\n );\n}\n","export class NoRecordsAffectedException extends Error {\n constructor() {\n super('No records affected by update');\n this.name = 'NoRecordsAffectedException';\n }\n}\n","import { NoRecordsAffectedException } from '../error/NoRecordsAffectedException';\n\nexport function logError(context: string, err: unknown): void {\n const message = err instanceof Error ? err.message : String(err);\n const stack = err instanceof Error ? err.stack : undefined;\n console.error(`[data-persistence] ${context}:`, message);\n if (stack) console.error(stack);\n}\n\nexport function PersistenceErrorWrapper(queryResult: any) {\n const dynamoNoRecordsAffectedExceptions = [\n 'ConditionalCheckFailedException',\n ];\n\n if (queryResult instanceof Error) {\n //Checks for dynamodb errors also the ones that is included in NoRecordsAffectedExceptions list\n if (\n queryResult.name &&\n dynamoNoRecordsAffectedExceptions.includes(queryResult.name)\n ) {\n throw new NoRecordsAffectedException();\n } else {\n throw queryResult;\n }\n } else {\n //This is for Postgres scenario, where there is not error launched by updates\n if (queryResult.rowCount === 0) {\n throw new NoRecordsAffectedException();\n }\n }\n\n return queryResult;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport DynamoDbClientService from './dynamoDbClient.service';\nimport QueryBuilderService from './queryBuilder.service';\n\nimport {\n AGGREGATE_FUNCTIONS,\n DYNAMODB_OPERATORS,\n FILTER_OPERATOR_MAP,\n DYNAMO_DB_UPDATE_ACTIONS,\n} from '../../../utils/constants';\nimport {\n ICompositeFilter,\n ICreateMultipleResponse,\n ICrudService,\n IFilter,\n IFindOptions,\n IFindPagination,\n IRemoveOptions,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n IUpdateOptions,\n} from '../../../interfaces';\nimport { CrudSchema } from '../../../schemas/crudSchema';\nimport {\n findIdColumnName,\n getPrimaryKeyColumns,\n getTableName,\n} from '../../../helpers/tableHelper';\nimport { PersistenceErrorWrapper } from '../../../helpers/errorHelper';\nimport {\n QueryCommandInput,\n QueryCommandOutput,\n ScanCommandInput,\n} from '@aws-sdk/lib-dynamodb';\n\nexport class DynamoDbCrudService<T> implements ICrudService<T> {\n private dynamoDbClientService: DynamoDbClientService;\n\n constructor(private tableSchema: typeof CrudSchema) {\n this.dynamoDbClientService = new DynamoDbClientService(this.tableName);\n }\n\n private get tableName(): string {\n return getTableName(this.tableSchema.table);\n }\n\n private get idColumnName(): string | undefined {\n return findIdColumnName(this.tableSchema.columns);\n }\n\n private get defaultPrimaryKeys(): string[] {\n return getPrimaryKeyColumns(this.tableSchema.columns);\n }\n\n async create(data: T | T[]): Promise<T | ICreateMultipleResponse> {\n if (Array.isArray(data)) {\n const response =\n await this.dynamoDbClientService.batchWrittenPut(data);\n return {\n unprocessedItems: response.UnprocessedItems ?? [],\n };\n } else {\n await this.dynamoDbClientService.put(data as Record<string, any>);\n return data as T;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars\n runQuery(queryCommand: any): Promise<any> {\n throw new Error('Method not implemented.');\n }\n\n find(options: IFindOptions = {}): Promise<any> {\n const query = new QueryBuilderService(options.useScan);\n\n if (options.index?.indexName)\n query.usingIndex(options.index?.indexName);\n\n this.applySorting(query, options.sorting, options.index?.indexName);\n this.applyPagination(query, options.pagination);\n\n if (options.consistentRead)\n query.consistentRead(options.consistentRead);\n\n if (options.fields) query.projection(options.fields);\n\n this.applyFilters(query, options);\n\n if (options.aggregateFunction === AGGREGATE_FUNCTIONS.COUNT)\n query.count();\n\n return this.fetchResults(\n query.get(),\n options.pagination?.limit,\n options.useScan,\n ).then((res: any) => {\n const pagination: IFindPagination = {};\n if (res.lastEvaluatedKey) pagination.from = res.lastEvaluatedKey;\n if (options.pagination?.limit)\n pagination.limit = options.pagination?.limit;\n return {\n items: res.items,\n pagination,\n count: res.count,\n };\n });\n }\n\n async fetchResults(\n command: ScanCommandInput | QueryCommandInput,\n limit: number = 100,\n useScan: boolean = false,\n ): Promise<unknown> {\n let results: unknown[] = [];\n let lastEvaluatedKey: Record<string, unknown> = {};\n let rowsCount = 0;\n\n do {\n const result = await this.fetchBatch(\n command,\n useScan,\n lastEvaluatedKey,\n );\n const rows = result.Items ?? [];\n results = results.concat(rows);\n lastEvaluatedKey = result.LastEvaluatedKey ?? {};\n rowsCount += result.Count || rows.length;\n } while (rowsCount < limit && this.isNotEmptyObject(lastEvaluatedKey));\n\n const encryptedLastEvaluatedKey = this.isNotEmptyObject(\n lastEvaluatedKey,\n )\n ? this.encryptPaginationKey(lastEvaluatedKey)\n : null;\n return {\n items: results,\n lastEvaluatedKey: encryptedLastEvaluatedKey,\n count: rowsCount,\n };\n }\n\n async fetchBatch(\n command: ScanCommandInput | QueryCommandInput,\n useScan: boolean,\n lastEvaluatedKey: Record<string, unknown>,\n ): Promise<Partial<QueryCommandOutput>> {\n if (this.isNotEmptyObject(lastEvaluatedKey))\n command.ExclusiveStartKey = lastEvaluatedKey;\n\n const result = await (useScan\n ? this.dynamoDbClientService.scan(command)\n : this.dynamoDbClientService.query(command));\n\n if (command.Select !== AGGREGATE_FUNCTIONS.COUNT) {\n command.Limit = (command.Limit ?? 0) - (result.Items?.length ?? 0);\n }\n\n return result;\n }\n\n applyPagination(\n query: QueryBuilderService,\n pagination: IFindPagination | undefined,\n ) {\n if (pagination?.limit) query.limit(pagination.limit);\n if (pagination?.from)\n query.startKey(this.decryptPaginationKey(pagination.from));\n }\n\n async findAll(\n options: IFindOptions = {},\n allResults: any[] = [],\n rowsCount: number = 0,\n ): Promise<any> {\n const { items, pagination, count } = await this.find(options);\n allResults.push(...items);\n rowsCount += count;\n\n if (pagination?.from)\n await this.findAll({ ...options, pagination }, allResults);\n\n return {\n items: allResults,\n pagination: null,\n count: rowsCount,\n };\n }\n\n async findCount(options: IFindOptions = {}): Promise<number> {\n const findOptions = {\n ...options,\n aggregateFunction: AGGREGATE_FUNCTIONS.COUNT,\n };\n if (options.pagination?.from) {\n return this.find(findOptions).then((res) => res.count);\n } else {\n return this.findAll(findOptions).then((res) => res.count);\n }\n }\n\n buildFindItemQuery(options: IFindOptions): QueryBuilderService {\n const query = new QueryBuilderService();\n\n if (options.index?.indexName) query.usingIndex(options.index.indexName);\n\n this.applyFilters(query, options);\n query.projection(options.fields);\n query.limit(1);\n\n return query;\n }\n\n findItem(options: IFindOptions): Promise<T | null> {\n const query = this.buildFindItemQuery(options);\n return this.dynamoDbClientService.query(query.get()).then((result) => {\n if (result.Items?.length) return result.Items[0] as T;\n if (options.throwErrorIfNull) throw new Error('NOT_FOUND');\n return null;\n });\n }\n\n applyWhereFilter(query: QueryBuilderService, filter: IFilter) {\n const operator =\n FILTER_OPERATOR_MAP[\n filter.operator?.toUpperCase() ?? DYNAMODB_OPERATORS.EQUAL\n ];\n (query.where(filter.attribute) as any)[operator](filter.value);\n }\n\n applyFilterFilter(\n query: QueryBuilderService,\n filter: IFilter,\n logicOperator: string = 'AND',\n config?: any,\n ) {\n const operator =\n FILTER_OPERATOR_MAP[\n filter.operator?.toUpperCase() ?? DYNAMODB_OPERATORS.EQUAL\n ];\n (query.filter(filter.attribute, logicOperator, config) as any)[\n operator\n ](filter.value);\n }\n\n applyFilters(query: QueryBuilderService, options: IFindOptions) {\n if (Array.isArray(options.filters)) {\n this.applySimpleFilters(query, options);\n } else {\n this.applyCompoundFilters(query, options);\n }\n }\n\n applySimpleFilters(query: QueryBuilderService, options: IFindOptions) {\n const queryIndexColumns = options.index?.columns ?? [];\n const defaultWhereProperties = this.defaultPrimaryKeys;\n\n const whereProperties: string[] = queryIndexColumns?.length\n ? queryIndexColumns\n : defaultWhereProperties;\n const filters = options.filters as IFilter[];\n filters.forEach((filter: IFilter) => {\n const isWhereProperty = whereProperties.includes(filter.attribute);\n isWhereProperty && !options.useScan\n ? this.applyWhereFilter(query, filter)\n : this.applyFilterFilter(query, filter);\n });\n }\n\n applyCompoundFilters(query: QueryBuilderService, options: IFindOptions) {\n if (!options.filters) return;\n this.buildFilterExpression(query, options);\n }\n\n buildFilterExpression(\n query: QueryBuilderService,\n options: IFindOptions,\n parentKey?: string,\n ) {\n const compositeFilters = options.filters as ICompositeFilter;\n const queryIndexColumns = options.index?.columns || [];\n const defaultWhereProperties = this.defaultPrimaryKeys;\n\n const whereProperties = queryIndexColumns?.length\n ? queryIndexColumns\n : defaultWhereProperties;\n\n for (const [key, value] of Object.entries(compositeFilters)) {\n value.forEach(\n (filter: IFilter | ICompositeFilter, index: number) => {\n const isCompositeFilter = 'OR' in filter || 'AND' in filter;\n if (isCompositeFilter) {\n const newOptions = {\n ...options,\n filters: filter,\n };\n this.buildFilterExpression(query, newOptions, key);\n } else {\n const simpleFilter = filter as IFilter;\n const isWhereProperty = whereProperties.includes(\n simpleFilter.attribute,\n );\n let config;\n if (parentKey) {\n config = {\n parentKey,\n openExpression: index === 0,\n closeExpression: index === value.length - 1,\n };\n }\n\n isWhereProperty && !options.useScan\n ? this.applyWhereFilter(query, simpleFilter)\n : this.applyFilterFilter(\n query,\n simpleFilter,\n key,\n config,\n );\n }\n },\n );\n }\n }\n\n applySorting(query: QueryBuilderService, sorting: any, sortIndex?: string) {\n if (sorting?.length) {\n if (sortIndex) query.usingIndex(sortIndex);\n if (sorting[0].direction === 'DESC') {\n query.descending();\n } else {\n query.ascending();\n }\n }\n }\n\n isNotEmptyObject(obj: unknown) {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n Object.keys(obj).length > 0\n );\n }\n\n encryptPaginationKey(key: Record<string, any>): string {\n const jsonKey = JSON.stringify(key);\n return Buffer.from(jsonKey).toString('base64');\n }\n\n decryptPaginationKey(encodedKey: string): Record<string, any> {\n const decodedKey = Buffer.from(encodedKey, 'base64').toString('utf-8');\n return JSON.parse(decodedKey);\n }\n\n async update(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<T>,\n options?: IUpdateOptions,\n ): Promise<any> {\n const savedRecord = options?.skipFindItems\n ? {}\n : await this.findItem({\n filters: filters as IFilter[],\n });\n\n const newData: any = {\n ...savedRecord,\n ...data,\n };\n\n await this.dynamoDbClientService.put(newData);\n\n if (options?.returnRowsAffected) {\n return 1;\n }\n\n return newData;\n }\n\n async upsert(\n keyColumnNames: string[],\n data: T\n ): Promise<T | null> {\n const filters = [] as IFilter[];\n\n keyColumnNames.map(key => {\n filters.push({ attribute: key, value: (data as any)[key], operator: 'EQUAL' });\n });\n\n const savedRecord = await this.findItem({\n filters: filters as IFilter[],\n });\n\n const newData: any = {\n ...savedRecord,\n ...data,\n };\n\n await this.dynamoDbClientService.put(newData);\n return newData;\n }\n\n async remove(\n filters: IFilter[] | ICompositeFilter | IFilter[][],\n options: IRemoveOptions,\n ) {\n if (options?.filterGroups) {\n await this.dynamoDbClientService.batchRemove(\n filters as IFilter[][],\n );\n } else {\n const key = (filters as IFilter[]).reduce((obj: any, item: any) => {\n const property = item.attribute;\n obj[property] = item.value;\n return obj;\n }, {});\n await this.dynamoDbClientService.remove(key);\n }\n }\n\n async updateExpressions(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: IUpdateExpressionsOptions,\n ): Promise<any> {\n try {\n return await this.#prepareAndExecuteUpdateExpression(\n filters,\n actions,\n options,\n );\n } catch (error: any) {\n PersistenceErrorWrapper(error);\n }\n }\n\n async #prepareAndExecuteUpdateExpression(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: IUpdateExpressionsOptions,\n ) {\n const queryObject = this.#buildUpdateExpressionQuery({ filters }).get();\n const primaryKeys = this.defaultPrimaryKeys;\n\n const keyObject: any = this.#getKeyObjectForUpdateExpression(\n queryObject,\n primaryKeys,\n );\n\n const updateExpressions: any = [];\n\n Object.keys(actions).forEach((action: string) => {\n const actionUpdateExpression =\n this.#extractUpdateExpressionAttributesAndNames(\n actions,\n action,\n );\n updateExpressions.push(actionUpdateExpression);\n });\n\n const dbParams = {\n UpdateExpression: updateExpressions.join(' '),\n ...this.#getUpdateExpressionOptions(options),\n };\n\n const { ExpressionAttributeValues, ExpressionAttributeNames } =\n queryObject;\n if (Object.keys(ExpressionAttributeValues).length > 0) {\n dbParams['ExpressionAttributeValues'] = {\n ...ExpressionAttributeValues,\n ...dbParams.ExpressionAttributeValues,\n };\n }\n\n if (Object.keys(ExpressionAttributeNames).length > 0) {\n dbParams['ExpressionAttributeNames'] = {\n ...ExpressionAttributeNames,\n ...dbParams.ExpressionAttributeNames,\n };\n }\n if (queryObject.FilterExpression)\n dbParams['ConditionExpression'] = queryObject.FilterExpression;\n\n return this.dynamoDbClientService.updateExpressions(\n keyObject,\n dbParams,\n );\n }\n\n #buildUpdateExpressionQuery(options: IFindOptions): QueryBuilderService {\n const query = new QueryBuilderService();\n\n if (options.index?.indexName) query.usingIndex(options.index.indexName);\n this.applyFilters(query, options);\n\n return query;\n }\n\n #getKeyObjectForUpdateExpression(queryObject: any, primaryKeys: any) {\n const keyObject: any = {};\n\n Object.keys(queryObject.ExpressionAttributeNames).forEach(\n (attribute) => {\n const sanitizedAttribute = attribute\n .replace('#', '')\n .replace('1', '');\n if (primaryKeys.includes(sanitizedAttribute)) {\n const valueName = `:${sanitizedAttribute}1`;\n keyObject[sanitizedAttribute] =\n queryObject.ExpressionAttributeValues[valueName];\n delete queryObject.ExpressionAttributeValues[valueName];\n delete queryObject.ExpressionAttributeNames[attribute];\n }\n },\n );\n\n return keyObject;\n }\n\n #getUpdateExpressionOptions(options: IUpdateExpressionsOptions) {\n const updateExprOptions: any = {\n ReturnValues: options.returnValues,\n };\n\n if (options.expressionAttributeNames)\n updateExprOptions.ExpressionAttributeNames =\n options.expressionAttributeNames;\n if (options.expressionAttributeValues)\n updateExprOptions.ExpressionAttributeValues =\n options.expressionAttributeValues;\n\n return updateExprOptions;\n }\n\n #extractUpdateExpressionAttributesAndNames(\n actions: any,\n actionType: string,\n ) {\n const actionUpdateExpressions: any = [];\n\n actions[actionType].forEach((action: any) => {\n switch (actionType) {\n case DYNAMO_DB_UPDATE_ACTIONS.DELETE:\n case DYNAMO_DB_UPDATE_ACTIONS.REMOVE:\n actionUpdateExpressions.push(`${action.path}`);\n break;\n\n case DYNAMO_DB_UPDATE_ACTIONS.ADD:\n case DYNAMO_DB_UPDATE_ACTIONS.SET:\n {\n let operator = '';\n if (actionType == DYNAMO_DB_UPDATE_ACTIONS.SET)\n operator = '=';\n actionUpdateExpressions.push(\n `${action.path} ${operator}${action.value}`,\n );\n }\n break;\n }\n });\n\n const actionUpdateExpression = `${actionType} ${actionUpdateExpressions.join(\n ', ',\n )}`;\n\n return actionUpdateExpression;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n runRawQuery(query: string, params: any[]): Promise<any> {\n throw new Error('Method not implemented.');\n }\n}\n","import { Client, Pool } from 'pg';\nimport { logError } from '../helpers/errorHelper';\n\nconst poolRegistry = new Set<Pool>();\nconst clientRegistry = new Set<Client>();\nlet shutdownHandlersRegistered = false;\n\nfunction registerShutdownHandlers(): void {\n if (shutdownHandlersRegistered) return;\n shutdownHandlersRegistered = true;\n\n const handler = async (signal: string) => {\n const poolCount = poolRegistry.size;\n const clientCount = clientRegistry.size;\n console.log(\n `[data-persistence] ${signal} received, closing ${poolCount} pool(s) and ${clientCount} client(s)...`,\n );\n try {\n await closeAllPools();\n await closeAllClients();\n console.log('[data-persistence] All connections closed');\n } catch (err) {\n logError('Unexpected error during shutdown', err);\n }\n };\n process.on('SIGTERM', () => void handler('SIGTERM'));\n process.on('SIGINT', () => void handler('SIGINT'));\n}\n\nexport async function closeAllPools(): Promise<void> {\n const pools = [...poolRegistry];\n poolRegistry.clear();\n const results = await Promise.allSettled(pools.map((pool) => pool.end()));\n results.forEach((result, i) => {\n if (result.status === 'rejected') {\n logError(`Pool[${i}] failed to close`, result.reason);\n }\n });\n}\n\nexport async function closeAllClients(): Promise<void> {\n const clients = [...clientRegistry];\n clientRegistry.clear();\n const results = await Promise.allSettled(\n clients.map((client) => client.end()),\n );\n results.forEach((result, i) => {\n if (result.status === 'rejected') {\n logError(`Client[${i}] failed to close`, result.reason);\n }\n });\n}\n\nexport function registerPool(pool: Pool): void {\n if (!pool) return;\n try {\n poolRegistry.add(pool);\n registerShutdownHandlers();\n } catch (err) {\n logError('Failed to register pool, closing pool', err);\n void pool\n .end()\n .catch((e) => logError('pool.end failed during rollback', e));\n throw err;\n }\n}\n\nexport function registerClient(client: Client): void {\n if (!client) return;\n try {\n clientRegistry.add(client);\n registerShutdownHandlers();\n } catch (err) {\n logError('Failed to register client, closing client', err);\n void client\n .end()\n .catch((e) => logError('client.end failed during rollback', e));\n throw err;\n }\n}\n\nexport function unregisterClient(client: Client): void {\n try {\n clientRegistry.delete(client);\n } catch (err) {\n logError('Failed to unregister client', err);\n }\n}\n","import { Client } from 'pg';\nimport { logError } from '../../../helpers/errorHelper';\nimport { getConnectionAlias } from '../../../utils/constants';\nimport { registerClient, unregisterClient } from '../../connectionRegistry';\n\nexport default class ConnectionService {\n get connectionString() {\n const connectionString =\n process.env.MULTIPLATFORM_PG_CONNECTION_STRING || '';\n if (!connectionString) {\n throw new Error(\n 'MULTIPLATFORM_PG_CONNECTION_STRING environment variable must be configured',\n );\n }\n return connectionString;\n }\n\n async getClient(): Promise<Client> {\n const client: Client = new Client({\n connectionString: this.connectionString,\n application_name: getConnectionAlias(),\n });\n await client.connect();\n registerClient(client);\n return client;\n }\n\n releaseClient(client: Client): void {\n try {\n unregisterClient(client);\n } catch (err) {\n logError('Error unregistering client', err);\n }\n void client\n .end()\n .catch((e) => logError('client.end failed during release', e));\n }\n}\n","/* eslint-disable no-console */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Client, PoolClient, QueryResult } from 'pg';\nimport ConnectionService from './connection.service';\nimport { DbPool } from '../../../types';\n\nexport default class QueryService {\n private connectionService: ConnectionService;\n\n constructor(private pool?: DbPool) {\n this.connectionService = new ConnectionService();\n }\n\n async runQuery(\n queryText: string,\n values?: any[],\n ): Promise<QueryResult<any>> {\n const client: PoolClient | Client | any = await (this.pool\n ? this.pool.connect()\n : this.connectionService.getClient());\n\n try {\n if (process.env.NODE_ENV === 'development')\n console.info('[data-persistence] Query as Text:', queryText);\n const result = await client.query(queryText, values);\n return result;\n } finally {\n if (this.pool) {\n await client.release();\n } else {\n this.connectionService.releaseClient(client as Client);\n }\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-console */\n\nimport { ident, literal, format } from '@scaleleap/pg-format';\nimport { QueryResult } from 'pg';\nimport { AggregateFunction, DbPool, FilterLogicOperator } from '../../../types';\nimport {\n ICompositeFilter,\n IFilter,\n IFindOptions,\n IFindPagination,\n ISorting,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n} from '../../../interfaces';\nimport QueryService from './query.service';\nimport {\n FILTER_LOGIC_OPERATORS,\n SORT_DIRECTIONS,\n POSTGRES_FILTER_OPERATOR_MAP,\n DEFAULT_PG_SCHEMA,\n FilterOperator,\n DYNAMO_DB_UPDATE_ACTIONS,\n} from '../../../utils/constants';\nimport { CrudSchema } from '../../../schemas';\nimport { getTableName } from '../../../helpers/tableHelper';\nimport { buildAggFunctionAlias } from '../../../helpers/queryHelpers';\nimport { IFindRawWith } from '../../../interfaces/findRawWith.interface';\n\nexport default class PostgresqlClientService<T> extends QueryService {\n private crudSchema: typeof CrudSchema;\n constructor(tableSchema: typeof CrudSchema, poolClient?: DbPool) {\n super(poolClient);\n this.crudSchema = tableSchema;\n }\n\n get dbSchema() {\n return this.crudSchema.schema || DEFAULT_PG_SCHEMA;\n }\n\n get tableName() {\n return (\n getTableName(this.crudSchema.table, 'alias') ||\n getTableName(this.crudSchema.table)\n );\n }\n\n get isTemporalTable() {\n return this.crudSchema?.isTemporalTable;\n }\n\n getWildcardValue(operator: FilterOperator, value: string): string {\n if (\n operator === FilterOperator.CONTAINS ||\n operator === FilterOperator.NOT_CONTAINS\n ) {\n return '%' + value + '%';\n } else if (operator === FilterOperator.STARTS_WITH) {\n return value + '%';\n } else {\n return value;\n }\n }\n\n private buildClause(\n operator: FilterOperator,\n attribute: string,\n relativePath: string | undefined,\n value: any,\n ): string {\n const formattedValue = literal(value);\n operator = operator\n ? (operator.toUpperCase() as FilterOperator)\n : FilterOperator.EQUAL;\n const postgresOperator = POSTGRES_FILTER_OPERATOR_MAP[operator];\n\n if (!postgresOperator)\n throw new Error(`Unsupported filter operator: ${operator}`);\n\n let property;\n const filterProperty = ident(attribute);\n const columnExists = !!this.crudSchema.columns[attribute];\n const columnType =\n columnExists && this.crudSchema.columns[attribute]?.type;\n\n if (relativePath != undefined) {\n const attributePath = relativePath.split('.').join(',');\n\n property = `(\"${attribute}\" #> '{${attributePath}}')`;\n if (value != null) {\n const comparisonValueType =\n this.getValueTypeAsPostgresDefinition(value);\n property += `::${comparisonValueType}`;\n }\n } else {\n property = columnExists\n ? filterProperty\n : `(\"qvAttributes\" ->> '${attribute}')`;\n }\n\n if (operator === FilterOperator.IN) {\n const formattedValues = Array.isArray(value)\n ? value.map(literal)\n : [formattedValue];\n return `${property} ${postgresOperator} (${formattedValues.join(\n ', ',\n )})`;\n }\n\n if (operator === FilterOperator.BETWEEN) {\n return `${property} ${postgresOperator} ${value[0]} AND ${value[1]}`;\n }\n\n /**\n * ? Additional filter to avoid error when column accepts null values.\n */\n if (operator === FilterOperator.NOT_EQUAL && value !== null) {\n return `(${property} ${postgresOperator} ${literal(\n value,\n )} OR ${property} IS NULL)`;\n }\n\n if (\n operator === FilterOperator.NOT_EXIST ||\n operator === FilterOperator.EXIST\n ) {\n return `${property} ${postgresOperator}`;\n }\n\n if (\n (operator === FilterOperator.CONTAINS ||\n operator === FilterOperator.NOT_CONTAINS) &&\n columnType === 'array'\n ) {\n const filterValue =\n typeof value === 'number' ? value : `'${value}'`;\n let filterString = `${filterValue} = ANY(${property})`;\n\n if (operator === FilterOperator.NOT_CONTAINS) {\n if (value === null) {\n filterString = `(NOT (${filterString}))`;\n } else {\n filterString = `(NOT (${filterString}) or ${property} IS NULL)`;\n }\n }\n return filterString;\n }\n\n const wildcardValue = this.getWildcardValue(operator, value);\n return `${property} ${postgresOperator} ${literal(wildcardValue)}`;\n }\n\n private buildFilterClause(\n filters: IFilter[] | ICompositeFilter,\n logicOperator?: FilterLogicOperator,\n ): string {\n if (Array.isArray(filters)) {\n const filterClauses = filters.map((filter) => {\n return this.buildClause(\n filter.operator as FilterOperator,\n filter.attribute,\n filter.relativePath,\n filter.value,\n );\n });\n return filterClauses.join(\n ` ${logicOperator ?? FILTER_LOGIC_OPERATORS.AND} `,\n );\n } else {\n return this.buildQueryByClause(filters);\n }\n }\n\n private isCompositeFilter = function (value: any) {\n return 'OR' in value || 'AND' in value;\n };\n\n buildQueryByClause(filters: IFilter[] | ICompositeFilter): string {\n let filterClauses: string = '';\n let isFirstFilter = true;\n\n for (const [key, value] of Object.entries(filters)) {\n if (!isFirstFilter) {\n filterClauses += key === 'AND' ? ' AND ' : ' OR ';\n }\n\n if (this.isCompositeFilter(value)) {\n filterClauses += '(';\n filterClauses += this.buildQueryByClause(\n value as ICompositeFilter,\n );\n filterClauses += ')';\n } else {\n (value as IFilter[]).forEach((filter: IFilter) => {\n let clause = '';\n if (this.isCompositeFilter(filter)) {\n clause = `(${this.buildQueryByClause(\n filter as ICompositeFilter,\n )})`;\n } else {\n clause = this.buildClause(\n filter.operator as FilterOperator,\n filter.attribute,\n filter.relativePath,\n filter.value,\n );\n }\n filterClauses += `${clause} ${key} `;\n });\n }\n\n isFirstFilter = false;\n }\n\n filterClauses = filterClauses.replace(/\\s+(AND|OR)\\s*$/, '');\n return filterClauses;\n }\n\n private formatOrderByItem(sort: ISorting): string {\n return `${ident(sort.column)} ${sort.direction || SORT_DIRECTIONS.ASC}`;\n }\n\n private buildOrderByClause(querySorting: ISorting[]): string {\n try {\n return querySorting.map(this.formatOrderByItem).join(', ');\n } catch (error) {\n return '';\n }\n }\n\n formatArray(array: any[]) {\n const isNumberArray = typeof array[0] === 'number';\n if (isNumberArray) {\n return `{${array.join(',')}}`;\n } else {\n return `{${array.map((val) => `\"${val}\"`).join(',')}}`;\n }\n }\n\n formatValue(value: any) {\n if (Array.isArray(value)) {\n if (!value?.length) return '{}';\n const isNumberArray = typeof value[0] === 'number';\n if (isNumberArray) {\n return `{${value.join(',')}}`;\n } else {\n return `{${value.map((val: any) => `\"${val}\"`).join(',')}}`;\n }\n }\n return value;\n }\n\n async createCommand(data: any[]): Promise<any> {\n const keys = Object.keys(data[0]); // Assuming all objects have the same keys\n const values = data.map((item) =>\n keys.map((key) => this.formatValue(item[key])),\n );\n\n const query = format(\n `INSERT INTO ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )} (%I) VALUES %L RETURNING *;`,\n keys,\n values,\n );\n\n return this.runQuery(query);\n }\n\n private isValidFiltersInput(\n filters: IFilter[] | ICompositeFilter,\n ): boolean {\n const isValidArrayFilters =\n Array.isArray(filters) && filters?.length > 0;\n const isValidCompositeFilters = this.isCompositeFilter(filters);\n return isValidArrayFilters || isValidCompositeFilters;\n }\n\n private replaceFilterTokensInQuery(\n query: string,\n filters?: IFilter[] | ICompositeFilter,\n ) {\n if (!filters) return query;\n\n if (this.isValidFiltersInput(filters)) {\n const filterClause = this.buildFilterClause(filters);\n return query.replace(/{{filters}}/g, filterClause);\n }\n }\n\n private addFiltersToQuery(\n query: string,\n filters?: IFilter[] | ICompositeFilter,\n ): string {\n if (!filters) return query;\n\n if (this.isValidFiltersInput(filters))\n query += ` WHERE ${this.buildFilterClause(filters)}`;\n return query;\n }\n\n addOrderByToQuery(query: string, orderBy?: ISorting[]): string {\n if (orderBy) query += ` ORDER BY ${this.buildOrderByClause(orderBy)}`;\n return query;\n }\n\n private addPaginationToQuery(\n query: string,\n pagination?: IFindPagination,\n ): string {\n if (pagination) {\n const { limit, from } = pagination;\n if (limit) query += ` LIMIT ${limit}`;\n if (from) query += ` OFFSET ${from}`;\n }\n return query;\n }\n\n private getSelectClause(\n aggregateFunction: AggregateFunction | undefined,\n fields: string[] = [],\n ) {\n if (aggregateFunction)\n return `CAST(${aggregateFunction}(1) AS INTEGER) AS \"${buildAggFunctionAlias(\n aggregateFunction,\n )}\"`;\n if (!fields?.length) return '*';\n\n return this.parseFields(fields).join(', ');\n }\n\n private parseFields(fields: String[]): String[] {\n const columnsFromSchema: String[] = Object.keys(\n this.crudSchema.columns,\n );\n const attributes: String[] = fields\n .filter((field) => columnsFromSchema.indexOf(field) !== -1)\n .map((field) => `\"${field}\"`);\n\n fields\n .filter((field) => columnsFromSchema.indexOf(field) === -1)\n .forEach((field) => {\n attributes.push(`\"qvAttributes\" ->> '${field}' as \"${field}\"`);\n });\n return attributes;\n }\n\n private resolveWithQueries(rawWith: IFindRawWith[]): string[] {\n const withQueries = rawWith.map(({ alias, query, filters }) => {\n const withQuery = this.replaceFilterTokensInQuery(query, filters);\n return `${alias} AS (${withQuery})`;\n });\n return withQueries;\n }\n\n getRawWithClause(rawWith?: IFindRawWith[]): string {\n let rawWithClause = '';\n if (rawWith?.length) {\n const withQueries = this.resolveWithQueries(rawWith);\n rawWithClause = 'WITH ' + withQueries.join(',\\n');\n }\n return rawWithClause;\n }\n\n getQueryFrom() {\n return this.isTemporalTable\n ? ident(this.tableName)\n : `${ident(this.dbSchema)}.${ident(this.tableName)}`;\n }\n\n async findCommand(options: IFindOptions = {}): Promise<T[]> {\n const rawWithClause = this.getRawWithClause(options.rawWith);\n let query = `SELECT ${this.getSelectClause(\n options.aggregateFunction,\n options.fields,\n )} FROM ${this.getQueryFrom()}`;\n query = this.addFiltersToQuery(query, options.filters);\n if (!options.aggregateFunction) {\n query = this.addOrderByToQuery(query, options.sorting);\n query = this.addPaginationToQuery(query, options.pagination);\n }\n if (rawWithClause) {\n query = `${rawWithClause} ${query}`;\n }\n return (await this.runQuery(query)).rows;\n }\n\n sanitizeValue(value: any): string {\n if (Array.isArray(value)) {\n if (value.length === 0) '[]';\n const formattedArray = value\n .map((item) => {\n if (typeof item === 'string') {\n return `'${item}'`;\n } else if (typeof item === 'object') {\n return JSON.stringify(item);\n } else {\n return item;\n }\n })\n .join(',');\n\n return JSON.stringify(formattedArray);\n } else {\n return literal(value);\n }\n }\n\n async updateCommand(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<any>,\n ): Promise<QueryResult<any>> {\n let query = `UPDATE ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )} SET`;\n\n const updateClauses = Object.entries(data).map(([key, value]) => {\n const dbValue = literal(this.formatValue(value));\n return `${ident(key)} = ${dbValue}`;\n });\n query += ` ${updateClauses.join(', ')}`;\n\n query += ' WHERE ';\n query += this.buildFilterClause(filters);\n\n return this.runQuery(query);\n }\n\n async upsertCommand(\n keyColumnNames: string[],\n data: T\n ): Promise<any> {\n const updateClauses = (keyColumnNames?.length &&\n Object.entries(data as any)\n .filter(([key]) => !keyColumnNames.includes(key))\n .map(([key, value]) => {\n const dbValue = literal(this.formatValue(value));\n return `${ident(key)} = ${dbValue}`;\n })) || [];\n \n if (!updateClauses?.length)\n return this.createCommand([data]);\n \n const columnNames = Object.keys(data as any); // Assuming all objects have the same keys\n const values = columnNames.map((key) => this.formatValue((data as any)[key]));\n\n let query = format(`INSERT INTO ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )} (%I) VALUES (%L) ON CONFLICT (%I) DO UPDATE SET`, columnNames, values, keyColumnNames);\n\n query += ` ${updateClauses.join(', ')} RETURNING *;`;\n\n return this.runQuery(query);\n }\n\n private buildFilterClauseForFilterGroups(\n filterGroups: IFilter[][],\n ): string {\n const filterClauses = filterGroups.map((filterGroup) => {\n return `(${this.buildFilterClause(filterGroup)})`;\n });\n return filterClauses.join(' OR ');\n }\n\n async deleteCommand(\n filters?: ICompositeFilter | IFilter[] | IFilter[][],\n useFilterGroups: boolean = false,\n ): Promise<QueryResult<any>> {\n let query = `DELETE FROM ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )}`;\n if (filters) {\n query += ' WHERE ';\n\n if (useFilterGroups) {\n query += this.buildFilterClauseForFilterGroups(\n filters as IFilter[][],\n );\n } else {\n query += this.buildFilterClause(\n filters as ICompositeFilter | IFilter[],\n );\n }\n }\n\n return this.runQuery(query);\n }\n\n query(queryText: string, values?: any[]) {\n return this.runQuery(queryText, values);\n }\n\n public async updateExpressionCommand(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: Partial<IUpdateExpressionsOptions> = {},\n ) {\n let query = `UPDATE ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )} SET`;\n\n const set = actions.SET || [];\n const add = actions.ADD || [];\n const columns = this.crudSchema.columns;\n\n const setValues = this.replacePathAndValueByAttributeNames(\n set,\n options,\n columns,\n DYNAMO_DB_UPDATE_ACTIONS.SET,\n );\n const addValues = this.replacePathAndValueByAttributeNames(\n add,\n options,\n columns,\n DYNAMO_DB_UPDATE_ACTIONS.ADD,\n );\n\n const setValuesAndAddValues: any = setValues.concat(addValues);\n\n const updateClauses: any = [];\n const jsonSetExpressionGroup: any = {};\n const queryFunctions: any = [];\n\n setValuesAndAddValues.forEach((expression: any) => {\n const { path, value, createNewColumn, actionName, dynamoFuncName } =\n expression;\n\n //Dynamo functions replacement\n if (dynamoFuncName) {\n queryFunctions.push({ path, value, dynamoFuncName });\n }\n\n if (path.includes('.') && !dynamoFuncName) {\n const jsonExpr = this.getJSONBSetExpressionByAction(\n path,\n value,\n {\n createNewColumn,\n actionName,\n },\n );\n const columnName: string = jsonExpr.columnName;\n if (!jsonSetExpressionGroup[columnName]) {\n jsonSetExpressionGroup[columnName] = [jsonExpr];\n } else {\n jsonSetExpressionGroup[columnName].push(jsonExpr);\n }\n } else if (!dynamoFuncName) {\n let expValue;\n let columnName = path;\n let setObjProperty = false;\n let column = this.crudSchema.columns[columnName];\n\n let columnType = column?.type;\n if (!columnType) {\n setObjProperty = true;\n columnName = 'qvAttributes';\n column = this.crudSchema.columns[columnName];\n if (column?.type == undefined)\n throw `Column type definition for column: (${path}) must be in the CrudSchema`;\n\n columnType = Array.isArray(value) ? 'array' :\n typeof value == 'object' ? 'object' :\n 'default';\n }\n\n switch (columnType) {\n case 'object':\n {\n const valueSerialized = `${JSON.stringify(\n value,\n ).replace(/'/g, \"''\")}`;\n expValue = `'${valueSerialized}'::jsonb`;\n }\n break;\n case 'array':\n expValue = `ARRAY[${literal(value)}]`;\n break;\n default:\n expValue = literal(value);\n break;\n }\n\n if (setObjProperty) {\n expValue = `jsonb_set(${ident(columnName)}, '{${path}}', ${expValue}, true)`;\n }\n\n updateClauses.push(`${ident(columnName)} = ${expValue}`);\n }\n });\n\n this.setCommonColumnsQueryFunctions(\n jsonSetExpressionGroup,\n queryFunctions,\n );\n\n if (Object.keys(jsonSetExpressionGroup).length > 0) {\n Object.keys(jsonSetExpressionGroup).forEach((groupIndex) => {\n const jsonSetExpression = this.buildJSONBExpression(\n jsonSetExpressionGroup[groupIndex],\n 'jsonb_set',\n );\n\n updateClauses.push(`${groupIndex} = ${jsonSetExpression}`);\n });\n }\n\n //This is for dynamo functions transformed to postgresql functions\n this.buildUpdateClausesFormDynamoFunctions(\n queryFunctions,\n updateClauses,\n );\n\n query += ` ${updateClauses.join(', ')}`;\n\n query += ' WHERE ';\n query += this.buildFilterClause(filters);\n\n return this.runQuery(query);\n }\n\n private buildUpdateClausesFormDynamoFunctions(\n queryFunctions: any,\n updateClauses: any,\n ) {\n if (queryFunctions.length > 0) {\n queryFunctions.forEach((queryFunction: any) => {\n if (typeof queryFunction.value == 'object') {\n const jsonExpr = this.buildJSONBExpression(\n queryFunction.value.jsonExpression,\n 'jsonb_insert',\n );\n updateClauses.push(\n `${ident(queryFunction.path)} = ${jsonExpr}`,\n );\n } else {\n updateClauses.push(\n `${ident(queryFunction.path)} = ${queryFunction.value}`,\n );\n }\n });\n }\n }\n\n private setCommonColumnsQueryFunctions(\n jsonSetExpressionGroup: any,\n queryFunctions: any,\n ) {\n Object.keys(jsonSetExpressionGroup).forEach((jsonSetExpr: any) => {\n queryFunctions.forEach((queryFunction: any, index: number) => {\n const columnPath = `\"${queryFunction.path}\"`;\n if (columnPath === jsonSetExpr) {\n jsonSetExpressionGroup[jsonSetExpr].push({\n ...queryFunction,\n isCommonColumn: true,\n });\n delete queryFunctions[index];\n }\n });\n });\n }\n\n /**\n * @description Builds a jsonb expression like jsonb_insert, or jsonb_set\n * @param jsonSetExpressions\n * @param functionName\n * @returns\n */\n private buildJSONBExpression(\n jsonSetExpressions: any,\n functionName: string,\n ) {\n let jsonSetStringExpr = '';\n jsonSetExpressions.forEach((expression: any, index: number) => {\n let _tempFunctionName = functionName;\n let { columnName, jsonExpr } = expression;\n //Is a common column for dynamoDBFunctions\n if (expression.isCommonColumn) {\n const jsonExpression = expression.value.jsonExpression[0];\n _tempFunctionName = jsonExpression.functionName;\n jsonExpr = jsonExpression.jsonExpr;\n columnName = jsonExpression.columnName;\n }\n if (index === 0) {\n jsonSetStringExpr = `${_tempFunctionName}(${columnName},${jsonExpr})`;\n } else {\n jsonSetStringExpr = `${_tempFunctionName}(${jsonSetStringExpr},${jsonExpr})`;\n }\n });\n return jsonSetStringExpr;\n }\n\n /**\n * @description Serializes a JSON value\n * @param value\n * @returns\n */\n private serializeJSONValue(value: any) {\n const valueSerialized =\n typeof value == 'object'\n ? `${JSON.stringify(value).replace(/'/g, \"''\")}`\n : value;\n return valueSerialized;\n }\n\n private getJSONBSetExpressionByAction(\n path: string,\n value: any,\n options: any,\n ) {\n path = path.replace(/\\[(\\d+)\\]/g, '.$1');\n const pathSplitted = path.split('.');\n const parentPath = pathSplitted[0];\n const { createNewColumn, actionName } = options;\n\n const pathSerialized = pathSplitted.slice(1).join(',');\n const valueSerialized = `'${JSON.stringify(value).replace(\n /'/g,\n \"''\",\n )}'`;\n\n if (actionName == DYNAMO_DB_UPDATE_ACTIONS.ADD) {\n if (typeof value != 'string' && !isNaN(value)) {\n const resultExpr = {\n jsonExpr: `'{${pathSerialized}}',to_jsonb(COALESCE((\"${parentPath}\"#>'{${pathSerialized}}')::numeric,0) + ${valueSerialized})`,\n columnName: `\"${parentPath}\"`,\n };\n return resultExpr;\n }\n }\n return {\n jsonExpr: `'{${pathSerialized}}',${valueSerialized},${createNewColumn}`,\n columnName: `\"${parentPath}\"`,\n };\n }\n\n private getListAppendDefFromValue(queryValue: string, columnType: string) {\n const regexListAppend = /list_append\\(([^)]+)\\)/gm;\n const listAppendString = 'list_append(';\n\n const matchList = queryValue.match(regexListAppend) || [];\n const groupResult = matchList[0];\n\n if (groupResult) {\n const attributesFromGroup = groupResult\n .slice(listAppendString.length, -1)\n .split(',');\n const attributes = {\n originalString: groupResult,\n path: attributesFromGroup[0].trim(),\n value: attributesFromGroup.slice(1).join(',').trim(),\n isDynamoFunction: true,\n functionExpr: '',\n jsonExpression: [{}],\n };\n if (columnType == 'array') {\n attributes['functionExpr'] =\n this.buildArrayAppendExpr(attributes);\n } else {\n attributes['jsonExpression'] =\n this.buildJsonbInsertExpr(attributes);\n }\n return attributes;\n }\n\n return null;\n }\n\n private buildArrayAppendExpr(params: any) {\n const arrayPath = params.path.split('.');\n const columnName = arrayPath.shift();\n return `ARRAY_APPEND(\"${columnName}\",${params.value})`;\n }\n\n private buildJsonbInsertExpr(params: any) {\n const arrayPath = params.path.split('.');\n const columnName = arrayPath.shift();\n const options = {\n isDynamoFunction: params?.isDynamoFunction,\n relativePath:\n arrayPath.length && Array.isArray(arrayPath) ? arrayPath : [],\n };\n const jsonbInsertExpressions =\n this.getExpressionsByDefinitionForJSONBInsert(\n columnName,\n params.value,\n options,\n );\n\n return jsonbInsertExpressions;\n }\n\n private getExpressionsByDefinitionForJSONBInsert(\n columnName: string,\n value: string,\n options: any,\n ) {\n const jsonbInsertExpressions = [];\n let pathToAffect = '0';\n if (options.isDynamoFunction == true) {\n options.relativePath.push('0');\n pathToAffect = options.relativePath.join(',');\n }\n try {\n const parsedValue = JSON.parse(value);\n\n if (Array.isArray(parsedValue)) {\n parsedValue.forEach((arrayValue) => {\n arrayValue =\n typeof arrayValue == 'string'\n ? `\"${arrayValue}\"`\n : arrayValue;\n jsonbInsertExpressions.push({\n jsonExpr: `'{${pathToAffect}}','${this.serializeJSONValue(\n arrayValue,\n )}'`,\n columnName: `\"${columnName}\"`,\n functionName: 'jsonb_insert',\n });\n });\n } else {\n jsonbInsertExpressions.push({\n jsonExpr: `'{${pathToAffect}}','${this.serializeJSONValue(\n parsedValue,\n )}'`,\n columnName: `\"${columnName}\"`,\n functionName: 'jsonb_insert',\n });\n }\n } catch (error) {\n jsonbInsertExpressions.push({\n jsonExpr: `'{${pathToAffect}}','${value}'`,\n columnName: `\"${columnName}\"`,\n functionName: 'jsonb_insert',\n });\n }\n return jsonbInsertExpressions;\n }\n\n private getInsertExprFromJsonbDef(queryValue: string, columnType: string) {\n const listAppendParams = this.getListAppendDefFromValue(\n queryValue,\n columnType,\n );\n if (\n listAppendParams != null &&\n listAppendParams?.jsonExpression.length === 0\n ) {\n queryValue = queryValue.replace(\n listAppendParams.originalString,\n listAppendParams.functionExpr,\n );\n } else {\n return listAppendParams;\n }\n\n return queryValue;\n }\n\n private replacePathAndValueByAttributeNames(\n actions: any[],\n options: IUpdateExpressionsOptions,\n columns: any,\n actionName: string,\n ) {\n return actions.map((action) => {\n action.path = this.replaceExpressionAttributeNames(\n action.path,\n options,\n );\n if (\n typeof action.value == 'string' &&\n action.value.includes('list_append')\n ) {\n action.path = action.path.split('.')[0];\n const column = columns[action.path];\n action.value =\n this.replaceExpressionAttributeValuesForDynamoFunctions(\n action.value,\n options,\n );\n action.value = this.getInsertExprFromJsonbDef(\n action.value,\n column.type,\n );\n action.dynamoFuncName = 'list_append';\n } else {\n action.value = this.replaceExpressionAttributeValues(\n action.value,\n options,\n );\n }\n\n action.actionName = actionName;\n action.createNewColumn = true;\n return action;\n });\n }\n\n private replaceExpressionAttributeValuesForDynamoFunctions(\n value: string,\n options: any,\n ) {\n const { expressionAttributeNames, expressionAttributeValues } = options;\n const exprAttributeNamesKeys = expressionAttributeNames\n ? Object.keys(expressionAttributeNames)\n : [];\n const exprAttributeValuesKeys = expressionAttributeValues\n ? Object.keys(expressionAttributeValues)\n : [];\n\n //Set for attribute names\n if (exprAttributeNamesKeys.length > 0) {\n exprAttributeNamesKeys.forEach((exprAttribute) => {\n value = value.replace(\n exprAttribute,\n expressionAttributeNames[exprAttribute],\n );\n });\n }\n\n //Set for attribute values\n if (exprAttributeValuesKeys.length > 0) {\n exprAttributeValuesKeys.forEach((exprAttribute) => {\n const valueSerialized = this.serializeJSONValue(\n expressionAttributeValues[exprAttribute],\n );\n value = value.replace(exprAttribute, `${valueSerialized}`);\n });\n }\n return value;\n }\n\n private replaceExpressionAttributeNames(\n path: string,\n options: IUpdateExpressionsOptions,\n ) {\n const { expressionAttributeNames } = options;\n\n if (expressionAttributeNames) {\n Object.keys(expressionAttributeNames).forEach(\n (attributeName: string) => {\n const attributeNameValue: string =\n expressionAttributeNames[attributeName];\n path = path.replace(attributeName, attributeNameValue);\n },\n );\n }\n return path;\n }\n\n private replaceExpressionAttributeValues(\n value: string,\n options: IUpdateExpressionsOptions,\n ) {\n const { expressionAttributeValues } = options;\n if (expressionAttributeValues[value] != undefined) {\n return expressionAttributeValues[value];\n }\n\n return value;\n }\n\n private getValueTypeAsPostgresDefinition(value: any) {\n switch (typeof value) {\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'string':\n default:\n return 'text';\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport PostgresqlClientService from './postgreSqlClient.service';\nimport {\n ICompositeFilter,\n ICreateMultipleResponse,\n ICrudService,\n IFilter,\n IFindOptions,\n IFindResult,\n IRemoveOptions,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n IUpdateOptions,\n} from '../../../interfaces';\nimport { CrudSchema } from '../../../schemas';\nimport { findIdColumnName } from '../../../helpers/tableHelper';\nimport { AGGREGATE_FUNCTIONS } from '../../../utils/constants';\nimport { buildAggFunctionAlias } from '../../../helpers/queryHelpers';\nimport { PersistenceErrorWrapper } from '../../../helpers/errorHelper';\nimport { DbPool } from '../../../types';\nexport class PostgreSqlCrudService<T>\n extends PostgresqlClientService<T>\n implements ICrudService<T>\n{\n constructor(\n private tableSchema: typeof CrudSchema,\n poolClient?: DbPool,\n ) {\n super(tableSchema, poolClient);\n }\n\n private get idColumnName(): string | undefined {\n return findIdColumnName(this.tableSchema.columns);\n }\n\n normalizeInputData(inputData: any) {\n inputData.qvAttributes = {};\n for (const key in inputData) {\n if (!this.tableSchema.columns[key] && key !== 'qvAttributes') {\n inputData.qvAttributes[key] = inputData[key];\n delete inputData[key];\n } else if (\n Array.isArray(inputData[key]) &&\n this.tableSchema.columns[key]?.type !== 'array'\n ) {\n inputData[key] = JSON.stringify(inputData[key]);\n }\n }\n }\n\n getItem(data: { [key: string]: any }): any {\n const schemaColumns = Object.entries(this.tableSchema.columns);\n schemaColumns.forEach(([key, value]) => {\n if (value.type === 'big_number') {\n if (data[key]) data[key] = Number(data[key]);\n }\n });\n const resultItem = { ...data, ...data.qvAttributes };\n delete resultItem['qvAttributes'];\n return resultItem;\n }\n\n prepareData(data: T): any {\n const inputData = { ...data } as { [key: string]: any };\n this.normalizeInputData(inputData);\n return inputData;\n }\n\n buildCreateResponseBatch(result: any): ICreateMultipleResponse {\n const rows = Array.isArray(result?.rows) ? result.rows : [];\n return {\n items: rows.map((r: any) => this.getItem(r)),\n unprocessedItems: [],\n };\n }\n\n create(data: T | T[]): Promise<T | ICreateMultipleResponse> {\n if (Array.isArray(data)) {\n const inputDataArray = data.map((item) => this.prepareData(item));\n return this.createCommand(inputDataArray).then((result) => {\n return this.buildCreateResponseBatch(result);\n });\n } else {\n const inputData = this.prepareData(data);\n return this.createCommand([inputData]).then((result) =>\n result.rowCount ? this.getItem(result.rows[0]) : null,\n );\n }\n }\n\n findItem(findOptions: IFindOptions): Promise<T | null> {\n return this.findCommand(findOptions).then((data) => {\n return data?.length\n ? this.getItem(data[0] as { [key: string]: any })\n : null;\n });\n }\n\n private async processQueryResult(\n findOptions: IFindOptions,\n omitPagination: boolean = false,\n ): Promise<IFindResult<T>> {\n const rows = await this.findCommand(findOptions);\n const items = rows.map((row) =>\n this.getItem(row as { [key: string]: any }),\n );\n\n const { limit, from } = findOptions?.pagination || {};\n const hasMoreRecords = items.length && items.length === limit;\n const newFrom = limit && hasMoreRecords ? limit + (from || 0) : null;\n\n const result: IFindResult<T> = {\n items,\n pagination: omitPagination ? null : { limit: limit, from: newFrom },\n count: items.length,\n };\n return result;\n }\n\n async find(findOptions: IFindOptions): Promise<IFindResult<T>> {\n return this.processQueryResult(findOptions);\n }\n\n async findAll(findOptions: IFindOptions): Promise<IFindResult<T>> {\n return this.processQueryResult(findOptions, true);\n }\n\n async findCount(findOptions: IFindOptions): Promise<number> {\n const items = await this.findCommand({\n ...findOptions,\n aggregateFunction: AGGREGATE_FUNCTIONS.COUNT,\n });\n\n const aggFunctionProperty = buildAggFunctionAlias(\n AGGREGATE_FUNCTIONS.COUNT,\n );\n const item: any = items.length ? items[0] : {};\n return item[aggFunctionProperty] || 0;\n }\n\n async update(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<T>,\n options: IUpdateOptions = {},\n ): Promise<any> {\n const savedRecord = options?.skipFindItems\n ? {}\n : await this.findItem({ filters });\n\n const inputData: any = {\n ...savedRecord,\n ...data,\n } as {\n [key: string]: any;\n };\n\n const result = await this.updateCommand(filters, this.prepareData(inputData));\n if (options?.returnRowsAffected) {\n return result.rowCount || 0;\n }\n\n return this.getItem(inputData);\n }\n\n async upsert(\n keyColumnNames: string[],\n data: T,\n ): Promise<any> {\n const inputData = this.prepareData(data);\n return this.upsertCommand(keyColumnNames, inputData).then((result) =>\n result.rowCount && result.rows?.length ? this.getItem(result.rows[0]) : null,\n );\n }\n\n async remove(\n filters: IFilter[] | ICompositeFilter | IFilter[][],\n options: IRemoveOptions,\n ): Promise<void> {\n await this.deleteCommand(filters, options?.filterGroups);\n }\n\n runQuery(querySentence: string, values?: any[]) {\n return super.runQuery(querySentence, values);\n }\n\n async updateExpressions(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: IUpdateExpressionsOptions,\n ): Promise<any> {\n const result = await this.updateExpressionCommand(\n filters,\n actions,\n options,\n );\n return PersistenceErrorWrapper(result);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n runRawQuery(query: string, params: any[]): Promise<any> {\n return super.runQuery(query, params);\n }\n}\n","import { Pool } from 'pg';\nimport { ICrudService } from '../interfaces';\nimport { CrudSchema } from '../schemas';\nimport { PostgreSqlCrudService, DynamoDbCrudService } from './cruds/';\nexport class CrudFactory {\n static databaseClientService<T>(\n crudSchema: typeof CrudSchema,\n pool?: Pool,\n ): ICrudService<T> {\n const isMultiPlatformMode =\n process.env.PLATFORM_TYPE?.toLowerCase() === 'container';\n\n if (isMultiPlatformMode)\n return new PostgreSqlCrudService<T>(crudSchema, pool);\n return new DynamoDbCrudService<T>(crudSchema);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Pool } from 'pg';\nimport {\n buildQueryIndex,\n buildFilter,\n buildSort,\n} from '../helpers/crudHelpers';\nimport {\n ICompositeFilter,\n ICreateMultipleResponse,\n IFilter,\n IFindOptions,\n IRemoveOptions,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n IUpdateOptions,\n} from '../interfaces';\nimport { CrudSchema } from '../schemas';\nimport { CrudFactory } from './crudFactory.service';\n\nclass CrudService<T> {\n private crudSchema: typeof CrudSchema;\n\n constructor(\n crudSchema: typeof CrudSchema,\n private pool?: Pool,\n ) {\n this.crudSchema = crudSchema;\n }\n\n private async getCrudServiceInstance() {\n const crudService = await CrudFactory.databaseClientService(\n this.crudSchema,\n this.pool,\n );\n return crudService;\n }\n\n private getDefaultValue(columnName: string): any {\n const column = this.crudSchema.columns[columnName];\n return column ? column.default : undefined;\n }\n\n private setDefaultValues(data: any) {\n const defaultValues: { [key: string]: any } = {};\n const columns = this.crudSchema.columns;\n\n for (const columnName in columns) {\n const missingColumnValue = !(columnName in data);\n const columnDefaultValue = this.getDefaultValue(columnName);\n if (missingColumnValue && columnDefaultValue) {\n defaultValues[columnName] = columnDefaultValue;\n }\n }\n\n return { ...defaultValues, ...data };\n }\n\n create(data: T | T[]): Promise<unknown | ICreateMultipleResponse> {\n const processedData = Array.isArray(data)\n ? data.map(this.setDefaultValues.bind(this))\n : this.setDefaultValues(data);\n\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.create(processedData),\n );\n }\n\n find(options: IFindOptions) {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.find(options),\n );\n }\n\n findItem(options: IFindOptions) {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.findItem(options),\n );\n }\n\n update(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<T>,\n options: IUpdateOptions = {},\n ): Promise<T | null> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.update(filters, data, options),\n );\n }\n\n upsert(\n keyColumnNames: string[],\n data: T,\n ): Promise<T | null> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.upsert(keyColumnNames, data),\n );\n }\n\n remove(\n filters: IFilter[] | ICompositeFilter | IFilter[][],\n options: IRemoveOptions = {},\n ): Promise<void> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.remove(filters, options),\n );\n }\n\n findAll(options: IFindOptions) {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const { pagination, ...findAllOptions } = options;\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.findAll(findAllOptions),\n );\n }\n\n findCount(findCountOptions: IFindOptions): Promise<number> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.findCount(findCountOptions),\n );\n }\n\n buildFilter(\n attribute: string,\n value: any,\n operator = 'EQUAL',\n relativePath = undefined,\n ) {\n return buildFilter(attribute, value, operator, relativePath);\n }\n\n buildQueryIndex(indexName: string, columns: string[]) {\n return buildQueryIndex(indexName, columns);\n }\n\n buildSort(column: string, direction: string) {\n return buildSort(column, direction);\n }\n\n updateExpression(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options?: IUpdateExpressionsOptions,\n ): Promise<T | null> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.updateExpressions(filters, actions, options),\n );\n }\n\n runRawQuery(query: string, params: any[]) {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.runRawQuery(query, params),\n );\n }\n}\n\nexport default CrudService;\n","import { PoolClient } from 'pg';\nimport { ITableName, ITableColumns } from '../interfaces';\n\nexport class CrudSchema {\n static table: string | ITableName;\n static columns: ITableColumns;\n static usePool?: boolean = false;\n static schema: string | null = null;\n static poolClient?: PoolClient;\n static isTemporalTable: boolean = false;\n}\n","import { FILTER_LOGIC_OPERATORS } from '../utils/constants';\n\nconst VALID_FILTER_LOGIC_OPERATORS: FILTER_LOGIC_OPERATORS[] = Object.values(\n FILTER_LOGIC_OPERATORS,\n);\n\nexport type FilterLogicOperator = (typeof VALID_FILTER_LOGIC_OPERATORS)[number];\n","import { CONNECTION_CLOSING_MODES } from '../utils/constants';\n\nconst VALID_CONNECTION_CLOSING_MODES: CONNECTION_CLOSING_MODES[] =\n Object.values(CONNECTION_CLOSING_MODES);\n\nexport type ConnectionClosingMode =\n (typeof VALID_CONNECTION_CLOSING_MODES)[number];\n","import { Pool, PoolConfig } from 'pg';\nimport { getConnectionAlias, isMultiPlatformMode } from '../utils/constants';\nimport { registerPool } from './connectionRegistry';\n\nexport const DEFAULT_DB_POOL_CONFIG: PoolConfig = {\n max: 20,\n connectionTimeoutMillis: 10 * 1000,\n idleTimeoutMillis: 30 * 1000 /** DB cluster's idle timeout is 60 s */,\n keepAlive: true,\n};\n\nexport function getDbPool(poolConfig?: PoolConfig) {\n if (!isMultiPlatformMode()) return undefined;\n\n const pool = new Pool({\n ...DEFAULT_DB_POOL_CONFIG,\n connectionString: process.env.MULTIPLATFORM_PG_CONNECTION_STRING,\n application_name: getConnectionAlias(),\n ...poolConfig /** Custom implementer config */,\n });\n\n registerPool(pool);\n\n pool.on('error', (error: Error) => {\n /** Prevent idle-client connection drops from becoming uncaught exceptions. */\n console.error(\n '[data-persistence] Unexpected PG pool error on idle client',\n error,\n );\n });\n\n return pool;\n}\n"]}
@@ -183,4 +183,7 @@ declare function buildSort(column: string, direction?: string): ISorting;
183
183
  declare const DEFAULT_DB_POOL_CONFIG: PoolConfig;
184
184
  declare function getDbPool(poolConfig?: PoolConfig): Pool | undefined;
185
185
 
186
- export { type AggregateFunction, CrudSchema, CrudService, DEFAULT_DB_POOL_CONFIG, type FilterInput, type ICompositeFilter, type ICrudService, type IFilter, type IFindOptions, type IFindPagination, type IFindResult, type ISorting, type SortDirection, buildFilter, buildQueryIndex, buildSort, getDbPool };
186
+ declare function closeAllPools(): Promise<void>;
187
+ declare function closeAllClients(): Promise<void>;
188
+
189
+ export { type AggregateFunction, CrudSchema, CrudService, DEFAULT_DB_POOL_CONFIG, type FilterInput, type ICompositeFilter, type ICrudService, type IFilter, type IFindOptions, type IFindPagination, type IFindResult, type ISorting, type SortDirection, buildFilter, buildQueryIndex, buildSort, closeAllClients, closeAllPools, getDbPool };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@qrvey/data-persistence",
3
3
  "types": "dist/types/index.d.ts",
4
4
  "main": "dist/cjs/index.js",
5
- "version": "0.5.17-763",
5
+ "version": "0.5.18-796",
6
6
  "license": "MIT",
7
7
  "exports": {
8
8
  ".": {