sonamu 0.7.21 → 0.7.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/agents/agent.d.ts +6 -1
- package/dist/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/agents/agent.js +20 -5
- package/dist/api/base-frame.d.ts +4 -0
- package/dist/api/base-frame.d.ts.map +1 -1
- package/dist/api/base-frame.js +9 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +2 -2
- package/dist/api/config.d.ts +35 -3
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/decorators.d.ts +4 -4
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +80 -18
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +2 -1
- package/dist/api/secret.d.ts +7 -0
- package/dist/api/secret.d.ts.map +1 -0
- package/dist/api/secret.js +17 -0
- package/dist/api/sonamu.d.ts +17 -8
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +265 -47
- package/dist/cache/cache-manager.d.ts +11 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +22 -0
- package/dist/cache/decorator.d.ts +31 -0
- package/dist/cache/decorator.d.ts.map +1 -0
- package/dist/cache/decorator.js +86 -0
- package/dist/cache/drivers.d.ts +33 -0
- package/dist/cache/drivers.d.ts.map +1 -0
- package/dist/cache/drivers.js +36 -0
- package/dist/cache/index.d.ts +4 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +8 -0
- package/dist/cache/types.d.ts +28 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +6 -0
- package/dist/database/base-model.d.ts +4 -2
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +9 -4
- package/dist/database/code-generator.d.ts +3 -1
- package/dist/database/code-generator.d.ts.map +1 -1
- package/dist/database/code-generator.js +3 -2
- package/dist/database/db.d.ts +1 -1
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +5 -5
- package/dist/database/knex.d.ts +3 -0
- package/dist/database/knex.d.ts.map +1 -0
- package/dist/database/knex.js +29 -0
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +49 -5
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/logger/category.d.ts +4 -0
- package/dist/logger/category.d.ts.map +1 -0
- package/dist/logger/category.js +34 -0
- package/dist/logger/configure.d.ts +9 -0
- package/dist/logger/configure.d.ts.map +1 -0
- package/dist/logger/configure.js +115 -0
- package/dist/migration/code-generation.d.ts +5 -1
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +13 -7
- package/dist/migration/migrator.d.ts +1 -1
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +7 -7
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +5 -3
- package/dist/naite/naite.d.ts +0 -4
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +11 -19
- package/dist/ssr/index.d.ts +4 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +4 -0
- package/dist/ssr/registry.d.ts +10 -0
- package/dist/ssr/registry.d.ts.map +1 -0
- package/dist/ssr/registry.js +43 -0
- package/dist/ssr/renderer.d.ts +6 -0
- package/dist/ssr/renderer.d.ts.map +1 -0
- package/dist/ssr/renderer.js +70 -0
- package/dist/ssr/types.d.ts +19 -0
- package/dist/ssr/types.d.ts.map +1 -0
- package/dist/ssr/types.js +4 -0
- package/dist/syncer/syncer.d.ts +1 -0
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +58 -1
- package/dist/tasks/decorator.d.ts +1 -0
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +9 -7
- package/dist/tasks/step-wrapper.d.ts +5 -0
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.js +11 -6
- package/dist/tasks/workflow-manager.d.ts +2 -0
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +5 -2
- package/dist/template/implementations/entry-server.template.d.ts +17 -0
- package/dist/template/implementations/entry-server.template.d.ts.map +1 -0
- package/dist/template/implementations/entry-server.template.js +78 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +5 -3
- package/dist/template/implementations/queries.template.d.ts +17 -0
- package/dist/template/implementations/queries.template.d.ts.map +1 -0
- package/dist/template/implementations/queries.template.js +83 -0
- package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_enums_select.template.js +34 -20
- package/dist/template/implementations/view_form.template.d.ts +2 -1
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +301 -129
- package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_id_async_select.template.js +136 -57
- package/dist/template/implementations/view_list.template.d.ts +2 -0
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +392 -227
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
- package/dist/template/implementations/view_search_input.template.js +46 -30
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +2 -2
- package/dist/testing/bootstrap.d.ts +28 -0
- package/dist/testing/bootstrap.d.ts.map +1 -0
- package/dist/testing/bootstrap.js +120 -0
- package/dist/testing/fixture-loader.d.ts +21 -0
- package/dist/testing/fixture-loader.d.ts.map +1 -0
- package/dist/testing/fixture-loader.js +28 -0
- package/dist/testing/fixture-manager.d.ts +1 -1
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +7 -7
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/naite-vitest-reporter.d.ts +12 -0
- package/dist/testing/naite-vitest-reporter.d.ts.map +1 -0
- package/dist/testing/naite-vitest-reporter.js +17 -0
- package/dist/types/types.d.ts +5 -6
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +7 -8
- package/dist/ui/ai-client.d.ts +3 -1
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +27 -8
- package/dist/ui-web/assets/index-CTYv3qL6.js +92 -0
- package/dist/ui-web/index.html +1 -1
- package/package.json +43 -20
- package/src/ai/agents/agent.ts +38 -19
- package/src/api/base-frame.ts +8 -0
- package/src/api/caster.ts +6 -1
- package/src/api/config.ts +38 -4
- package/src/api/decorators.ts +106 -20
- package/src/api/index.ts +1 -0
- package/src/api/secret.ts +23 -0
- package/src/api/sonamu.ts +334 -61
- package/src/cache/cache-manager.ts +23 -0
- package/src/cache/decorator.ts +116 -0
- package/src/cache/drivers.ts +42 -0
- package/src/cache/index.ts +16 -0
- package/src/cache/types.ts +32 -0
- package/src/database/base-model.ts +7 -3
- package/src/database/code-generator.ts +3 -1
- package/src/database/db.ts +5 -5
- package/src/database/knex.ts +34 -0
- package/src/database/puri.types.ts +2 -3
- package/src/database/upsert-builder.ts +58 -4
- package/src/index.ts +4 -0
- package/src/logger/category.ts +42 -0
- package/src/logger/configure.ts +132 -0
- package/src/migration/code-generation.ts +19 -6
- package/src/migration/migrator.ts +7 -6
- package/src/migration/postgresql-schema-reader.ts +7 -2
- package/src/naite/naite.ts +10 -18
- package/src/shared/web.shared.ts.txt +1 -1
- package/src/ssr/index.ts +13 -0
- package/src/ssr/registry.ts +52 -0
- package/src/ssr/renderer.ts +105 -0
- package/src/ssr/types.ts +20 -0
- package/src/syncer/syncer.ts +59 -0
- package/src/tasks/decorator.ts +20 -4
- package/src/tasks/step-wrapper.ts +14 -5
- package/src/tasks/workflow-manager.ts +9 -1
- package/src/template/implementations/entry-server.template.ts +81 -0
- package/src/template/implementations/model.template.ts +4 -2
- package/src/template/implementations/queries.template.ts +111 -0
- package/src/template/implementations/view_enums_select.template.ts +33 -19
- package/src/template/implementations/view_form.template.ts +324 -145
- package/src/template/implementations/view_id_async_select.template.ts +145 -56
- package/src/template/implementations/view_list.template.ts +446 -236
- package/src/template/implementations/view_search_input.template.ts +45 -29
- package/src/template/zod-converter.ts +4 -1
- package/src/testing/bootstrap.ts +176 -0
- package/src/testing/fixture-loader.ts +28 -0
- package/src/testing/fixture-manager.ts +7 -6
- package/src/testing/index.ts +3 -0
- package/src/testing/naite-vitest-reporter.ts +18 -0
- package/src/types/types.ts +4 -5
- package/src/ui/ai-client.ts +82 -50
- package/dist/template/implementations/view_enums_dropdown.template.d.ts +0 -17
- package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +0 -1
- package/dist/template/implementations/view_enums_dropdown.template.js +0 -50
- package/dist/ui-web/assets/index-B87IyofX.js +0 -92
- package/src/template/implementations/view_enums_dropdown.template.ts +0 -53
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CacheConfig, CacheManager } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* BentoCache 인스턴스를 생성합니다.
|
|
4
|
+
*/
|
|
5
|
+
export declare function createCacheManager(config: CacheConfig): CacheManager;
|
|
6
|
+
/**
|
|
7
|
+
* 테스트 환경용 기본 CacheManager를 생성합니다.
|
|
8
|
+
* 메모리 드라이버만 사용하는 간단한 설정
|
|
9
|
+
*/
|
|
10
|
+
export declare function createTestCacheManager(): CacheManager;
|
|
11
|
+
//# sourceMappingURL=cache-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../src/cache/cache-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEzD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAEpE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,YAAY,CAOrD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BentoCache, bentostore } from "bentocache";
|
|
2
|
+
import { memoryDriver } from "bentocache/drivers/memory";
|
|
3
|
+
/**
|
|
4
|
+
* BentoCache 인스턴스를 생성합니다.
|
|
5
|
+
*/ export function createCacheManager(config) {
|
|
6
|
+
return new BentoCache(config);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 테스트 환경용 기본 CacheManager를 생성합니다.
|
|
10
|
+
* 메모리 드라이버만 사용하는 간단한 설정
|
|
11
|
+
*/ export function createTestCacheManager() {
|
|
12
|
+
return new BentoCache({
|
|
13
|
+
default: "memory",
|
|
14
|
+
stores: {
|
|
15
|
+
memory: bentostore().useL1Layer(memoryDriver({
|
|
16
|
+
maxItems: 1000
|
|
17
|
+
}))
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYWNoZS9jYWNoZS1tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlbnRvQ2FjaGUsIGJlbnRvc3RvcmUgfSBmcm9tIFwiYmVudG9jYWNoZVwiO1xuaW1wb3J0IHsgbWVtb3J5RHJpdmVyIH0gZnJvbSBcImJlbnRvY2FjaGUvZHJpdmVycy9tZW1vcnlcIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVDb25maWcsIENhY2hlTWFuYWdlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQmVudG9DYWNoZSDsnbjsiqTthLTsiqTrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FjaGVNYW5hZ2VyKGNvbmZpZzogQ2FjaGVDb25maWcpOiBDYWNoZU1hbmFnZXIge1xuICByZXR1cm4gbmV3IEJlbnRvQ2FjaGUoY29uZmlnKTtcbn1cblxuLyoqXG4gKiDthYzsiqTtirgg7ZmY6rK97JqpIOq4sOuzuCBDYWNoZU1hbmFnZXLrpbwg7IOd7ISx7ZWp64uI64ukLlxuICog66mU66qo66asIOuTnOudvOydtOuyhOunjCDsgqzsmqntlZjripQg6rCE64uo7ZWcIOyEpOyglVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGVzdENhY2hlTWFuYWdlcigpOiBDYWNoZU1hbmFnZXIge1xuICByZXR1cm4gbmV3IEJlbnRvQ2FjaGUoe1xuICAgIGRlZmF1bHQ6IFwibWVtb3J5XCIsXG4gICAgc3RvcmVzOiB7XG4gICAgICBtZW1vcnk6IGJlbnRvc3RvcmUoKS51c2VMMUxheWVyKG1lbW9yeURyaXZlcih7IG1heEl0ZW1zOiAxMDAwIH0pKSxcbiAgICB9LFxuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJCZW50b0NhY2hlIiwiYmVudG9zdG9yZSIsIm1lbW9yeURyaXZlciIsImNyZWF0ZUNhY2hlTWFuYWdlciIsImNvbmZpZyIsImNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIiLCJkZWZhdWx0Iiwic3RvcmVzIiwibWVtb3J5IiwidXNlTDFMYXllciIsIm1heEl0ZW1zIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxVQUFVLEVBQUVDLFVBQVUsUUFBUSxhQUFhO0FBQ3BELFNBQVNDLFlBQVksUUFBUSw0QkFBNEI7QUFHekQ7O0NBRUMsR0FDRCxPQUFPLFNBQVNDLG1CQUFtQkMsTUFBbUI7SUFDcEQsT0FBTyxJQUFJSixXQUFXSTtBQUN4QjtBQUVBOzs7Q0FHQyxHQUNELE9BQU8sU0FBU0M7SUFDZCxPQUFPLElBQUlMLFdBQVc7UUFDcEJNLFNBQVM7UUFDVEMsUUFBUTtZQUNOQyxRQUFRUCxhQUFhUSxVQUFVLENBQUNQLGFBQWE7Z0JBQUVRLFVBQVU7WUFBSztRQUNoRTtJQUNGO0FBQ0YifQ==
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CacheDecoratorOptions, CacheManager } from "./types";
|
|
2
|
+
type DecoratorTarget = {
|
|
3
|
+
constructor: {
|
|
4
|
+
name: string;
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* 캐시 매니저 참조 설정 (내부 사용)
|
|
9
|
+
*/
|
|
10
|
+
export declare function setCacheManagerRef(manager: CacheManager | null): void;
|
|
11
|
+
/**
|
|
12
|
+
* 캐시 매니저 참조 가져오기 (내부 사용)
|
|
13
|
+
*/
|
|
14
|
+
export declare function getCacheManagerRef(): CacheManager | null;
|
|
15
|
+
/**
|
|
16
|
+
* @cache 데코레이터
|
|
17
|
+
*
|
|
18
|
+
* 메서드의 결과를 캐싱합니다.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* class UserModelClass extends BaseModel {
|
|
22
|
+
* @cache({ ttl: '10m', tags: ['user'] })
|
|
23
|
+
* @api()
|
|
24
|
+
* async findById(id: number) {
|
|
25
|
+
* return this.findOne(['id', id]);
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
*/
|
|
29
|
+
export declare function cache(options?: CacheDecoratorOptions): (_target: DecoratorTarget, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorator.d.ts","sourceRoot":"","sources":["../../src/cache/decorator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnE,KAAK,eAAe,GAAG;IAAE,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAKzD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAErE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,GAAG,IAAI,CAExD;AAoDD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,OAAO,GAAE,qBAA0B,IAC/C,SAAS,eAAe,EAAE,aAAa,MAAM,EAAE,YAAY,kBAAkB,wBA2BtF"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { BaseModelClass } from "../database/base-model.js";
|
|
2
|
+
// 캐시 매니저 참조 (Sonamu.init에서 설정됨)
|
|
3
|
+
let cacheManagerRef = null;
|
|
4
|
+
/**
|
|
5
|
+
* 캐시 매니저 참조 설정 (내부 사용)
|
|
6
|
+
*/ export function setCacheManagerRef(manager) {
|
|
7
|
+
cacheManagerRef = manager;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 캐시 매니저 참조 가져오기 (내부 사용)
|
|
11
|
+
*/ export function getCacheManagerRef() {
|
|
12
|
+
return cacheManagerRef;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 캐시 키 생성
|
|
16
|
+
*/ function generateCacheKey(modelName, methodName, args, keyOption) {
|
|
17
|
+
// 커스텀 키 함수 사용
|
|
18
|
+
if (typeof keyOption === "function") {
|
|
19
|
+
return keyOption(...args);
|
|
20
|
+
}
|
|
21
|
+
// 문자열 키 + args suffix
|
|
22
|
+
if (typeof keyOption === "string") {
|
|
23
|
+
const argsSuffix = serializeArgs(args);
|
|
24
|
+
return argsSuffix ? `${keyOption}:${argsSuffix}` : keyOption;
|
|
25
|
+
}
|
|
26
|
+
// 자동 생성: ModelName.methodName:serializedArgs
|
|
27
|
+
const baseKey = `${modelName}.${methodName}`;
|
|
28
|
+
const argsSuffix = serializeArgs(args);
|
|
29
|
+
return argsSuffix ? `${baseKey}:${argsSuffix}` : baseKey;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 인자 직렬화
|
|
33
|
+
*/ function serializeArgs(args) {
|
|
34
|
+
if (args.length === 0) return "";
|
|
35
|
+
// 단일 primitive 값
|
|
36
|
+
if (args.length === 1) {
|
|
37
|
+
const arg = args[0];
|
|
38
|
+
if (arg === null || arg === undefined) return "";
|
|
39
|
+
if (typeof arg === "string" || typeof arg === "number" || typeof arg === "boolean") {
|
|
40
|
+
return String(arg);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// 복잡한 값은 JSON 직렬화
|
|
44
|
+
try {
|
|
45
|
+
return JSON.stringify(args);
|
|
46
|
+
} catch {
|
|
47
|
+
// 직렬화 실패 시 toString 사용
|
|
48
|
+
return args.map((arg)=>String(arg)).join(":");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @cache 데코레이터
|
|
53
|
+
*
|
|
54
|
+
* 메서드의 결과를 캐싱합니다.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* class UserModelClass extends BaseModel {
|
|
58
|
+
* @cache({ ttl: '10m', tags: ['user'] })
|
|
59
|
+
* @api()
|
|
60
|
+
* async findById(id: number) {
|
|
61
|
+
* return this.findOne(['id', id]);
|
|
62
|
+
* }
|
|
63
|
+
* }
|
|
64
|
+
*/ export function cache(options = {}) {
|
|
65
|
+
return (_target, propertyKey, descriptor)=>{
|
|
66
|
+
const originalMethod = descriptor.value;
|
|
67
|
+
descriptor.value = async function(...args) {
|
|
68
|
+
const manager = cacheManagerRef;
|
|
69
|
+
if (!manager) {
|
|
70
|
+
throw new Error("CacheManager is not initialized. Please configure 'cache' in sonamu.config.ts.");
|
|
71
|
+
}
|
|
72
|
+
const modelName = this instanceof BaseModelClass ? this.modelName : this.frameName;
|
|
73
|
+
const methodName = propertyKey;
|
|
74
|
+
const cacheKey = generateCacheKey(modelName, methodName, args, options.key);
|
|
75
|
+
const store = options.store ? manager.use(options.store) : manager;
|
|
76
|
+
return store.getOrSet({
|
|
77
|
+
...options,
|
|
78
|
+
key: cacheKey,
|
|
79
|
+
factory: ()=>originalMethod.apply(this, args)
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
return descriptor;
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYWNoZS9kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCYXNlRnJhbWVDbGFzcyB9IGZyb20gXCIuLi9hcGkvYmFzZS1mcmFtZVwiO1xuaW1wb3J0IHsgQmFzZU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZURlY29yYXRvck9wdGlvbnMsIENhY2hlTWFuYWdlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbnR5cGUgRGVjb3JhdG9yVGFyZ2V0ID0geyBjb25zdHJ1Y3RvcjogeyBuYW1lOiBzdHJpbmcgfSB9O1xuXG4vLyDsupDsi5wg66ek64uI7KCAIOywuOyhsCAoU29uYW11LmluaXTsl5DshJwg7ISk7KCV65CoKVxubGV0IGNhY2hlTWFuYWdlclJlZjogQ2FjaGVNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICog7LqQ7IucIOunpOuLiOyggCDssLjsobAg7ISk7KCVICjrgrTrtoAg7IKs7JqpKVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Q2FjaGVNYW5hZ2VyUmVmKG1hbmFnZXI6IENhY2hlTWFuYWdlciB8IG51bGwpOiB2b2lkIHtcbiAgY2FjaGVNYW5hZ2VyUmVmID0gbWFuYWdlcjtcbn1cblxuLyoqXG4gKiDsupDsi5wg66ek64uI7KCAIOywuOyhsCDqsIDsoLjsmKTquLAgKOuCtOu2gCDsgqzsmqkpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYWNoZU1hbmFnZXJSZWYoKTogQ2FjaGVNYW5hZ2VyIHwgbnVsbCB7XG4gIHJldHVybiBjYWNoZU1hbmFnZXJSZWY7XG59XG5cbi8qKlxuICog7LqQ7IucIO2CpCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVDYWNoZUtleShcbiAgbW9kZWxOYW1lOiBzdHJpbmcsXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgYXJnczogdW5rbm93bltdLFxuICBrZXlPcHRpb24/OiBDYWNoZURlY29yYXRvck9wdGlvbnNbXCJrZXlcIl0sXG4pOiBzdHJpbmcge1xuICAvLyDsu6TsiqTthYAg7YKkIO2VqOyImCDsgqzsmqlcbiAgaWYgKHR5cGVvZiBrZXlPcHRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBrZXlPcHRpb24oLi4uYXJncyk7XG4gIH1cblxuICAvLyDrrLjsnpDsl7Qg7YKkICsgYXJncyBzdWZmaXhcbiAgaWYgKHR5cGVvZiBrZXlPcHRpb24gPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBhcmdzU3VmZml4ID0gc2VyaWFsaXplQXJncyhhcmdzKTtcbiAgICByZXR1cm4gYXJnc1N1ZmZpeCA/IGAke2tleU9wdGlvbn06JHthcmdzU3VmZml4fWAgOiBrZXlPcHRpb247XG4gIH1cblxuICAvLyDsnpDrj5kg7IOd7ISxOiBNb2RlbE5hbWUubWV0aG9kTmFtZTpzZXJpYWxpemVkQXJnc1xuICBjb25zdCBiYXNlS2V5ID0gYCR7bW9kZWxOYW1lfS4ke21ldGhvZE5hbWV9YDtcbiAgY29uc3QgYXJnc1N1ZmZpeCA9IHNlcmlhbGl6ZUFyZ3MoYXJncyk7XG4gIHJldHVybiBhcmdzU3VmZml4ID8gYCR7YmFzZUtleX06JHthcmdzU3VmZml4fWAgOiBiYXNlS2V5O1xufVxuXG4vKipcbiAqIOyduOyekCDsp4HroKztmZRcbiAqL1xuZnVuY3Rpb24gc2VyaWFsaXplQXJncyhhcmdzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuXG4gIC8vIOuLqOydvCBwcmltaXRpdmUg6rCSXG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3NbMF07XG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCBhcmcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFwiXCI7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGFyZyA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgYXJnID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIFN0cmluZyhhcmcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOuzteyeoe2VnCDqsJLsnYAgSlNPTiDsp4HroKztmZRcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJncyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIOyngeugrO2ZlCDsi6TtjKgg7IucIHRvU3RyaW5nIOyCrOyaqVxuICAgIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiBTdHJpbmcoYXJnKSkuam9pbihcIjpcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBAY2FjaGUg642w7L2U66CI7J207YSwXG4gKlxuICog66mU7ISc65Oc7J2YIOqysOqzvOulvCDsupDsi7Htlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNsYXNzIFVzZXJNb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQGNhY2hlKHsgdHRsOiAnMTBtJywgdGFnczogWyd1c2VyJ10gfSlcbiAqICAgQGFwaSgpXG4gKiAgIGFzeW5jIGZpbmRCeUlkKGlkOiBudW1iZXIpIHtcbiAqICAgICByZXR1cm4gdGhpcy5maW5kT25lKFsnaWQnLCBpZF0pO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZShvcHRpb25zOiBDYWNoZURlY29yYXRvck9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gKF90YXJnZXQ6IERlY29yYXRvclRhcmdldCwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiBCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgIGNvbnN0IG1hbmFnZXIgPSBjYWNoZU1hbmFnZXJSZWY7XG5cbiAgICAgIGlmICghbWFuYWdlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDYWNoZU1hbmFnZXIgaXMgbm90IGluaXRpYWxpemVkLiBQbGVhc2UgY29uZmlndXJlICdjYWNoZScgaW4gc29uYW11LmNvbmZpZy50cy5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9kZWxOYW1lID0gdGhpcyBpbnN0YW5jZW9mIEJhc2VNb2RlbENsYXNzID8gdGhpcy5tb2RlbE5hbWUgOiB0aGlzLmZyYW1lTmFtZTtcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBwcm9wZXJ0eUtleTtcblxuICAgICAgY29uc3QgY2FjaGVLZXkgPSBnZW5lcmF0ZUNhY2hlS2V5KG1vZGVsTmFtZSwgbWV0aG9kTmFtZSwgYXJncywgb3B0aW9ucy5rZXkpO1xuICAgICAgY29uc3Qgc3RvcmUgPSBvcHRpb25zLnN0b3JlID8gbWFuYWdlci51c2Uob3B0aW9ucy5zdG9yZSkgOiBtYW5hZ2VyO1xuXG4gICAgICByZXR1cm4gc3RvcmUuZ2V0T3JTZXQoe1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBrZXk6IGNhY2hlS2V5LFxuICAgICAgICBmYWN0b3J5OiAoKSA9PiBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cbiJdLCJuYW1lcyI6WyJCYXNlTW9kZWxDbGFzcyIsImNhY2hlTWFuYWdlclJlZiIsInNldENhY2hlTWFuYWdlclJlZiIsIm1hbmFnZXIiLCJnZXRDYWNoZU1hbmFnZXJSZWYiLCJnZW5lcmF0ZUNhY2hlS2V5IiwibW9kZWxOYW1lIiwibWV0aG9kTmFtZSIsImFyZ3MiLCJrZXlPcHRpb24iLCJhcmdzU3VmZml4Iiwic2VyaWFsaXplQXJncyIsImJhc2VLZXkiLCJsZW5ndGgiLCJhcmciLCJ1bmRlZmluZWQiLCJTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwibWFwIiwiam9pbiIsImNhY2hlIiwib3B0aW9ucyIsIl90YXJnZXQiLCJwcm9wZXJ0eUtleSIsImRlc2NyaXB0b3IiLCJvcmlnaW5hbE1ldGhvZCIsInZhbHVlIiwiRXJyb3IiLCJmcmFtZU5hbWUiLCJjYWNoZUtleSIsImtleSIsInN0b3JlIiwidXNlIiwiZ2V0T3JTZXQiLCJmYWN0b3J5IiwiYXBwbHkiXSwibWFwcGluZ3MiOiJBQUNBLFNBQVNBLGNBQWMsUUFBUSw0QkFBeUI7QUFLeEQsZ0NBQWdDO0FBQ2hDLElBQUlDLGtCQUF1QztBQUUzQzs7Q0FFQyxHQUNELE9BQU8sU0FBU0MsbUJBQW1CQyxPQUE0QjtJQUM3REYsa0JBQWtCRTtBQUNwQjtBQUVBOztDQUVDLEdBQ0QsT0FBTyxTQUFTQztJQUNkLE9BQU9IO0FBQ1Q7QUFFQTs7Q0FFQyxHQUNELFNBQVNJLGlCQUNQQyxTQUFpQixFQUNqQkMsVUFBa0IsRUFDbEJDLElBQWUsRUFDZkMsU0FBd0M7SUFFeEMsY0FBYztJQUNkLElBQUksT0FBT0EsY0FBYyxZQUFZO1FBQ25DLE9BQU9BLGFBQWFEO0lBQ3RCO0lBRUEsc0JBQXNCO0lBQ3RCLElBQUksT0FBT0MsY0FBYyxVQUFVO1FBQ2pDLE1BQU1DLGFBQWFDLGNBQWNIO1FBQ2pDLE9BQU9FLGFBQWEsR0FBR0QsVUFBVSxDQUFDLEVBQUVDLFlBQVksR0FBR0Q7SUFDckQ7SUFFQSw2Q0FBNkM7SUFDN0MsTUFBTUcsVUFBVSxHQUFHTixVQUFVLENBQUMsRUFBRUMsWUFBWTtJQUM1QyxNQUFNRyxhQUFhQyxjQUFjSDtJQUNqQyxPQUFPRSxhQUFhLEdBQUdFLFFBQVEsQ0FBQyxFQUFFRixZQUFZLEdBQUdFO0FBQ25EO0FBRUE7O0NBRUMsR0FDRCxTQUFTRCxjQUFjSCxJQUFlO0lBQ3BDLElBQUlBLEtBQUtLLE1BQU0sS0FBSyxHQUFHLE9BQU87SUFFOUIsaUJBQWlCO0lBQ2pCLElBQUlMLEtBQUtLLE1BQU0sS0FBSyxHQUFHO1FBQ3JCLE1BQU1DLE1BQU1OLElBQUksQ0FBQyxFQUFFO1FBQ25CLElBQUlNLFFBQVEsUUFBUUEsUUFBUUMsV0FBVyxPQUFPO1FBQzlDLElBQUksT0FBT0QsUUFBUSxZQUFZLE9BQU9BLFFBQVEsWUFBWSxPQUFPQSxRQUFRLFdBQVc7WUFDbEYsT0FBT0UsT0FBT0Y7UUFDaEI7SUFDRjtJQUVBLGtCQUFrQjtJQUNsQixJQUFJO1FBQ0YsT0FBT0csS0FBS0MsU0FBUyxDQUFDVjtJQUN4QixFQUFFLE9BQU07UUFDTix1QkFBdUI7UUFDdkIsT0FBT0EsS0FBS1csR0FBRyxDQUFDLENBQUNMLE1BQVFFLE9BQU9GLE1BQU1NLElBQUksQ0FBQztJQUM3QztBQUNGO0FBRUE7Ozs7Ozs7Ozs7Ozs7Q0FhQyxHQUNELE9BQU8sU0FBU0MsTUFBTUMsVUFBaUMsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sQ0FBQ0MsU0FBMEJDLGFBQXFCQztRQUNyRCxNQUFNQyxpQkFBaUJELFdBQVdFLEtBQUs7UUFFdkNGLFdBQVdFLEtBQUssR0FBRyxlQUF1RCxHQUFHbkIsSUFBZTtZQUMxRixNQUFNTCxVQUFVRjtZQUVoQixJQUFJLENBQUNFLFNBQVM7Z0JBQ1osTUFBTSxJQUFJeUIsTUFDUjtZQUVKO1lBRUEsTUFBTXRCLFlBQVksSUFBSSxZQUFZTixpQkFBaUIsSUFBSSxDQUFDTSxTQUFTLEdBQUcsSUFBSSxDQUFDdUIsU0FBUztZQUNsRixNQUFNdEIsYUFBYWlCO1lBRW5CLE1BQU1NLFdBQVd6QixpQkFBaUJDLFdBQVdDLFlBQVlDLE1BQU1jLFFBQVFTLEdBQUc7WUFDMUUsTUFBTUMsUUFBUVYsUUFBUVUsS0FBSyxHQUFHN0IsUUFBUThCLEdBQUcsQ0FBQ1gsUUFBUVUsS0FBSyxJQUFJN0I7WUFFM0QsT0FBTzZCLE1BQU1FLFFBQVEsQ0FBQztnQkFDcEIsR0FBR1osT0FBTztnQkFDVlMsS0FBS0Q7Z0JBQ0xLLFNBQVMsSUFBTVQsZUFBZVUsS0FBSyxDQUFDLElBQUksRUFBRTVCO1lBQzVDO1FBQ0Y7UUFFQSxPQUFPaUI7SUFDVDtBQUNGIn0=
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BentoCache 드라이버 re-export
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* import { drivers, store } from 'sonamu/cache';
|
|
6
|
+
*
|
|
7
|
+
* cache: {
|
|
8
|
+
* stores: {
|
|
9
|
+
* main: store()
|
|
10
|
+
* .useL1Layer(drivers.memory({ maxSize: '100mb' }))
|
|
11
|
+
* .useL2Layer(drivers.redis({ connection }))
|
|
12
|
+
* .useBus(drivers.redisBus({ connection }))
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
*/
|
|
16
|
+
export { bentostore as store } from "bentocache";
|
|
17
|
+
import { fileDriver as _fileDriver } from "bentocache/drivers/file";
|
|
18
|
+
import { knexDriver as _knexDriver } from "bentocache/drivers/knex";
|
|
19
|
+
import { memoryDriver as _memoryDriver } from "bentocache/drivers/memory";
|
|
20
|
+
import { redisBusDriver as _redisBusDriver, redisDriver as _redisDriver } from "bentocache/drivers/redis";
|
|
21
|
+
export declare const memoryDriver: typeof _memoryDriver;
|
|
22
|
+
export declare const fileDriver: typeof _fileDriver;
|
|
23
|
+
export declare const redisDriver: typeof _redisDriver;
|
|
24
|
+
export declare const redisBusDriver: typeof _redisBusDriver;
|
|
25
|
+
export declare const knexDriver: typeof _knexDriver;
|
|
26
|
+
export declare const drivers: {
|
|
27
|
+
memory: typeof _memoryDriver;
|
|
28
|
+
file: typeof _fileDriver;
|
|
29
|
+
redis: typeof _redisDriver;
|
|
30
|
+
redisBus: typeof _redisBusDriver;
|
|
31
|
+
knex: typeof _knexDriver;
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=drivers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drivers.d.ts","sourceRoot":"","sources":["../../src/cache/drivers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EACL,cAAc,IAAI,eAAe,EACjC,WAAW,IAAI,YAAY,EAC5B,MAAM,0BAA0B,CAAC;AAGlC,eAAO,MAAM,YAAY,sBAAgB,CAAC;AAC1C,eAAO,MAAM,UAAU,oBAAc,CAAC;AACtC,eAAO,MAAM,WAAW,qBAAe,CAAC;AACxC,eAAO,MAAM,cAAc,wBAAkB,CAAC;AAC9C,eAAO,MAAM,UAAU,oBAAc,CAAC;AAGtC,eAAO,MAAM,OAAO;;;;;;CAMnB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BentoCache 드라이버 re-export
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* import { drivers, store } from 'sonamu/cache';
|
|
6
|
+
*
|
|
7
|
+
* cache: {
|
|
8
|
+
* stores: {
|
|
9
|
+
* main: store()
|
|
10
|
+
* .useL1Layer(drivers.memory({ maxSize: '100mb' }))
|
|
11
|
+
* .useL2Layer(drivers.redis({ connection }))
|
|
12
|
+
* .useBus(drivers.redisBus({ connection }))
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
*/ // Store builder
|
|
16
|
+
export { bentostore as store } from "bentocache";
|
|
17
|
+
import { fileDriver as _fileDriver } from "bentocache/drivers/file";
|
|
18
|
+
import { knexDriver as _knexDriver } from "bentocache/drivers/knex";
|
|
19
|
+
import { memoryDriver as _memoryDriver } from "bentocache/drivers/memory";
|
|
20
|
+
import { redisBusDriver as _redisBusDriver, redisDriver as _redisDriver } from "bentocache/drivers/redis";
|
|
21
|
+
// 개별 드라이버 export
|
|
22
|
+
export const memoryDriver = _memoryDriver;
|
|
23
|
+
export const fileDriver = _fileDriver;
|
|
24
|
+
export const redisDriver = _redisDriver;
|
|
25
|
+
export const redisBusDriver = _redisBusDriver;
|
|
26
|
+
export const knexDriver = _knexDriver;
|
|
27
|
+
// 편의를 위한 drivers 객체
|
|
28
|
+
export const drivers = {
|
|
29
|
+
memory: _memoryDriver,
|
|
30
|
+
file: _fileDriver,
|
|
31
|
+
redis: _redisDriver,
|
|
32
|
+
redisBus: _redisBusDriver,
|
|
33
|
+
knex: _knexDriver
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYWNoZS9kcml2ZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmVudG9DYWNoZSDrk5zrnbzsnbTrsoQgcmUtZXhwb3J0XG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGRyaXZlcnMsIHN0b3JlIH0gZnJvbSAnc29uYW11L2NhY2hlJztcbiAqXG4gKiBjYWNoZToge1xuICogICBzdG9yZXM6IHtcbiAqICAgICBtYWluOiBzdG9yZSgpXG4gKiAgICAgICAudXNlTDFMYXllcihkcml2ZXJzLm1lbW9yeSh7IG1heFNpemU6ICcxMDBtYicgfSkpXG4gKiAgICAgICAudXNlTDJMYXllcihkcml2ZXJzLnJlZGlzKHsgY29ubmVjdGlvbiB9KSlcbiAqICAgICAgIC51c2VCdXMoZHJpdmVycy5yZWRpc0J1cyh7IGNvbm5lY3Rpb24gfSkpXG4gKiAgIH1cbiAqIH1cbiAqL1xuXG4vLyBTdG9yZSBidWlsZGVyXG5leHBvcnQgeyBiZW50b3N0b3JlIGFzIHN0b3JlIH0gZnJvbSBcImJlbnRvY2FjaGVcIjtcblxuaW1wb3J0IHsgZmlsZURyaXZlciBhcyBfZmlsZURyaXZlciB9IGZyb20gXCJiZW50b2NhY2hlL2RyaXZlcnMvZmlsZVwiO1xuaW1wb3J0IHsga25leERyaXZlciBhcyBfa25leERyaXZlciB9IGZyb20gXCJiZW50b2NhY2hlL2RyaXZlcnMva25leFwiO1xuaW1wb3J0IHsgbWVtb3J5RHJpdmVyIGFzIF9tZW1vcnlEcml2ZXIgfSBmcm9tIFwiYmVudG9jYWNoZS9kcml2ZXJzL21lbW9yeVwiO1xuaW1wb3J0IHtcbiAgcmVkaXNCdXNEcml2ZXIgYXMgX3JlZGlzQnVzRHJpdmVyLFxuICByZWRpc0RyaXZlciBhcyBfcmVkaXNEcml2ZXIsXG59IGZyb20gXCJiZW50b2NhY2hlL2RyaXZlcnMvcmVkaXNcIjtcblxuLy8g6rCc67OEIOuTnOudvOydtOuyhCBleHBvcnRcbmV4cG9ydCBjb25zdCBtZW1vcnlEcml2ZXIgPSBfbWVtb3J5RHJpdmVyO1xuZXhwb3J0IGNvbnN0IGZpbGVEcml2ZXIgPSBfZmlsZURyaXZlcjtcbmV4cG9ydCBjb25zdCByZWRpc0RyaXZlciA9IF9yZWRpc0RyaXZlcjtcbmV4cG9ydCBjb25zdCByZWRpc0J1c0RyaXZlciA9IF9yZWRpc0J1c0RyaXZlcjtcbmV4cG9ydCBjb25zdCBrbmV4RHJpdmVyID0gX2tuZXhEcml2ZXI7XG5cbi8vIO2OuOydmOulvCDsnITtlZwgZHJpdmVycyDqsJ3ssrRcbmV4cG9ydCBjb25zdCBkcml2ZXJzID0ge1xuICBtZW1vcnk6IF9tZW1vcnlEcml2ZXIsXG4gIGZpbGU6IF9maWxlRHJpdmVyLFxuICByZWRpczogX3JlZGlzRHJpdmVyLFxuICByZWRpc0J1czogX3JlZGlzQnVzRHJpdmVyLFxuICBrbmV4OiBfa25leERyaXZlcixcbn07XG4iXSwibmFtZXMiOlsiYmVudG9zdG9yZSIsInN0b3JlIiwiZmlsZURyaXZlciIsIl9maWxlRHJpdmVyIiwia25leERyaXZlciIsIl9rbmV4RHJpdmVyIiwibWVtb3J5RHJpdmVyIiwiX21lbW9yeURyaXZlciIsInJlZGlzQnVzRHJpdmVyIiwiX3JlZGlzQnVzRHJpdmVyIiwicmVkaXNEcml2ZXIiLCJfcmVkaXNEcml2ZXIiLCJkcml2ZXJzIiwibWVtb3J5IiwiZmlsZSIsInJlZGlzIiwicmVkaXNCdXMiLCJrbmV4Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Q0FjQyxHQUVELGdCQUFnQjtBQUNoQixTQUFTQSxjQUFjQyxLQUFLLFFBQVEsYUFBYTtBQUVqRCxTQUFTQyxjQUFjQyxXQUFXLFFBQVEsMEJBQTBCO0FBQ3BFLFNBQVNDLGNBQWNDLFdBQVcsUUFBUSwwQkFBMEI7QUFDcEUsU0FBU0MsZ0JBQWdCQyxhQUFhLFFBQVEsNEJBQTRCO0FBQzFFLFNBQ0VDLGtCQUFrQkMsZUFBZSxFQUNqQ0MsZUFBZUMsWUFBWSxRQUN0QiwyQkFBMkI7QUFFbEMsaUJBQWlCO0FBQ2pCLE9BQU8sTUFBTUwsZUFBZUMsY0FBYztBQUMxQyxPQUFPLE1BQU1MLGFBQWFDLFlBQVk7QUFDdEMsT0FBTyxNQUFNTyxjQUFjQyxhQUFhO0FBQ3hDLE9BQU8sTUFBTUgsaUJBQWlCQyxnQkFBZ0I7QUFDOUMsT0FBTyxNQUFNTCxhQUFhQyxZQUFZO0FBRXRDLG9CQUFvQjtBQUNwQixPQUFPLE1BQU1PLFVBQVU7SUFDckJDLFFBQVFOO0lBQ1JPLE1BQU1YO0lBQ05ZLE9BQU9KO0lBQ1BLLFVBQVVQO0lBQ1ZRLE1BQU1aO0FBQ1IsRUFBRSJ9
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createCacheManager, createTestCacheManager } from "./cache-manager";
|
|
2
|
+
export { cache, getCacheManagerRef, setCacheManagerRef } from "./decorator";
|
|
3
|
+
export { drivers, fileDriver, knexDriver, memoryDriver, redisBusDriver, redisDriver, store, } from "./drivers";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAG7E,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAG5E,OAAO,EACL,OAAO,EACP,UAAU,EACV,UAAU,EACV,YAAY,EACZ,cAAc,EACd,WAAW,EACX,KAAK,GACN,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Cache manager factory
|
|
2
|
+
export { createCacheManager, createTestCacheManager } from "./cache-manager.js";
|
|
3
|
+
// Decorator
|
|
4
|
+
export { cache, getCacheManagerRef, setCacheManagerRef } from "./decorator.js";
|
|
5
|
+
// Drivers & Store builder
|
|
6
|
+
export { drivers, fileDriver, knexDriver, memoryDriver, redisBusDriver, redisDriver, store } from "./drivers.js";
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYWNoZS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDYWNoZSBtYW5hZ2VyIGZhY3RvcnlcbmV4cG9ydCB7IGNyZWF0ZUNhY2hlTWFuYWdlciwgY3JlYXRlVGVzdENhY2hlTWFuYWdlciB9IGZyb20gXCIuL2NhY2hlLW1hbmFnZXJcIjtcblxuLy8gRGVjb3JhdG9yXG5leHBvcnQgeyBjYWNoZSwgZ2V0Q2FjaGVNYW5hZ2VyUmVmLCBzZXRDYWNoZU1hbmFnZXJSZWYgfSBmcm9tIFwiLi9kZWNvcmF0b3JcIjtcblxuLy8gRHJpdmVycyAmIFN0b3JlIGJ1aWxkZXJcbmV4cG9ydCB7XG4gIGRyaXZlcnMsXG4gIGZpbGVEcml2ZXIsXG4gIGtuZXhEcml2ZXIsXG4gIG1lbW9yeURyaXZlcixcbiAgcmVkaXNCdXNEcml2ZXIsXG4gIHJlZGlzRHJpdmVyLFxuICBzdG9yZSxcbn0gZnJvbSBcIi4vZHJpdmVyc1wiO1xuIl0sIm5hbWVzIjpbImNyZWF0ZUNhY2hlTWFuYWdlciIsImNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIiLCJjYWNoZSIsImdldENhY2hlTWFuYWdlclJlZiIsInNldENhY2hlTWFuYWdlclJlZiIsImRyaXZlcnMiLCJmaWxlRHJpdmVyIiwia25leERyaXZlciIsIm1lbW9yeURyaXZlciIsInJlZGlzQnVzRHJpdmVyIiwicmVkaXNEcml2ZXIiLCJzdG9yZSJdLCJtYXBwaW5ncyI6IkFBQUEsd0JBQXdCO0FBQ3hCLFNBQVNBLGtCQUFrQixFQUFFQyxzQkFBc0IsUUFBUSxxQkFBa0I7QUFFN0UsWUFBWTtBQUNaLFNBQVNDLEtBQUssRUFBRUMsa0JBQWtCLEVBQUVDLGtCQUFrQixRQUFRLGlCQUFjO0FBRTVFLDBCQUEwQjtBQUMxQixTQUNFQyxPQUFPLEVBQ1BDLFVBQVUsRUFDVkMsVUFBVSxFQUNWQyxZQUFZLEVBQ1pDLGNBQWMsRUFDZEMsV0FBVyxFQUNYQyxLQUFLLFFBQ0EsZUFBWSJ9
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { BentoCache } from "bentocache";
|
|
2
|
+
import type { RawCommonOptions } from "bentocache/types";
|
|
3
|
+
/**
|
|
4
|
+
* 캐시 설정 (sonamu.config.ts에서 사용)
|
|
5
|
+
*/
|
|
6
|
+
export type CacheConfig = ConstructorParameters<typeof BentoCache>[0];
|
|
7
|
+
/**
|
|
8
|
+
* @cache 데코레이터 옵션
|
|
9
|
+
*/
|
|
10
|
+
export type CacheDecoratorOptions = {
|
|
11
|
+
/**
|
|
12
|
+
* 캐시 키
|
|
13
|
+
* - 문자열: 고정 키 (args가 자동으로 suffix로 추가됨)
|
|
14
|
+
* - 함수: 인자를 받아 키 생성
|
|
15
|
+
* - 미지정: ModelName.methodName:serializedArgs 형태로 자동 생성
|
|
16
|
+
*/
|
|
17
|
+
key?: string | ((...args: unknown[]) => string);
|
|
18
|
+
/**
|
|
19
|
+
* 사용할 스토어 이름
|
|
20
|
+
* 미지정 시 default 스토어 사용
|
|
21
|
+
*/
|
|
22
|
+
store?: string;
|
|
23
|
+
} & RawCommonOptions;
|
|
24
|
+
/**
|
|
25
|
+
* CacheManager 타입 (BentoCache 확장)
|
|
26
|
+
*/
|
|
27
|
+
export type CacheManager = BentoCache<any>;
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,qBAAqB,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAEtE;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC,CAAC;IAEhD;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,gBAAgB,CAAC;AAErB;;GAEG;AAEH,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CacheManager 타입 (BentoCache 확장)
|
|
3
|
+
*/ // biome-ignore lint/suspicious/noExplicitAny: BentoCache의 제네릭 타입을 그대로 사용
|
|
4
|
+
export { };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYWNoZS90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJlbnRvQ2FjaGUgfSBmcm9tIFwiYmVudG9jYWNoZVwiO1xuaW1wb3J0IHR5cGUgeyBSYXdDb21tb25PcHRpb25zIH0gZnJvbSBcImJlbnRvY2FjaGUvdHlwZXNcIjtcblxuLyoqXG4gKiDsupDsi5wg7ISk7KCVIChzb25hbXUuY29uZmlnLnRz7JeQ7IScIOyCrOyaqSlcbiAqL1xuZXhwb3J0IHR5cGUgQ2FjaGVDb25maWcgPSBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIEJlbnRvQ2FjaGU+WzBdO1xuXG4vKipcbiAqIEBjYWNoZSDrjbDsvZTroIjsnbTthLAg7Ji17IWYXG4gKi9cbmV4cG9ydCB0eXBlIENhY2hlRGVjb3JhdG9yT3B0aW9ucyA9IHtcbiAgLyoqXG4gICAqIOy6kOyLnCDtgqRcbiAgICogLSDrrLjsnpDsl7Q6IOqzoOyglSDtgqQgKGFyZ3PqsIAg7J6Q64+Z7Jy866GcIHN1ZmZpeOuhnCDstpTqsIDrkKgpXG4gICAqIC0g7ZWo7IiYOiDsnbjsnpDrpbwg67Cb7JWEIO2CpCDsg53shLFcbiAgICogLSDrr7jsp4DsoJU6IE1vZGVsTmFtZS5tZXRob2ROYW1lOnNlcmlhbGl6ZWRBcmdzIO2Yle2DnOuhnCDsnpDrj5kg7IOd7ISxXG4gICAqL1xuICBrZXk/OiBzdHJpbmcgfCAoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gc3RyaW5nKTtcblxuICAvKipcbiAgICog7IKs7Jqp7ZWgIOyKpO2GoOyWtCDsnbTrpoRcbiAgICog66+47KeA7KCVIOyLnCBkZWZhdWx0IOyKpO2GoOyWtCDsgqzsmqlcbiAgICovXG4gIHN0b3JlPzogc3RyaW5nO1xufSAmIFJhd0NvbW1vbk9wdGlvbnM7XG5cbi8qKlxuICogQ2FjaGVNYW5hZ2VyIO2DgOyehSAoQmVudG9DYWNoZSDtmZXsnqUpXG4gKi9cbi8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogQmVudG9DYWNoZeydmCDsoJzrhKTrpq0g7YOA7J6F7J2EIOq3uOuMgOuhnCDsgqzsmqlcbmV4cG9ydCB0eXBlIENhY2hlTWFuYWdlciA9IEJlbnRvQ2FjaGU8YW55PjtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEyQkE7O0NBRUMsR0FDRCx5RUFBeUU7QUFDekUsV0FBMkMifQ==
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */
|
|
2
|
+
import { type Logger } from "@logtape/logtape";
|
|
2
3
|
import type { Knex } from "knex";
|
|
3
4
|
import type { ListResult } from "..";
|
|
4
5
|
import type { DatabaseSchemaExtend, SonamuQueryMode } from "../types/types";
|
|
@@ -18,10 +19,11 @@ type UnknownDBRecord = Record<string, unknown>;
|
|
|
18
19
|
* @template TLoaderQueries - 서브셋별 로더 쿼리 배열 객체
|
|
19
20
|
*/
|
|
20
21
|
export declare class BaseModelClass<TSubsetKey extends string = never, TSubsetMapping extends Record<string, any> = never, TSubsetQueries extends Record<TSubsetKey, PuriSubsetFn> = never, TLoaderQueries extends PuriLoaderQueries<TSubsetKey> = never> {
|
|
22
|
+
readonly modelName: string;
|
|
21
23
|
protected subsetQueries?: TSubsetQueries | undefined;
|
|
22
24
|
protected loaderQueries?: TLoaderQueries | undefined;
|
|
23
|
-
|
|
24
|
-
constructor(subsetQueries?: TSubsetQueries | undefined, loaderQueries?: TLoaderQueries | undefined);
|
|
25
|
+
protected readonly logger: Logger;
|
|
26
|
+
constructor(modelName?: string, subsetQueries?: TSubsetQueries | undefined, loaderQueries?: TLoaderQueries | undefined);
|
|
25
27
|
getDB(which: DBPreset): Knex;
|
|
26
28
|
getPuri(which: DBPreset): PuriWrapper;
|
|
27
29
|
destroy(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"AAAA,oGAAoG;
|
|
1
|
+
{"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
/** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */ import {
|
|
1
|
+
/** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */ import { getLogger } from "@logtape/logtape";
|
|
2
|
+
import { cloneDeep, group, isObject, omit, set } from "radashi";
|
|
2
3
|
import { Sonamu } from "../api/index.js";
|
|
3
4
|
import { EntityManager } from "../entity/entity-manager.js";
|
|
5
|
+
import { convertDomainToCategory } from "../logger/category.js";
|
|
4
6
|
import { getJoinTables, getTableNamesFromWhere } from "../utils/sql-parser.js";
|
|
5
7
|
import { chunk } from "../utils/utils.js";
|
|
6
8
|
import { DB } from "./db.js";
|
|
@@ -15,12 +17,15 @@ import { UpsertBuilder } from "./upsert-builder.js";
|
|
|
15
17
|
* @template TSubsetQueries - 서브셋 쿼리 함수 객체
|
|
16
18
|
* @template TLoaderQueries - 서브셋별 로더 쿼리 배열 객체
|
|
17
19
|
*/ export class BaseModelClass {
|
|
20
|
+
modelName;
|
|
18
21
|
subsetQueries;
|
|
19
22
|
loaderQueries;
|
|
20
|
-
|
|
21
|
-
constructor(subsetQueries, loaderQueries){
|
|
23
|
+
logger;
|
|
24
|
+
constructor(modelName = this.constructor.name, subsetQueries, loaderQueries){
|
|
25
|
+
this.modelName = modelName;
|
|
22
26
|
this.subsetQueries = subsetQueries;
|
|
23
27
|
this.loaderQueries = loaderQueries;
|
|
28
|
+
this.logger = getLogger(convertDomainToCategory(this.modelName, "model"));
|
|
24
29
|
}
|
|
25
30
|
getDB(which) {
|
|
26
31
|
return DB.getDB(which);
|
|
@@ -289,4 +294,4 @@ import { UpsertBuilder } from "./upsert-builder.js";
|
|
|
289
294
|
}
|
|
290
295
|
export const BaseModel = new BaseModelClass();
|
|
291
296
|
|
|
292
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJp7J2YIO2DgOyeheydgCDqsJzrs4Qg66qo64247JeQ7IScIO2ZleygleuQmOuvgOuhnCBCYXNlTW9kZWzsl5DshJzripQgYW5566W8IO2XiOyaqe2VqCAqL1xuXG5pbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBncm91cCwgaXNPYmplY3QsIG9taXQsIHNldCB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RSZXN1bHQgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBTb25hbXVRdWVyeU1vZGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGdldEpvaW5UYWJsZXMsIGdldFRhYmxlTmFtZXNGcm9tV2hlcmUgfSBmcm9tIFwiLi4vdXRpbHMvc3FsLXBhcnNlclwiO1xuaW1wb3J0IHsgY2h1bmsgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZXJNYXAsIFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb24gfSBmcm9tIFwiLi9iYXNlLW1vZGVsLnR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IERCUHJlc2V0IH0gZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQgdHlwZSB7IFVuaW9uRXh0cmFjdGVkVFRhYmxlcyB9IGZyb20gXCIuL3B1cmkudHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgSW5mZXJBbGxTdWJzZXRzLCBQdXJpTG9hZGVyUXVlcmllcywgUHVyaVN1YnNldEZuIH0gZnJvbSBcIi4vcHVyaS1zdWJzZXQudHlwZXNcIjtcbmltcG9ydCB7IFB1cmlXcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5pbXBvcnQgeyBVcHNlcnRCdWlsZGVyIH0gZnJvbSBcIi4vdXBzZXJ0LWJ1aWxkZXJcIjtcblxudHlwZSBVbmtub3duREJSZWNvcmQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiDrqqjrk6AgTW9kZWwg7YG0656Y7Iqk7J2YIOq4sOuzuCDtgbTrnpjsiqRcbiAqXG4gKiBAdGVtcGxhdGUgVFN1YnNldEtleSAtIOyEnOu4jOyFiyDtgqQg7Jyg64uI7JioICjsmIg6IFwiQVwiIHwgXCJQXCIgfCBcIlNTXCIpXG4gKiBAdGVtcGxhdGUgVFN1YnNldE1hcHBpbmcgLSDshJzruIzshYvrs4Qg7LWc7KKFIOqysOqzvCDtg4DsnoUg66ek7ZWRXG4gKiBAdGVtcGxhdGUgVFN1YnNldFF1ZXJpZXMgLSDshJzruIzshYsg7L+866asIO2VqOyImCDqsJ3ssrRcbiAqIEB0ZW1wbGF0ZSBUTG9hZGVyUXVlcmllcyAtIOyEnOu4jOyFi+uzhCDroZzrjZQg7L+866asIOuwsOyXtCDqsJ3ssrRcbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VNb2RlbENsYXNzPFxuICBUU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUU3Vic2V0UXVlcmllcyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBQdXJpU3Vic2V0Rm4+ID0gbmV2ZXIsXG4gIFRMb2FkZXJRdWVyaWVzIGV4dGVuZHMgUHVyaUxvYWRlclF1ZXJpZXM8VFN1YnNldEtleT4gPSBuZXZlcixcbj4ge1xuICBwdWJsaWMgbW9kZWxOYW1lOiBzdHJpbmcgPSBcIlVua25vd25cIjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc3Vic2V0UXVlcmllcz86IFRTdWJzZXRRdWVyaWVzLFxuICAgIHByb3RlY3RlZCBsb2FkZXJRdWVyaWVzPzogVExvYWRlclF1ZXJpZXMsXG4gICkge31cblxuICBnZXREQih3aGljaDogREJQcmVzZXQpOiBLbmV4IHtcbiAgICByZXR1cm4gREIuZ2V0REIod2hpY2gpO1xuICB9XG5cbiAgZ2V0UHVyaSh3aGljaDogREJQcmVzZXQpOiBQdXJpV3JhcHBlciB7XG4gICAgLy8g7Yq4656c7J6t7IWYIOy7qO2FjeyKpO2KuOyXkOyEnCDtirjrnpzsnq3shZgg7ZqN65OdXG4gICAgY29uc3QgdHJ4ID0gREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZ2V0VHJhbnNhY3Rpb24od2hpY2gpO1xuICAgIGlmICh0cngpIHtcbiAgICAgIHJldHVybiB0cng7XG4gICAgfVxuXG4gICAgLy8g7Yq4656c7J6t7IWY7J20IOyXhuycvOuptCDsg4jroZzsmrQgUHVyaVdyYXBwZXIg67CY7ZmYXG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKHdoaWNoKTtcbiAgICByZXR1cm4gbmV3IFB1cmlXcmFwcGVyKGRiLCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgcmV0dXJuIERCLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGFzeW5jIGdldEluc2VydGVkSWRzKFxuICAgIHdkYjogS25leCxcbiAgICByb3dzOiBVbmtub3duREJSZWNvcmRbXSxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICB1bnFLZXlGaWVsZHM6IHN0cmluZ1tdLFxuICAgIGNodW5rU2l6ZTogbnVtYmVyID0gNTAwLFxuICApIHtcbiAgICBpZiAoIXdkYikge1xuICAgICAgd2RiID0gdGhpcy5nZXREQihcIndcIik7XG4gICAgfVxuXG4gICAgbGV0IHVucUtleXM6IHN0cmluZ1tdO1xuICAgIGxldCB3aGVyZUluRmllbGQ6IHN0cmluZyB8IEtuZXguUmF3O1xuICAgIGxldCBzZWxlY3RGaWVsZDogc3RyaW5nO1xuXG4gICAgaWYgKHVucUtleUZpZWxkcy5sZW5ndGggPiAxKSB7XG4gICAgICB3aGVyZUluRmllbGQgPSB3ZGIucmF3KGBDT05DQVRfV1MoJ18nLCAnJHt1bnFLZXlGaWVsZHMuam9pbihcIixcIil9JylgKTtcbiAgICAgIHNlbGVjdEZpZWxkID0gYCR7d2hlcmVJbkZpZWxkfSBhcyB0bXBVaWRgO1xuICAgICAgdW5xS2V5cyA9IHJvd3MubWFwKChyb3cpID0+IHVucUtleUZpZWxkcy5tYXAoKGZpZWxkKSA9PiByb3dbZmllbGRdKS5qb2luKFwiX1wiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoZXJlSW5GaWVsZCA9IHVucUtleUZpZWxkc1swXTtcbiAgICAgIHNlbGVjdEZpZWxkID0gdW5xS2V5RmllbGRzWzBdO1xuICAgICAgdW5xS2V5cyA9IHJvd3MubWFwKChyb3cpID0+IHJvd1t1bnFLZXlGaWVsZHNbMF1dIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdElkczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGl0ZW1zIG9mIGNodW5rKHVucUtleXMsIGNodW5rU2l6ZSkpIHtcbiAgICAgIGNvbnN0IGRiUm93cyA9IGF3YWl0IHdkYih0YWJsZU5hbWUpXG4gICAgICAgIC5zZWxlY3QoXCJpZFwiLCB3ZGIucmF3KHNlbGVjdEZpZWxkKSlcbiAgICAgICAgLndoZXJlSW4od2hlcmVJbkZpZWxkIGFzIHN0cmluZywgaXRlbXMpO1xuICAgICAgcmVzdWx0SWRzID0gcmVzdWx0SWRzLmNvbmNhdChcbiAgICAgICAgZGJSb3dzLm1hcCgoZGJSb3c6IFVua25vd25EQlJlY29yZCkgPT4gcGFyc2VJbnQoU3RyaW5nKGRiUm93LmlkKSkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0SWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSDshJzruIzshYvsl5Ag64yA7ZWcIOy/vOumrCDruYzrjZQg7ZqN65OdXG4gICAqXG4gICAqIEByZXR1cm5zIHFiIC0g7L+866asIOu5jOuNlCAo7KGw6rG0IOy2lOqwgOyaqSlcbiAgICogQHJldHVybnMgb25TdWJzZXQgLSDtirnsoJUg7ISc67iM7IWLIOyghOyaqSDtg4DsnoXsnbQg7ZWE7JqU7ZWgIOuVjCDsgqzsmqlcbiAgICovXG4gIGdldFN1YnNldFF1ZXJpZXM8VCBleHRlbmRzIFRTdWJzZXRLZXk+KHN1YnNldDogVCkge1xuICAgIGlmICghdGhpcy5zdWJzZXRRdWVyaWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdWJzZXRRdWVyaWVzIGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHB1cmlXcmFwcGVyID0gbmV3IFB1cmlXcmFwcGVyKHRoaXMuZ2V0REIoXCJyXCIpLCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgICBjb25zdCBxYiA9IHRoaXMuc3Vic2V0UXVlcmllc1tzdWJzZXRdPy4ocHVyaVdyYXBwZXIpO1xuXG4gICAgLy8gTm9uQWxsb3dlZEFzU2luZ2xlVGFibGU6IOuLqOydvCDthYzsnbTruJQg7Lus65+8IOygkeq3vCDrsKnsp4Dsmqkg66eI7LukXG4gICAgdHlwZSBRQlRhYmxlcyA9IFVuaW9uRXh0cmFjdGVkVFRhYmxlczxUU3Vic2V0S2V5LCBUU3Vic2V0UXVlcmllcz4gJiB7XG4gICAgICBOb25BbGxvd2VkQXNTaW5nbGVUYWJsZTogeyBfX2Z1bGx0ZXh0X186IHRydWUgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHFiOiBxYiBhcyB1bmtub3duIGFzIFB1cmk8RGF0YWJhc2VTY2hlbWFFeHRlbmQsIFFCVGFibGVzLCB7fT4sXG4gICAgICBvblN1YnNldDogKChfc3Vic2V0OiBUU3Vic2V0S2V5IHwgcmVhZG9ubHkgVFN1YnNldEtleVtdKSA9PiBxYikgYXMge1xuICAgICAgICAvLyDri6jsnbwg7YKkXG4gICAgICAgIDxTIGV4dGVuZHMgVFN1YnNldEtleT4oc3Vic2V0OiBTKTogUmV0dXJuVHlwZTxUU3Vic2V0UXVlcmllc1tTXT47XG4gICAgICAgIC8vIO2CpCDrsLDsl7QgLT4g6rWQ7KeR7ZWpIOuwmO2ZmFxuICAgICAgICA8QXJyIGV4dGVuZHMgcmVhZG9ubHkgVFN1YnNldEtleVtdPihcbiAgICAgICAgICBzdWJzZXRzOiBbLi4uQXJyXSxcbiAgICAgICAgKTogUmVzb2x2ZVN1YnNldEludGVyc2VjdGlvbjxBcnIsIFRTdWJzZXRRdWVyaWVzPjtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmhhbmNlciDqsJ3ssrQg7IOd7ISxIO2XrO2NvFxuICAgKiDtg4DsnoUg6rKA7KadIOuwjyDstpTroaDsnYQg64+E7JmA7KSMXG4gICAqL1xuICBjcmVhdGVFbmhhbmNlcnM8VCBleHRlbmRzIFRTdWJzZXRLZXk+KFxuICAgIGVuaGFuY2VyczogRW5oYW5jZXJNYXA8XG4gICAgICBULFxuICAgICAgSW5mZXJBbGxTdWJzZXRzPFRTdWJzZXRRdWVyaWVzLCBUTG9hZGVyUXVlcmllcz4sXG4gICAgICBUU3Vic2V0TWFwcGluZyxcbiAgICAgIFRTdWJzZXRRdWVyaWVzXG4gICAgPixcbiAgKSB7XG4gICAgcmV0dXJuIGVuaGFuY2VycztcbiAgfVxuXG4gIC8qKlxuICAgKiDshJzruIzshYsg7L+866asIOyLpO2WiVxuICAgKlxuICAgKiAxLiDsv7zrpqwg7Iuk7ZaJIChwYWdpbmF0aW9uIOyggeyaqSlcbiAgICogMi4g66Gc642UIOyLpO2WiSAoMTpOLCBOOk0g6rSA6rOEIOuNsOydtO2EsCDroZzrlKkpXG4gICAqIDMuIEh5ZHJhdGUgKGZsYXQg4oaSIOykkeyyqSDqsJ3ssrQpXG4gICAqIDQuIEVuaGFuY2VyIOyggeyaqSAodmlydHVhbCDtlYTrk5wg6rOE7IKwKVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVN1YnNldFF1ZXJ5PFxuICAgIFQgZXh0ZW5kcyBUU3Vic2V0S2V5LFxuICAgIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBJbmZlckFsbFN1YnNldHM8VFN1YnNldFF1ZXJpZXMsIFRMb2FkZXJRdWVyaWVzPixcbiAgICBMUCBleHRlbmRzIHtcbiAgICAgIG51bT86IG51bWJlcjtcbiAgICAgIHBhZ2U/OiBudW1iZXI7XG4gICAgICBxdWVyeU1vZGU/OiBTb25hbXVRdWVyeU1vZGU7XG4gICAgfSxcbiAgPihcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN1YnNldDogVDtcbiAgICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+O1xuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIG51bTogbnVtYmVyO1xuICAgICAgICBwYWdlOiBudW1iZXI7XG4gICAgICAgIHF1ZXJ5TW9kZT86IFNvbmFtdVF1ZXJ5TW9kZTtcbiAgICAgIH07XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgICBvcHRpbWl6ZUNvdW50UXVlcnk/OiBib29sZWFuO1xuICAgIH0gJiBFbmhhbmNlclBhcmFtPFRTdWJzZXRLZXksIFRDb21wdXRlZFJlc3VsdHMsIFRTdWJzZXRNYXBwaW5nLCBUU3Vic2V0UXVlcmllcz4sXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgVFN1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgY29uc3QgeyBzdWJzZXQsIHFiLCBwYXJhbXM6IHF1ZXJ5UGFyYW1zLCBkZWJ1ZyA9IGZhbHNlLCBvcHRpbWl6ZUNvdW50UXVlcnkgPSBmYWxzZSB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0aGlzLmxvYWRlclF1ZXJpZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImxvYWRlclF1ZXJpZXMgaXMgbm90IGRlZmluZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgeyBudW0sIHBhZ2UgfSA9IHF1ZXJ5UGFyYW1zO1xuXG4gICAgLy8gQ09VTlQg7L+866asIOyLpO2WiSAocXVlcnlNb2RlOiBsaXN07J28IOuVjOuKlCAwIOumrO2EtClcbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUNvdW50UXVlcnkocWIsIHF1ZXJ5UGFyYW1zLCBkZWJ1Zywgb3B0aW1pemVDb3VudFF1ZXJ5KTtcblxuICAgIGlmIChxdWVyeVBhcmFtcz8ucXVlcnlNb2RlID09PSBcImNvdW50XCIpIHtcbiAgICAgIHJldHVybiB7IHRvdGFsIH0gYXMgTGlzdFJlc3VsdDxMUCwgVFN1YnNldE1hcHBpbmdbVF0+O1xuICAgIH1cblxuICAgIC8vIExJU1Qg7L+866asIOyLpO2WiVxuICAgIGNvbnN0IGNvbXB1dGVkUm93cyA9IGF3YWl0IHRoaXMuZXhlY3V0ZUxpc3RRdWVyeShzdWJzZXQsIHFiLCBxdWVyeVBhcmFtcywgbnVtLCBwYWdlLCBkZWJ1Zyk7XG5cbiAgICAvLyBFbmhhbmNlciDsoIHsmqlcbiAgICBjb25zdCBlbmhhbmNlciA9IChwYXJhbXMgYXMgYW55KS5lbmhhbmNlcnM/LltzdWJzZXRdO1xuICAgIGNvbnN0IGVuaGFuY2VkUm93cyA9IChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbXB1dGVkUm93cy5tYXAoKHJvdykgPT4gZW5oYW5jZXI/Lihyb3cpID8/IHJvdyksXG4gICAgKSkgYXMgVFN1YnNldE1hcHBpbmdbVF1bXTtcblxuICAgIC8vIEludGVybmFsIO2VhOuTnCDsoJzqsbBcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldCh0aGlzLm1vZGVsTmFtZSk7XG4gICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBlbnRpdHkuc3Vic2V0c0ludGVybmFsW3N1YnNldF0gPz8gW107XG4gICAgY29uc3Qgcm93cyA9XG4gICAgICBpbnRlcm5hbEZpZWxkcy5sZW5ndGggPiAwXG4gICAgICAgID8gZW5oYW5jZWRSb3dzLm1hcCgocm93KSA9PiB0aGlzLm9taXRJbnRlcm5hbEZpZWxkcyhyb3csIGludGVybmFsRmllbGRzKSlcbiAgICAgICAgOiBlbmhhbmNlZFJvd3M7XG5cbiAgICBpZiAocXVlcnlQYXJhbXMucXVlcnlNb2RlID09PSBcImxpc3RcIikge1xuICAgICAgLy8g66as7Iqk7Yq466eMIOumrO2EtFxuICAgICAgcmV0dXJuIHsgcm93cyB9IGFzIExpc3RSZXN1bHQ8TFAsIFRTdWJzZXRNYXBwaW5nW1RdPjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g65GY64ukIOumrO2EtFxuICAgICAgcmV0dXJuIHsgcm93cywgdG90YWwgfSBhcyBMaXN0UmVzdWx0PExQLCBUU3Vic2V0TWFwcGluZ1tUXT47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOqwneyytOyXkOyEnCBpbnRlcm5hbCDtlYTrk5wg7KCc6rGwXG4gICAqIOykkeyyqSDtlYTrk5wo7JiIOiBcInVzZXIuZW1haWxcIikg67CPIOuwsOyXtCjsmIg6IFwiZW1wbG95ZWVzLnNhbGFyeVwiKeuPhCDsspjrpqxcbiAgICovXG4gIG9taXRJbnRlcm5hbEZpZWxkczxUIGV4dGVuZHMgb2JqZWN0Pihyb3c6IFQsIGZpZWxkczogc3RyaW5nW10pOiBUIHtcbiAgICBjb25zdCByZXN1bHQgPSBjbG9uZURlZXAocm93KTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgdGhpcy5kZWxldGVGaWVsZChyZXN1bHQsIGZpZWxkLnNwbGl0KFwiLlwiKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog7KSR7LKpIO2VhOuTnCDsgq3soJwgKOuwsOyXtCDrgrQg6rCd7LK064+EIOyymOumrClcbiAgICovXG4gIGRlbGV0ZUZpZWxkKG9iajogYW55LCBwYXJ0czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBvYmouZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtICYmIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBkZWxldGUgaXRlbVtwYXJ0c1swXV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBvYmpbcGFydHNbMF1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBwYXJ0cztcbiAgICBjb25zdCBuZXh0ID0gb2JqW2ZpcnN0XTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG5leHQpKSB7XG4gICAgICBuZXh0Lm1hcCgoaXRlbSkgPT4gdGhpcy5kZWxldGVGaWVsZChpdGVtLCByZXN0KSk7XG4gICAgfSBlbHNlIGlmIChuZXh0ICYmIHR5cGVvZiBuZXh0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmRlbGV0ZUZpZWxkKG5leHQsIHJlc3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDT1VOVCDsv7zrpqwg7Iuk7ZaJICjrgrTrtoAg66mU7ISc65OcKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQ291bnRRdWVyeShcbiAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PixcbiAgICBwYXJhbXM6IHsgcXVlcnlNb2RlPzogXCJsaXN0XCIgfCBcImNvdW50XCIgfCBcImJvdGhcIiB9LFxuICAgIGRlYnVnOiBib29sZWFuLFxuICAgIG9wdGltaXplQ291bnRRdWVyeTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAocGFyYW1zLnF1ZXJ5TW9kZSA9PT0gXCJsaXN0XCIpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50UHVyaSA9IHFiLmNsb25lKCkuY2xlYXIoXCJvcmRlclwiKS5jbGVhcihcImxpbWl0XCIpLmNsZWFyKFwib2Zmc2V0XCIpO1xuXG4gICAgaWYgKG9wdGltaXplQ291bnRRdWVyeSkge1xuICAgICAgY29uc3QgeyBkZWZhdWx0OiBTcWxQYXJzZXIgfSA9IGF3YWl0IGltcG9ydChcIm5vZGUtc3FsLXBhcnNlclwiKTtcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBTcWxQYXJzZXIuUGFyc2VyKCk7XG4gICAgICBjb25zdCBwYXJzZWRRdWVyeSA9IHBhcnNlci5hc3RpZnkoY291bnRQdXJpLnRvUXVlcnkoKSwge1xuICAgICAgICBkYXRhYmFzZTogU29uYW11LmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBsZWZ0Sm9pblRhYmxlcyA9IGdldEpvaW5UYWJsZXMocGFyc2VkUXVlcnksIFtcIkxFRlQgSk9JTlwiXSk7XG4gICAgICBjb25zdCB3aGVyZVRhYmxlcyA9IGdldFRhYmxlTmFtZXNGcm9tV2hlcmUocGFyc2VkUXVlcnkpO1xuXG4gICAgICBjb25zdCB0YWJsZXNUb1JlbW92ZSA9IGxlZnRKb2luVGFibGVzLmZpbHRlcigoaikgPT4gIXdoZXJlVGFibGVzLmluY2x1ZGVzKGopKTtcbiAgICAgIHRhYmxlc1RvUmVtb3ZlLmZvckVhY2goKHRhYmxlKSA9PiB7XG4gICAgICAgIGNvdW50UHVyaS5jbGVhckpvaW4odGFibGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ09VTlQoKinroZwg7KCE7LK0IOugiOy9lOuTnCDsiJjrpbwg6rOE7IKwXG4gICAgLy8gVE9ETzogcWLsnZggRElTVElOQ1TqsIAg7J6I64qUIOqyveyasCDsspjrpqztlbTslbwg7ZWoXG4gICAgY29uc3QgY291bnRSZXN1bHQ6IHsgdG90YWw/OiBudW1iZXIgfSA9IGF3YWl0IGNvdW50UHVyaVxuICAgICAgLmNsZWFyKFwic2VsZWN0XCIpXG4gICAgICAuc2VsZWN0KHsgdG90YWw6IFB1cmkucmF3TnVtYmVyKGBDT1VOVCgqKTo6aW50ZWdlcmApIH0pXG4gICAgICAuZmlyc3QoKTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY291bnRQdXJpLmRlYnVnKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50UmVzdWx0Py50b3RhbCA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIExJU1Qg7L+866asIOyLpO2WiSAo64K067aAIOuplOyEnOuTnClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUxpc3RRdWVyeTxUIGV4dGVuZHMgVFN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+LFxuICAgIHBhcmFtczogeyBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiIH0sXG4gICAgbnVtOiBudW1iZXIsXG4gICAgcGFnZTogbnVtYmVyLFxuICAgIGRlYnVnOiBib29sZWFuLFxuICApOiBQcm9taXNlPGFueVtdPiB7XG4gICAgaWYgKHBhcmFtcy5xdWVyeU1vZGUgPT09IFwiY291bnRcIikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbWl0ZWRRYiA9ICgoKSA9PiB7XG4gICAgICBpZiAobnVtID09PSAwKSB7XG4gICAgICAgIHJldHVybiBxYjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxYi5saW1pdChudW0pLm9mZnNldChudW0gKiAocGFnZSAtIDEpKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIGxldCB1bmxvYWRlZFJvd3MgPSAoYXdhaXQgbGltaXRlZFFiKSBhcyBhbnlbXTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgcWIuZGVidWcoKTtcbiAgICB9XG5cbiAgICAvLyDroZzrjZQg7LKY66asXG4gICAgY29uc3QgbG9hZGVycyA9ICh0aGlzLmxvYWRlclF1ZXJpZXMgYXMgYW55KVtzdWJzZXRdO1xuICAgIGlmIChsb2FkZXJzICYmIEFycmF5LmlzQXJyYXkobG9hZGVycykpIHtcbiAgICAgIHVubG9hZGVkUm93cyA9IGF3YWl0IHRoaXMucHJvY2Vzc0xvYWRlcnModW5sb2FkZWRSb3dzLCBsb2FkZXJzLCBkZWJ1Zyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHlkcmF0ZSh1bmxvYWRlZFJvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyerOq3gOyggSDroZzrjZQg7LKY66asXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NMb2FkZXJzKHJvd3M6IGFueVtdLCBsb2FkZXJzOiBhbnlbXSwgZGVidWc6IGJvb2xlYW4pOiBQcm9taXNlPGFueVtdPiB7XG4gICAgZm9yIChjb25zdCByZXNvbHZlTG9hZGVyIG9mIGxvYWRlcnMpIHtcbiAgICAgIGNvbnN0IHsgYXMsIHJlZklkLCBxYjogcmVzb2x2ZUxvYWRlclFiRm4sIGxvYWRlcnM6IG5lc3RlZExvYWRlcnMgfSA9IHJlc29sdmVMb2FkZXI7XG5cbiAgICAgIGNvbnN0IHJlc29sdmVMb2FkZXJRYiA9IHJlc29sdmVMb2FkZXJRYkZuKFxuICAgICAgICBuZXcgUHVyaVdyYXBwZXIodGhpcy5nZXREQihcInJcIiksIG5ldyBVcHNlcnRCdWlsZGVyKCkpLFxuICAgICAgICByb3dzLm1hcCgocm93KSA9PiByb3dbcmVmSWRdKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICByZXNvbHZlTG9hZGVyUWIuZGVidWcoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGxvYWRlZFJvd3MgPSAoYXdhaXQgcmVzb2x2ZUxvYWRlclFiKSBhcyBhbnlbXTtcblxuICAgICAgLy8g7KSR7LKpIGxvYWRlcnPqsIAg7J6I7Jy866m0IOyerOq3gCDsspjrpqxcbiAgICAgIGlmIChuZXN0ZWRMb2FkZXJzICYmIG5lc3RlZExvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2FkZWRSb3dzID0gYXdhaXQgdGhpcy5wcm9jZXNzTG9hZGVycyhsb2FkZWRSb3dzLCBuZXN0ZWRMb2FkZXJzLCBkZWJ1Zyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YlJvd0dyb3VwcyA9IGdyb3VwKGxvYWRlZFJvd3MsIChyb3cpID0+IHJvdy5yZWZJZCk7XG5cbiAgICAgIHJvd3MgPSByb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIHJvd1thc10gPSAoc3ViUm93R3JvdXBzW3Jvd1tyZWZJZF1dID8/IFtdKS5tYXAoKHIpID0+IG9taXQociwgW1wicmVmSWRcIl0pKTtcbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXQg66CI7L2U65Oc66W8IOykkeyyqSDqsJ3ssrTroZwg67OA7ZmYXG4gICAqXG4gICAqIC0gYHVzZXJfX25hbWVgIOKGkiBgeyB1c2VyOiB7IG5hbWUgfSB9YFxuICAgKiAtIG51bGxhYmxlIHJlbGF0aW9u7J2YIOqyveyasCBpZCDtlYTrk5zqsIAgbnVsbOydtOuptCDqsJ3ssrQg7J6Q7LK066W8IG51bGzroZxcbiAgICovXG4gIGh5ZHJhdGU8VCBleHRlbmRzIFVua25vd25EQlJlY29yZD4ocm93czogVFtdKTogVFtdIHtcbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdzogVCkgPT4ge1xuICAgICAgLy8gbnVsbGFibGUgcmVsYXRpb24g7LKY66asOiDqt7jro7nsnZggaWQg7ZWE65Oc6rCAIG51bGzsnbTrqbQg6rCd7LK0IOyghOyytOulvCBudWxs66GcXG4gICAgICBjb25zdCBuZXN0ZWRLZXlzID0gT2JqZWN0LmtleXMocm93KS5maWx0ZXIoKGtleSkgPT4ga2V5LmluY2x1ZGVzKFwiX19cIikpO1xuICAgICAgY29uc3QgZ3JvdXBzID0gT2JqZWN0Lmdyb3VwQnkobmVzdGVkS2V5cywgKGtleSkgPT4ga2V5LnNwbGl0KFwiX19cIilbMF0pO1xuXG4gICAgICAvLyBpZCDtlYTrk5zqsIAgbnVsbOyduCDqt7jro7kg7LC+6riwICjsmIg6IHBhcmVudF9faWTqsIAgbnVsbOydtOuptCBwYXJlbnQg6re466O5IOyghOyytOqwgCBudWxsKVxuICAgICAgY29uc3QgbnVsbEtleXMgPSBPYmplY3QuZW50cmllcyhncm91cHMpXG4gICAgICAgIC5maWx0ZXIoKFtncm91cEtleSwgZmllbGRzXSkgPT4ge1xuICAgICAgICAgIGlmICghZmllbGRzIHx8IGZpZWxkcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgIC8vIOq3uOujueydmCBpZCDtlYTrk5wg7LC+6riwICjsmIg6IFwicGFyZW50X19pZFwiKVxuICAgICAgICAgIGNvbnN0IGlkRmllbGQgPSBgJHtncm91cEtleX1fX2lkYDtcbiAgICAgICAgICBpZiAoaWRGaWVsZCBpbiByb3cpIHtcbiAgICAgICAgICAgIC8vIGlkIO2VhOuTnOqwgCBudWxs7J2066m0IOqwneyytCDsoITssrTqsIAgbnVsbFxuICAgICAgICAgICAgcmV0dXJuIHJvd1tpZEZpZWxkXSA9PT0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZCDtlYTrk5zqsIAg7JeG7Jy866m0IOq4sOyhtCDroZzsp4E6IOuqqOuToCDtlYTrk5zqsIAgbnVsbOyduOyngCDtmZXsnbhcbiAgICAgICAgICByZXR1cm4gZmllbGRzLmV2ZXJ5KFxuICAgICAgICAgICAgKGZpZWxkKSA9PlxuICAgICAgICAgICAgICByb3dbZmllbGRdID09PSBudWxsIHx8IChBcnJheS5pc0FycmF5KHJvd1tmaWVsZF0pICYmIHJvd1tmaWVsZF0ubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcblxuICAgICAgY29uc3QgaHlkcmF0ZWQgPSBPYmplY3Qua2V5cyhyb3cpLnJlZHVjZSgociwgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKCFmaWVsZC5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgICAgLy8g7J2867CYIO2VhOuTnDog67Cw7Je0IOuCtCDqsJ3ssrTrqbQg7J6s6reAIGh5ZHJhdGVcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKSkge1xuICAgICAgICAgICAgcltmaWVsZF0gPSB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJbZmllbGRdID0gcm93W2ZpZWxkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDspJHssqkg7ZWE65OcIOyymOumrDogdXNlcl9fbmFtZSDihpIgdXNlcltuYW1lXVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGZpZWxkLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGNvbnN0IG9ialBhdGggPVxuICAgICAgICAgIHBhcnRzWzBdICtcbiAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBgWyR7cGFydH1dYClcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuXG4gICAgICAgIHIgPSBzZXQoXG4gICAgICAgICAgcixcbiAgICAgICAgICBvYmpQYXRoLFxuICAgICAgICAgIHJvd1tmaWVsZF0gJiYgQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKVxuICAgICAgICAgICAgPyB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSlcbiAgICAgICAgICAgIDogcm93W2ZpZWxkXSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sIHt9IGFzIFVua25vd25EQlJlY29yZCk7XG5cbiAgICAgIC8vIG51bGwgcmVsYXRpb24g7LKY66asXG4gICAgICBudWxsS2V5cy5mb3JFYWNoKChudWxsS2V5KSA9PiB7XG4gICAgICAgIGh5ZHJhdGVkW251bGxLZXldID0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaHlkcmF0ZWQ7XG4gICAgfSkgYXMgVFtdO1xuICB9XG59XG5cbi8qKlxuICogRW5oYW5jZXIg7YyM652866+47YSwIOyhsOqxtOu2gCDtg4DsnoVcbiAqIFJlcXVpcmVkRW5oYW5jZXJLZXlz6rCAIOyXhuycvOuptCBlbmhhbmNlcnMg7ISg7YOd7KCBLCDsnojsnLzrqbQg7ZWE7IiYXG4gKi9cbnR5cGUgRW5oYW5jZXJQYXJhbTxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0UXVlcmllcyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBQdXJpU3Vic2V0Rm4+LFxuPiA9IFtSZXF1aXJlZEVuaGFuY2VyS2V5czxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz5dIGV4dGVuZHMgW25ldmVyXVxuICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmcsIFRTdWJzZXRRdWVyaWVzPiB9XG4gIDogeyBlbmhhbmNlcnM6IEVuaGFuY2VyTWFwPFRTdWJzZXRLZXksIFRDb21wdXRlZFJlc3VsdHMsIFRTdWJzZXRNYXBwaW5nLCBUU3Vic2V0UXVlcmllcz4gfTtcblxudHlwZSBSZXF1aXJlZEVuaGFuY2VyS2V5czxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuPiA9IHtcbiAgW0sgaW4gVFN1YnNldEtleV06IFRDb21wdXRlZFJlc3VsdHNbS10gZXh0ZW5kcyBUU3Vic2V0TWFwcGluZ1tLXSA/IG5ldmVyIDogSztcbn1bVFN1YnNldEtleV07XG5cbmV4cG9ydCBjb25zdCBCYXNlTW9kZWwgPSBuZXcgQmFzZU1vZGVsQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJjbG9uZURlZXAiLCJncm91cCIsImlzT2JqZWN0Iiwib21pdCIsInNldCIsIlNvbmFtdSIsIkVudGl0eU1hbmFnZXIiLCJnZXRKb2luVGFibGVzIiwiZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSIsImNodW5rIiwiREIiLCJQdXJpIiwiUHVyaVdyYXBwZXIiLCJVcHNlcnRCdWlsZGVyIiwiQmFzZU1vZGVsQ2xhc3MiLCJtb2RlbE5hbWUiLCJzdWJzZXRRdWVyaWVzIiwibG9hZGVyUXVlcmllcyIsImdldERCIiwid2hpY2giLCJnZXRQdXJpIiwidHJ4IiwiZ2V0VHJhbnNhY3Rpb25Db250ZXh0IiwiZ2V0VHJhbnNhY3Rpb24iLCJkYiIsImRlc3Ryb3kiLCJnZXRJbnNlcnRlZElkcyIsIndkYiIsInJvd3MiLCJ0YWJsZU5hbWUiLCJ1bnFLZXlGaWVsZHMiLCJjaHVua1NpemUiLCJ1bnFLZXlzIiwid2hlcmVJbkZpZWxkIiwic2VsZWN0RmllbGQiLCJsZW5ndGgiLCJyYXciLCJqb2luIiwibWFwIiwicm93IiwiZmllbGQiLCJyZXN1bHRJZHMiLCJpdGVtcyIsImRiUm93cyIsInNlbGVjdCIsIndoZXJlSW4iLCJjb25jYXQiLCJkYlJvdyIsInBhcnNlSW50IiwiU3RyaW5nIiwiaWQiLCJnZXRTdWJzZXRRdWVyaWVzIiwic3Vic2V0IiwiRXJyb3IiLCJwdXJpV3JhcHBlciIsInFiIiwib25TdWJzZXQiLCJfc3Vic2V0IiwiY3JlYXRlRW5oYW5jZXJzIiwiZW5oYW5jZXJzIiwiZXhlY3V0ZVN1YnNldFF1ZXJ5IiwicGFyYW1zIiwicXVlcnlQYXJhbXMiLCJkZWJ1ZyIsIm9wdGltaXplQ291bnRRdWVyeSIsIm51bSIsInBhZ2UiLCJ0b3RhbCIsImV4ZWN1dGVDb3VudFF1ZXJ5IiwicXVlcnlNb2RlIiwiY29tcHV0ZWRSb3dzIiwiZXhlY3V0ZUxpc3RRdWVyeSIsImVuaGFuY2VyIiwiZW5oYW5jZWRSb3dzIiwiUHJvbWlzZSIsImFsbCIsImVudGl0eSIsImdldCIsImludGVybmFsRmllbGRzIiwic3Vic2V0c0ludGVybmFsIiwib21pdEludGVybmFsRmllbGRzIiwiZmllbGRzIiwicmVzdWx0IiwiZGVsZXRlRmllbGQiLCJzcGxpdCIsIm9iaiIsInBhcnRzIiwiQXJyYXkiLCJpc0FycmF5IiwiZm9yRWFjaCIsIml0ZW0iLCJmaXJzdCIsInJlc3QiLCJuZXh0IiwiY291bnRQdXJpIiwiY2xvbmUiLCJjbGVhciIsImRlZmF1bHQiLCJTcWxQYXJzZXIiLCJwYXJzZXIiLCJQYXJzZXIiLCJwYXJzZWRRdWVyeSIsImFzdGlmeSIsInRvUXVlcnkiLCJkYXRhYmFzZSIsImNvbmZpZyIsImxlZnRKb2luVGFibGVzIiwid2hlcmVUYWJsZXMiLCJ0YWJsZXNUb1JlbW92ZSIsImZpbHRlciIsImoiLCJpbmNsdWRlcyIsInRhYmxlIiwiY2xlYXJKb2luIiwiY291bnRSZXN1bHQiLCJyYXdOdW1iZXIiLCJsaW1pdGVkUWIiLCJsaW1pdCIsIm9mZnNldCIsInVubG9hZGVkUm93cyIsImxvYWRlcnMiLCJwcm9jZXNzTG9hZGVycyIsImh5ZHJhdGUiLCJyZXNvbHZlTG9hZGVyIiwiYXMiLCJyZWZJZCIsInJlc29sdmVMb2FkZXJRYkZuIiwibmVzdGVkTG9hZGVycyIsInJlc29sdmVMb2FkZXJRYiIsImxvYWRlZFJvd3MiLCJzdWJSb3dHcm91cHMiLCJyIiwibmVzdGVkS2V5cyIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJncm91cHMiLCJncm91cEJ5IiwibnVsbEtleXMiLCJlbnRyaWVzIiwiZ3JvdXBLZXkiLCJpZEZpZWxkIiwiZXZlcnkiLCJoeWRyYXRlZCIsInJlZHVjZSIsIm9ialBhdGgiLCJzbGljZSIsInBhcnQiLCJudWxsS2V5IiwiQmFzZU1vZGVsIl0sIm1hcHBpbmdzIjoiQUFBQSxrR0FBa0csR0FHbEcsU0FBU0EsU0FBUyxFQUFFQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsSUFBSSxFQUFFQyxHQUFHLFFBQVEsVUFBVTtBQUVoRSxTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFDaEMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUV6RCxTQUFTQyxhQUFhLEVBQUVDLHNCQUFzQixRQUFRLHlCQUFz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
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJp7J2YIO2DgOyeheydgCDqsJzrs4Qg66qo64247JeQ7IScIO2ZleygleuQmOuvgOuhnCBCYXNlTW9kZWzsl5DshJzripQgYW5566W8IO2XiOyaqe2VqCAqL1xuaW1wb3J0IHsgZ2V0TG9nZ2VyLCB0eXBlIExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBncm91cCwgaXNPYmplY3QsIG9taXQsIHNldCB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RSZXN1bHQgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VTY2hlbWFFeHRlbmQsIFNvbmFtdVF1ZXJ5TW9kZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Sm9pblRhYmxlcywgZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSB9IGZyb20gXCIuLi91dGlscy9zcWwtcGFyc2VyXCI7XG5pbXBvcnQgeyBjaHVuayB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlck1hcCwgUmVzb2x2ZVN1YnNldEludGVyc2VjdGlvbiB9IGZyb20gXCIuL2Jhc2UtbW9kZWwudHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgREJQcmVzZXQgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgUHVyaSB9IGZyb20gXCIuL3B1cmlcIjtcbmltcG9ydCB0eXBlIHsgVW5pb25FeHRyYWN0ZWRUVGFibGVzIH0gZnJvbSBcIi4vcHVyaS50eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmZlckFsbFN1YnNldHMsIFB1cmlMb2FkZXJRdWVyaWVzLCBQdXJpU3Vic2V0Rm4gfSBmcm9tIFwiLi9wdXJpLXN1YnNldC50eXBlc1wiO1xuaW1wb3J0IHsgUHVyaVdyYXBwZXIgfSBmcm9tIFwiLi9wdXJpLXdyYXBwZXJcIjtcbmltcG9ydCB7IFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi91cHNlcnQtYnVpbGRlclwiO1xuXG50eXBlIFVua25vd25EQlJlY29yZCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIOuqqOuToCBNb2RlbCDtgbTrnpjsiqTsnZgg6riw67O4IO2BtOuemOyKpFxuICpcbiAqIEB0ZW1wbGF0ZSBUU3Vic2V0S2V5IC0g7ISc67iM7IWLIO2CpCDsnKDri4jsmKggKOyYiDogXCJBXCIgfCBcIlBcIiB8IFwiU1NcIilcbiAqIEB0ZW1wbGF0ZSBUU3Vic2V0TWFwcGluZyAtIOyEnOu4jOyFi+uzhCDstZzsooUg6rKw6rO8IO2DgOyehSDrp6TtlZFcbiAqIEB0ZW1wbGF0ZSBUU3Vic2V0UXVlcmllcyAtIOyEnOu4jOyFiyDsv7zrpqwg7ZWo7IiYIOqwneyytFxuICogQHRlbXBsYXRlIFRMb2FkZXJRdWVyaWVzIC0g7ISc67iM7IWL67OEIOuhnOuNlCDsv7zrpqwg67Cw7Je0IOqwneyytFxuICovXG5leHBvcnQgY2xhc3MgQmFzZU1vZGVsQ2xhc3M8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlcixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXIsXG4gIFRTdWJzZXRRdWVyaWVzIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIFB1cmlTdWJzZXRGbj4gPSBuZXZlcixcbiAgVExvYWRlclF1ZXJpZXMgZXh0ZW5kcyBQdXJpTG9hZGVyUXVlcmllczxUU3Vic2V0S2V5PiA9IG5ldmVyLFxuPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbW9kZWxOYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgcHJvdGVjdGVkIHN1YnNldFF1ZXJpZXM/OiBUU3Vic2V0UXVlcmllcyxcbiAgICBwcm90ZWN0ZWQgbG9hZGVyUXVlcmllcz86IFRMb2FkZXJRdWVyaWVzLFxuICApIHtcbiAgICB0aGlzLmxvZ2dlciA9IGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLm1vZGVsTmFtZSwgXCJtb2RlbFwiKSk7XG4gIH1cblxuICBnZXREQih3aGljaDogREJQcmVzZXQpOiBLbmV4IHtcbiAgICByZXR1cm4gREIuZ2V0REIod2hpY2gpO1xuICB9XG5cbiAgZ2V0UHVyaSh3aGljaDogREJQcmVzZXQpOiBQdXJpV3JhcHBlciB7XG4gICAgLy8g7Yq4656c7J6t7IWYIOy7qO2FjeyKpO2KuOyXkOyEnCDtirjrnpzsnq3shZgg7ZqN65OdXG4gICAgY29uc3QgdHJ4ID0gREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZ2V0VHJhbnNhY3Rpb24od2hpY2gpO1xuICAgIGlmICh0cngpIHtcbiAgICAgIHJldHVybiB0cng7XG4gICAgfVxuXG4gICAgLy8g7Yq4656c7J6t7IWY7J20IOyXhuycvOuptCDsg4jroZzsmrQgUHVyaVdyYXBwZXIg67CY7ZmYXG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKHdoaWNoKTtcbiAgICByZXR1cm4gbmV3IFB1cmlXcmFwcGVyKGRiLCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgcmV0dXJuIERCLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGFzeW5jIGdldEluc2VydGVkSWRzKFxuICAgIHdkYjogS25leCxcbiAgICByb3dzOiBVbmtub3duREJSZWNvcmRbXSxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICB1bnFLZXlGaWVsZHM6IHN0cmluZ1tdLFxuICAgIGNodW5rU2l6ZTogbnVtYmVyID0gNTAwLFxuICApIHtcbiAgICBpZiAoIXdkYikge1xuICAgICAgd2RiID0gdGhpcy5nZXREQihcIndcIik7XG4gICAgfVxuXG4gICAgbGV0IHVucUtleXM6IHN0cmluZ1tdO1xuICAgIGxldCB3aGVyZUluRmllbGQ6IHN0cmluZyB8IEtuZXguUmF3O1xuICAgIGxldCBzZWxlY3RGaWVsZDogc3RyaW5nO1xuXG4gICAgaWYgKHVucUtleUZpZWxkcy5sZW5ndGggPiAxKSB7XG4gICAgICB3aGVyZUluRmllbGQgPSB3ZGIucmF3KGBDT05DQVRfV1MoJ18nLCAnJHt1bnFLZXlGaWVsZHMuam9pbihcIixcIil9JylgKTtcbiAgICAgIHNlbGVjdEZpZWxkID0gYCR7d2hlcmVJbkZpZWxkfSBhcyB0bXBVaWRgO1xuICAgICAgdW5xS2V5cyA9IHJvd3MubWFwKChyb3cpID0+IHVucUtleUZpZWxkcy5tYXAoKGZpZWxkKSA9PiByb3dbZmllbGRdKS5qb2luKFwiX1wiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoZXJlSW5GaWVsZCA9IHVucUtleUZpZWxkc1swXTtcbiAgICAgIHNlbGVjdEZpZWxkID0gdW5xS2V5RmllbGRzWzBdO1xuICAgICAgdW5xS2V5cyA9IHJvd3MubWFwKChyb3cpID0+IHJvd1t1bnFLZXlGaWVsZHNbMF1dIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdElkczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGl0ZW1zIG9mIGNodW5rKHVucUtleXMsIGNodW5rU2l6ZSkpIHtcbiAgICAgIGNvbnN0IGRiUm93cyA9IGF3YWl0IHdkYih0YWJsZU5hbWUpXG4gICAgICAgIC5zZWxlY3QoXCJpZFwiLCB3ZGIucmF3KHNlbGVjdEZpZWxkKSlcbiAgICAgICAgLndoZXJlSW4od2hlcmVJbkZpZWxkIGFzIHN0cmluZywgaXRlbXMpO1xuICAgICAgcmVzdWx0SWRzID0gcmVzdWx0SWRzLmNvbmNhdChcbiAgICAgICAgZGJSb3dzLm1hcCgoZGJSb3c6IFVua25vd25EQlJlY29yZCkgPT4gcGFyc2VJbnQoU3RyaW5nKGRiUm93LmlkKSkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0SWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSDshJzruIzshYvsl5Ag64yA7ZWcIOy/vOumrCDruYzrjZQg7ZqN65OdXG4gICAqXG4gICAqIEByZXR1cm5zIHFiIC0g7L+866asIOu5jOuNlCAo7KGw6rG0IOy2lOqwgOyaqSlcbiAgICogQHJldHVybnMgb25TdWJzZXQgLSDtirnsoJUg7ISc67iM7IWLIOyghOyaqSDtg4DsnoXsnbQg7ZWE7JqU7ZWgIOuVjCDsgqzsmqlcbiAgICovXG4gIGdldFN1YnNldFF1ZXJpZXM8VCBleHRlbmRzIFRTdWJzZXRLZXk+KHN1YnNldDogVCkge1xuICAgIGlmICghdGhpcy5zdWJzZXRRdWVyaWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdWJzZXRRdWVyaWVzIGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHB1cmlXcmFwcGVyID0gbmV3IFB1cmlXcmFwcGVyKHRoaXMuZ2V0REIoXCJyXCIpLCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgICBjb25zdCBxYiA9IHRoaXMuc3Vic2V0UXVlcmllc1tzdWJzZXRdPy4ocHVyaVdyYXBwZXIpO1xuXG4gICAgLy8gTm9uQWxsb3dlZEFzU2luZ2xlVGFibGU6IOuLqOydvCDthYzsnbTruJQg7Lus65+8IOygkeq3vCDrsKnsp4Dsmqkg66eI7LukXG4gICAgdHlwZSBRQlRhYmxlcyA9IFVuaW9uRXh0cmFjdGVkVFRhYmxlczxUU3Vic2V0S2V5LCBUU3Vic2V0UXVlcmllcz4gJiB7XG4gICAgICBOb25BbGxvd2VkQXNTaW5nbGVUYWJsZTogeyBfX2Z1bGx0ZXh0X186IHRydWUgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHFiOiBxYiBhcyB1bmtub3duIGFzIFB1cmk8RGF0YWJhc2VTY2hlbWFFeHRlbmQsIFFCVGFibGVzLCB7fT4sXG4gICAgICBvblN1YnNldDogKChfc3Vic2V0OiBUU3Vic2V0S2V5IHwgcmVhZG9ubHkgVFN1YnNldEtleVtdKSA9PiBxYikgYXMge1xuICAgICAgICAvLyDri6jsnbwg7YKkXG4gICAgICAgIDxTIGV4dGVuZHMgVFN1YnNldEtleT4oc3Vic2V0OiBTKTogUmV0dXJuVHlwZTxUU3Vic2V0UXVlcmllc1tTXT47XG4gICAgICAgIC8vIO2CpCDrsLDsl7QgLT4g6rWQ7KeR7ZWpIOuwmO2ZmFxuICAgICAgICA8QXJyIGV4dGVuZHMgcmVhZG9ubHkgVFN1YnNldEtleVtdPihcbiAgICAgICAgICBzdWJzZXRzOiBbLi4uQXJyXSxcbiAgICAgICAgKTogUmVzb2x2ZVN1YnNldEludGVyc2VjdGlvbjxBcnIsIFRTdWJzZXRRdWVyaWVzPjtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmhhbmNlciDqsJ3ssrQg7IOd7ISxIO2XrO2NvFxuICAgKiDtg4DsnoUg6rKA7KadIOuwjyDstpTroaDsnYQg64+E7JmA7KSMXG4gICAqL1xuICBjcmVhdGVFbmhhbmNlcnM8VCBleHRlbmRzIFRTdWJzZXRLZXk+KFxuICAgIGVuaGFuY2VyczogRW5oYW5jZXJNYXA8XG4gICAgICBULFxuICAgICAgSW5mZXJBbGxTdWJzZXRzPFRTdWJzZXRRdWVyaWVzLCBUTG9hZGVyUXVlcmllcz4sXG4gICAgICBUU3Vic2V0TWFwcGluZyxcbiAgICAgIFRTdWJzZXRRdWVyaWVzXG4gICAgPixcbiAgKSB7XG4gICAgcmV0dXJuIGVuaGFuY2VycztcbiAgfVxuXG4gIC8qKlxuICAgKiDshJzruIzshYsg7L+866asIOyLpO2WiVxuICAgKlxuICAgKiAxLiDsv7zrpqwg7Iuk7ZaJIChwYWdpbmF0aW9uIOyggeyaqSlcbiAgICogMi4g66Gc642UIOyLpO2WiSAoMTpOLCBOOk0g6rSA6rOEIOuNsOydtO2EsCDroZzrlKkpXG4gICAqIDMuIEh5ZHJhdGUgKGZsYXQg4oaSIOykkeyyqSDqsJ3ssrQpXG4gICAqIDQuIEVuaGFuY2VyIOyggeyaqSAodmlydHVhbCDtlYTrk5wg6rOE7IKwKVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVN1YnNldFF1ZXJ5PFxuICAgIFQgZXh0ZW5kcyBUU3Vic2V0S2V5LFxuICAgIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBJbmZlckFsbFN1YnNldHM8VFN1YnNldFF1ZXJpZXMsIFRMb2FkZXJRdWVyaWVzPixcbiAgICBMUCBleHRlbmRzIHtcbiAgICAgIG51bT86IG51bWJlcjtcbiAgICAgIHBhZ2U/OiBudW1iZXI7XG4gICAgICBxdWVyeU1vZGU/OiBTb25hbXVRdWVyeU1vZGU7XG4gICAgfSxcbiAgPihcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN1YnNldDogVDtcbiAgICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+O1xuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIG51bTogbnVtYmVyO1xuICAgICAgICBwYWdlOiBudW1iZXI7XG4gICAgICAgIHF1ZXJ5TW9kZT86IFNvbmFtdVF1ZXJ5TW9kZTtcbiAgICAgIH07XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgICBvcHRpbWl6ZUNvdW50UXVlcnk/OiBib29sZWFuO1xuICAgIH0gJiBFbmhhbmNlclBhcmFtPFRTdWJzZXRLZXksIFRDb21wdXRlZFJlc3VsdHMsIFRTdWJzZXRNYXBwaW5nLCBUU3Vic2V0UXVlcmllcz4sXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgVFN1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgY29uc3QgeyBzdWJzZXQsIHFiLCBwYXJhbXM6IHF1ZXJ5UGFyYW1zLCBkZWJ1ZyA9IGZhbHNlLCBvcHRpbWl6ZUNvdW50UXVlcnkgPSBmYWxzZSB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0aGlzLmxvYWRlclF1ZXJpZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImxvYWRlclF1ZXJpZXMgaXMgbm90IGRlZmluZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgeyBudW0sIHBhZ2UgfSA9IHF1ZXJ5UGFyYW1zO1xuXG4gICAgLy8gQ09VTlQg7L+866asIOyLpO2WiSAocXVlcnlNb2RlOiBsaXN07J28IOuVjOuKlCAwIOumrO2EtClcbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUNvdW50UXVlcnkocWIsIHF1ZXJ5UGFyYW1zLCBkZWJ1Zywgb3B0aW1pemVDb3VudFF1ZXJ5KTtcblxuICAgIGlmIChxdWVyeVBhcmFtcz8ucXVlcnlNb2RlID09PSBcImNvdW50XCIpIHtcbiAgICAgIHJldHVybiB7IHRvdGFsIH0gYXMgTGlzdFJlc3VsdDxMUCwgVFN1YnNldE1hcHBpbmdbVF0+O1xuICAgIH1cblxuICAgIC8vIExJU1Qg7L+866asIOyLpO2WiVxuICAgIGNvbnN0IGNvbXB1dGVkUm93cyA9IGF3YWl0IHRoaXMuZXhlY3V0ZUxpc3RRdWVyeShzdWJzZXQsIHFiLCBxdWVyeVBhcmFtcywgbnVtLCBwYWdlLCBkZWJ1Zyk7XG5cbiAgICAvLyBFbmhhbmNlciDsoIHsmqlcbiAgICBjb25zdCBlbmhhbmNlciA9IChwYXJhbXMgYXMgYW55KS5lbmhhbmNlcnM/LltzdWJzZXRdO1xuICAgIGNvbnN0IGVuaGFuY2VkUm93cyA9IChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbXB1dGVkUm93cy5tYXAoKHJvdykgPT4gZW5oYW5jZXI/Lihyb3cpID8/IHJvdyksXG4gICAgKSkgYXMgVFN1YnNldE1hcHBpbmdbVF1bXTtcblxuICAgIC8vIEludGVybmFsIO2VhOuTnCDsoJzqsbBcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldCh0aGlzLm1vZGVsTmFtZSk7XG4gICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBlbnRpdHkuc3Vic2V0c0ludGVybmFsW3N1YnNldF0gPz8gW107XG4gICAgY29uc3Qgcm93cyA9XG4gICAgICBpbnRlcm5hbEZpZWxkcy5sZW5ndGggPiAwXG4gICAgICAgID8gZW5oYW5jZWRSb3dzLm1hcCgocm93KSA9PiB0aGlzLm9taXRJbnRlcm5hbEZpZWxkcyhyb3csIGludGVybmFsRmllbGRzKSlcbiAgICAgICAgOiBlbmhhbmNlZFJvd3M7XG5cbiAgICBpZiAocXVlcnlQYXJhbXMucXVlcnlNb2RlID09PSBcImxpc3RcIikge1xuICAgICAgLy8g66as7Iqk7Yq466eMIOumrO2EtFxuICAgICAgcmV0dXJuIHsgcm93cyB9IGFzIExpc3RSZXN1bHQ8TFAsIFRTdWJzZXRNYXBwaW5nW1RdPjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g65GY64ukIOumrO2EtFxuICAgICAgcmV0dXJuIHsgcm93cywgdG90YWwgfSBhcyBMaXN0UmVzdWx0PExQLCBUU3Vic2V0TWFwcGluZ1tUXT47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOqwneyytOyXkOyEnCBpbnRlcm5hbCDtlYTrk5wg7KCc6rGwXG4gICAqIOykkeyyqSDtlYTrk5wo7JiIOiBcInVzZXIuZW1haWxcIikg67CPIOuwsOyXtCjsmIg6IFwiZW1wbG95ZWVzLnNhbGFyeVwiKeuPhCDsspjrpqxcbiAgICovXG4gIG9taXRJbnRlcm5hbEZpZWxkczxUIGV4dGVuZHMgb2JqZWN0Pihyb3c6IFQsIGZpZWxkczogc3RyaW5nW10pOiBUIHtcbiAgICBjb25zdCByZXN1bHQgPSBjbG9uZURlZXAocm93KTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgdGhpcy5kZWxldGVGaWVsZChyZXN1bHQsIGZpZWxkLnNwbGl0KFwiLlwiKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog7KSR7LKpIO2VhOuTnCDsgq3soJwgKOuwsOyXtCDrgrQg6rCd7LK064+EIOyymOumrClcbiAgICovXG4gIGRlbGV0ZUZpZWxkKG9iajogYW55LCBwYXJ0czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBvYmouZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtICYmIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBkZWxldGUgaXRlbVtwYXJ0c1swXV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBvYmpbcGFydHNbMF1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBwYXJ0cztcbiAgICBjb25zdCBuZXh0ID0gb2JqW2ZpcnN0XTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG5leHQpKSB7XG4gICAgICBuZXh0Lm1hcCgoaXRlbSkgPT4gdGhpcy5kZWxldGVGaWVsZChpdGVtLCByZXN0KSk7XG4gICAgfSBlbHNlIGlmIChuZXh0ICYmIHR5cGVvZiBuZXh0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmRlbGV0ZUZpZWxkKG5leHQsIHJlc3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDT1VOVCDsv7zrpqwg7Iuk7ZaJICjrgrTrtoAg66mU7ISc65OcKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQ291bnRRdWVyeShcbiAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PixcbiAgICBwYXJhbXM6IHsgcXVlcnlNb2RlPzogXCJsaXN0XCIgfCBcImNvdW50XCIgfCBcImJvdGhcIiB9LFxuICAgIGRlYnVnOiBib29sZWFuLFxuICAgIG9wdGltaXplQ291bnRRdWVyeTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAocGFyYW1zLnF1ZXJ5TW9kZSA9PT0gXCJsaXN0XCIpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50UHVyaSA9IHFiLmNsb25lKCkuY2xlYXIoXCJvcmRlclwiKS5jbGVhcihcImxpbWl0XCIpLmNsZWFyKFwib2Zmc2V0XCIpO1xuXG4gICAgaWYgKG9wdGltaXplQ291bnRRdWVyeSkge1xuICAgICAgY29uc3QgeyBkZWZhdWx0OiBTcWxQYXJzZXIgfSA9IGF3YWl0IGltcG9ydChcIm5vZGUtc3FsLXBhcnNlclwiKTtcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBTcWxQYXJzZXIuUGFyc2VyKCk7XG4gICAgICBjb25zdCBwYXJzZWRRdWVyeSA9IHBhcnNlci5hc3RpZnkoY291bnRQdXJpLnRvUXVlcnkoKSwge1xuICAgICAgICBkYXRhYmFzZTogU29uYW11LmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBsZWZ0Sm9pblRhYmxlcyA9IGdldEpvaW5UYWJsZXMocGFyc2VkUXVlcnksIFtcIkxFRlQgSk9JTlwiXSk7XG4gICAgICBjb25zdCB3aGVyZVRhYmxlcyA9IGdldFRhYmxlTmFtZXNGcm9tV2hlcmUocGFyc2VkUXVlcnkpO1xuXG4gICAgICBjb25zdCB0YWJsZXNUb1JlbW92ZSA9IGxlZnRKb2luVGFibGVzLmZpbHRlcigoaikgPT4gIXdoZXJlVGFibGVzLmluY2x1ZGVzKGopKTtcbiAgICAgIHRhYmxlc1RvUmVtb3ZlLmZvckVhY2goKHRhYmxlKSA9PiB7XG4gICAgICAgIGNvdW50UHVyaS5jbGVhckpvaW4odGFibGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ09VTlQoKinroZwg7KCE7LK0IOugiOy9lOuTnCDsiJjrpbwg6rOE7IKwXG4gICAgLy8gVE9ETzogcWLsnZggRElTVElOQ1TqsIAg7J6I64qUIOqyveyasCDsspjrpqztlbTslbwg7ZWoXG4gICAgY29uc3QgY291bnRSZXN1bHQ6IHsgdG90YWw/OiBudW1iZXIgfSA9IGF3YWl0IGNvdW50UHVyaVxuICAgICAgLmNsZWFyKFwic2VsZWN0XCIpXG4gICAgICAuc2VsZWN0KHsgdG90YWw6IFB1cmkucmF3TnVtYmVyKGBDT1VOVCgqKTo6aW50ZWdlcmApIH0pXG4gICAgICAuZmlyc3QoKTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY291bnRQdXJpLmRlYnVnKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50UmVzdWx0Py50b3RhbCA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIExJU1Qg7L+866asIOyLpO2WiSAo64K067aAIOuplOyEnOuTnClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUxpc3RRdWVyeTxUIGV4dGVuZHMgVFN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+LFxuICAgIHBhcmFtczogeyBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiIH0sXG4gICAgbnVtOiBudW1iZXIsXG4gICAgcGFnZTogbnVtYmVyLFxuICAgIGRlYnVnOiBib29sZWFuLFxuICApOiBQcm9taXNlPGFueVtdPiB7XG4gICAgaWYgKHBhcmFtcy5xdWVyeU1vZGUgPT09IFwiY291bnRcIikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbWl0ZWRRYiA9ICgoKSA9PiB7XG4gICAgICBpZiAobnVtID09PSAwKSB7XG4gICAgICAgIHJldHVybiBxYjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxYi5saW1pdChudW0pLm9mZnNldChudW0gKiAocGFnZSAtIDEpKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIGxldCB1bmxvYWRlZFJvd3MgPSAoYXdhaXQgbGltaXRlZFFiKSBhcyBhbnlbXTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgcWIuZGVidWcoKTtcbiAgICB9XG5cbiAgICAvLyDroZzrjZQg7LKY66asXG4gICAgY29uc3QgbG9hZGVycyA9ICh0aGlzLmxvYWRlclF1ZXJpZXMgYXMgYW55KVtzdWJzZXRdO1xuICAgIGlmIChsb2FkZXJzICYmIEFycmF5LmlzQXJyYXkobG9hZGVycykpIHtcbiAgICAgIHVubG9hZGVkUm93cyA9IGF3YWl0IHRoaXMucHJvY2Vzc0xvYWRlcnModW5sb2FkZWRSb3dzLCBsb2FkZXJzLCBkZWJ1Zyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHlkcmF0ZSh1bmxvYWRlZFJvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyerOq3gOyggSDroZzrjZQg7LKY66asXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NMb2FkZXJzKHJvd3M6IGFueVtdLCBsb2FkZXJzOiBhbnlbXSwgZGVidWc6IGJvb2xlYW4pOiBQcm9taXNlPGFueVtdPiB7XG4gICAgZm9yIChjb25zdCByZXNvbHZlTG9hZGVyIG9mIGxvYWRlcnMpIHtcbiAgICAgIGNvbnN0IHsgYXMsIHJlZklkLCBxYjogcmVzb2x2ZUxvYWRlclFiRm4sIGxvYWRlcnM6IG5lc3RlZExvYWRlcnMgfSA9IHJlc29sdmVMb2FkZXI7XG5cbiAgICAgIGNvbnN0IHJlc29sdmVMb2FkZXJRYiA9IHJlc29sdmVMb2FkZXJRYkZuKFxuICAgICAgICBuZXcgUHVyaVdyYXBwZXIodGhpcy5nZXREQihcInJcIiksIG5ldyBVcHNlcnRCdWlsZGVyKCkpLFxuICAgICAgICByb3dzLm1hcCgocm93KSA9PiByb3dbcmVmSWRdKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICByZXNvbHZlTG9hZGVyUWIuZGVidWcoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGxvYWRlZFJvd3MgPSAoYXdhaXQgcmVzb2x2ZUxvYWRlclFiKSBhcyBhbnlbXTtcblxuICAgICAgLy8g7KSR7LKpIGxvYWRlcnPqsIAg7J6I7Jy866m0IOyerOq3gCDsspjrpqxcbiAgICAgIGlmIChuZXN0ZWRMb2FkZXJzICYmIG5lc3RlZExvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2FkZWRSb3dzID0gYXdhaXQgdGhpcy5wcm9jZXNzTG9hZGVycyhsb2FkZWRSb3dzLCBuZXN0ZWRMb2FkZXJzLCBkZWJ1Zyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YlJvd0dyb3VwcyA9IGdyb3VwKGxvYWRlZFJvd3MsIChyb3cpID0+IHJvdy5yZWZJZCk7XG5cbiAgICAgIHJvd3MgPSByb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIHJvd1thc10gPSAoc3ViUm93R3JvdXBzW3Jvd1tyZWZJZF1dID8/IFtdKS5tYXAoKHIpID0+IG9taXQociwgW1wicmVmSWRcIl0pKTtcbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXQg66CI7L2U65Oc66W8IOykkeyyqSDqsJ3ssrTroZwg67OA7ZmYXG4gICAqXG4gICAqIC0gYHVzZXJfX25hbWVgIOKGkiBgeyB1c2VyOiB7IG5hbWUgfSB9YFxuICAgKiAtIG51bGxhYmxlIHJlbGF0aW9u7J2YIOqyveyasCBpZCDtlYTrk5zqsIAgbnVsbOydtOuptCDqsJ3ssrQg7J6Q7LK066W8IG51bGzroZxcbiAgICovXG4gIGh5ZHJhdGU8VCBleHRlbmRzIFVua25vd25EQlJlY29yZD4ocm93czogVFtdKTogVFtdIHtcbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdzogVCkgPT4ge1xuICAgICAgLy8gbnVsbGFibGUgcmVsYXRpb24g7LKY66asOiDqt7jro7nsnZggaWQg7ZWE65Oc6rCAIG51bGzsnbTrqbQg6rCd7LK0IOyghOyytOulvCBudWxs66GcXG4gICAgICBjb25zdCBuZXN0ZWRLZXlzID0gT2JqZWN0LmtleXMocm93KS5maWx0ZXIoKGtleSkgPT4ga2V5LmluY2x1ZGVzKFwiX19cIikpO1xuICAgICAgY29uc3QgZ3JvdXBzID0gT2JqZWN0Lmdyb3VwQnkobmVzdGVkS2V5cywgKGtleSkgPT4ga2V5LnNwbGl0KFwiX19cIilbMF0pO1xuXG4gICAgICAvLyBpZCDtlYTrk5zqsIAgbnVsbOyduCDqt7jro7kg7LC+6riwICjsmIg6IHBhcmVudF9faWTqsIAgbnVsbOydtOuptCBwYXJlbnQg6re466O5IOyghOyytOqwgCBudWxsKVxuICAgICAgY29uc3QgbnVsbEtleXMgPSBPYmplY3QuZW50cmllcyhncm91cHMpXG4gICAgICAgIC5maWx0ZXIoKFtncm91cEtleSwgZmllbGRzXSkgPT4ge1xuICAgICAgICAgIGlmICghZmllbGRzIHx8IGZpZWxkcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgIC8vIOq3uOujueydmCBpZCDtlYTrk5wg7LC+6riwICjsmIg6IFwicGFyZW50X19pZFwiKVxuICAgICAgICAgIGNvbnN0IGlkRmllbGQgPSBgJHtncm91cEtleX1fX2lkYDtcbiAgICAgICAgICBpZiAoaWRGaWVsZCBpbiByb3cpIHtcbiAgICAgICAgICAgIC8vIGlkIO2VhOuTnOqwgCBudWxs7J2066m0IOqwneyytCDsoITssrTqsIAgbnVsbFxuICAgICAgICAgICAgcmV0dXJuIHJvd1tpZEZpZWxkXSA9PT0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZCDtlYTrk5zqsIAg7JeG7Jy866m0IOq4sOyhtCDroZzsp4E6IOuqqOuToCDtlYTrk5zqsIAgbnVsbOyduOyngCDtmZXsnbhcbiAgICAgICAgICByZXR1cm4gZmllbGRzLmV2ZXJ5KFxuICAgICAgICAgICAgKGZpZWxkKSA9PlxuICAgICAgICAgICAgICByb3dbZmllbGRdID09PSBudWxsIHx8IChBcnJheS5pc0FycmF5KHJvd1tmaWVsZF0pICYmIHJvd1tmaWVsZF0ubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcblxuICAgICAgY29uc3QgaHlkcmF0ZWQgPSBPYmplY3Qua2V5cyhyb3cpLnJlZHVjZSgociwgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKCFmaWVsZC5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgICAgLy8g7J2867CYIO2VhOuTnDog67Cw7Je0IOuCtCDqsJ3ssrTrqbQg7J6s6reAIGh5ZHJhdGVcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKSkge1xuICAgICAgICAgICAgcltmaWVsZF0gPSB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJbZmllbGRdID0gcm93W2ZpZWxkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDspJHssqkg7ZWE65OcIOyymOumrDogdXNlcl9fbmFtZSDihpIgdXNlcltuYW1lXVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGZpZWxkLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGNvbnN0IG9ialBhdGggPVxuICAgICAgICAgIHBhcnRzWzBdICtcbiAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBgWyR7cGFydH1dYClcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuXG4gICAgICAgIHIgPSBzZXQoXG4gICAgICAgICAgcixcbiAgICAgICAgICBvYmpQYXRoLFxuICAgICAgICAgIHJvd1tmaWVsZF0gJiYgQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKVxuICAgICAgICAgICAgPyB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSlcbiAgICAgICAgICAgIDogcm93W2ZpZWxkXSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sIHt9IGFzIFVua25vd25EQlJlY29yZCk7XG5cbiAgICAgIC8vIG51bGwgcmVsYXRpb24g7LKY66asXG4gICAgICBudWxsS2V5cy5mb3JFYWNoKChudWxsS2V5KSA9PiB7XG4gICAgICAgIGh5ZHJhdGVkW251bGxLZXldID0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaHlkcmF0ZWQ7XG4gICAgfSkgYXMgVFtdO1xuICB9XG59XG5cbi8qKlxuICogRW5oYW5jZXIg7YyM652866+47YSwIOyhsOqxtOu2gCDtg4DsnoVcbiAqIFJlcXVpcmVkRW5oYW5jZXJLZXlz6rCAIOyXhuycvOuptCBlbmhhbmNlcnMg7ISg7YOd7KCBLCDsnojsnLzrqbQg7ZWE7IiYXG4gKi9cbnR5cGUgRW5oYW5jZXJQYXJhbTxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0UXVlcmllcyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBQdXJpU3Vic2V0Rm4+LFxuPiA9IFtSZXF1aXJlZEVuaGFuY2VyS2V5czxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz5dIGV4dGVuZHMgW25ldmVyXVxuICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmcsIFRTdWJzZXRRdWVyaWVzPiB9XG4gIDogeyBlbmhhbmNlcnM6IEVuaGFuY2VyTWFwPFRTdWJzZXRLZXksIFRDb21wdXRlZFJlc3VsdHMsIFRTdWJzZXRNYXBwaW5nLCBUU3Vic2V0UXVlcmllcz4gfTtcblxudHlwZSBSZXF1aXJlZEVuaGFuY2VyS2V5czxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuPiA9IHtcbiAgW0sgaW4gVFN1YnNldEtleV06IFRDb21wdXRlZFJlc3VsdHNbS10gZXh0ZW5kcyBUU3Vic2V0TWFwcGluZ1tLXSA/IG5ldmVyIDogSztcbn1bVFN1YnNldEtleV07XG5cbmV4cG9ydCBjb25zdCBCYXNlTW9kZWwgPSBuZXcgQmFzZU1vZGVsQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJnZXRMb2dnZXIiLCJjbG9uZURlZXAiLCJncm91cCIsImlzT2JqZWN0Iiwib21pdCIsInNldCIsIlNvbmFtdSIsIkVudGl0eU1hbmFnZXIiLCJjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSIsImdldEpvaW5UYWJsZXMiLCJnZXRUYWJsZU5hbWVzRnJvbVdoZXJlIiwiY2h1bmsiLCJEQiIsIlB1cmkiLCJQdXJpV3JhcHBlciIsIlVwc2VydEJ1aWxkZXIiLCJCYXNlTW9kZWxDbGFzcyIsImxvZ2dlciIsIm1vZGVsTmFtZSIsIm5hbWUiLCJzdWJzZXRRdWVyaWVzIiwibG9hZGVyUXVlcmllcyIsImdldERCIiwid2hpY2giLCJnZXRQdXJpIiwidHJ4IiwiZ2V0VHJhbnNhY3Rpb25Db250ZXh0IiwiZ2V0VHJhbnNhY3Rpb24iLCJkYiIsImRlc3Ryb3kiLCJnZXRJbnNlcnRlZElkcyIsIndkYiIsInJvd3MiLCJ0YWJsZU5hbWUiLCJ1bnFLZXlGaWVsZHMiLCJjaHVua1NpemUiLCJ1bnFLZXlzIiwid2hlcmVJbkZpZWxkIiwic2VsZWN0RmllbGQiLCJsZW5ndGgiLCJyYXciLCJqb2luIiwibWFwIiwicm93IiwiZmllbGQiLCJyZXN1bHRJZHMiLCJpdGVtcyIsImRiUm93cyIsInNlbGVjdCIsIndoZXJlSW4iLCJjb25jYXQiLCJkYlJvdyIsInBhcnNlSW50IiwiU3RyaW5nIiwiaWQiLCJnZXRTdWJzZXRRdWVyaWVzIiwic3Vic2V0IiwiRXJyb3IiLCJwdXJpV3JhcHBlciIsInFiIiwib25TdWJzZXQiLCJfc3Vic2V0IiwiY3JlYXRlRW5oYW5jZXJzIiwiZW5oYW5jZXJzIiwiZXhlY3V0ZVN1YnNldFF1ZXJ5IiwicGFyYW1zIiwicXVlcnlQYXJhbXMiLCJkZWJ1ZyIsIm9wdGltaXplQ291bnRRdWVyeSIsIm51bSIsInBhZ2UiLCJ0b3RhbCIsImV4ZWN1dGVDb3VudFF1ZXJ5IiwicXVlcnlNb2RlIiwiY29tcHV0ZWRSb3dzIiwiZXhlY3V0ZUxpc3RRdWVyeSIsImVuaGFuY2VyIiwiZW5oYW5jZWRSb3dzIiwiUHJvbWlzZSIsImFsbCIsImVudGl0eSIsImdldCIsImludGVybmFsRmllbGRzIiwic3Vic2V0c0ludGVybmFsIiwib21pdEludGVybmFsRmllbGRzIiwiZmllbGRzIiwicmVzdWx0IiwiZGVsZXRlRmllbGQiLCJzcGxpdCIsIm9iaiIsInBhcnRzIiwiQXJyYXkiLCJpc0FycmF5IiwiZm9yRWFjaCIsIml0ZW0iLCJmaXJzdCIsInJlc3QiLCJuZXh0IiwiY291bnRQdXJpIiwiY2xvbmUiLCJjbGVhciIsImRlZmF1bHQiLCJTcWxQYXJzZXIiLCJwYXJzZXIiLCJQYXJzZXIiLCJwYXJzZWRRdWVyeSIsImFzdGlmeSIsInRvUXVlcnkiLCJkYXRhYmFzZSIsImNvbmZpZyIsImxlZnRKb2luVGFibGVzIiwid2hlcmVUYWJsZXMiLCJ0YWJsZXNUb1JlbW92ZSIsImZpbHRlciIsImoiLCJpbmNsdWRlcyIsInRhYmxlIiwiY2xlYXJKb2luIiwiY291bnRSZXN1bHQiLCJyYXdOdW1iZXIiLCJsaW1pdGVkUWIiLCJsaW1pdCIsIm9mZnNldCIsInVubG9hZGVkUm93cyIsImxvYWRlcnMiLCJwcm9jZXNzTG9hZGVycyIsImh5ZHJhdGUiLCJyZXNvbHZlTG9hZGVyIiwiYXMiLCJyZWZJZCIsInJlc29sdmVMb2FkZXJRYkZuIiwibmVzdGVkTG9hZGVycyIsInJlc29sdmVMb2FkZXJRYiIsImxvYWRlZFJvd3MiLCJzdWJSb3dHcm91cHMiLCJyIiwibmVzdGVkS2V5cyIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJncm91cHMiLCJncm91cEJ5IiwibnVsbEtleXMiLCJlbnRyaWVzIiwiZ3JvdXBLZXkiLCJpZEZpZWxkIiwiZXZlcnkiLCJoeWRyYXRlZCIsInJlZHVjZSIsIm9ialBhdGgiLCJzbGljZSIsInBhcnQiLCJudWxsS2V5IiwiQmFzZU1vZGVsIl0sIm1hcHBpbmdzIjoiQUFBQSxrR0FBa0csR0FDbEcsU0FBU0EsU0FBUyxRQUFxQixtQkFBbUI7QUFFMUQsU0FBU0MsU0FBUyxFQUFFQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsSUFBSSxFQUFFQyxHQUFHLFFBQVEsVUFBVTtBQUVoRSxTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFDaEMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUFTQyx1QkFBdUIsUUFBUSx3QkFBcUI7QUFFN0QsU0FBU0MsYUFBYSxFQUFFQyxzQkFBc0IsUUFBUSx5QkFBc0I7QUFDNUUsU0FBU0MsS0FBSyxRQUFRLG9CQUFpQjtBQUd2QyxTQUFTQyxFQUFFLFFBQVEsVUFBTztBQUMxQixTQUFTQyxJQUFJLFFBQVEsWUFBUztBQUc5QixTQUFTQyxXQUFXLFFBQVEsb0JBQWlCO0FBQzdDLFNBQVNDLGFBQWEsUUFBUSxzQkFBbUI7QUFJakQ7Ozs7Ozs7Q0FPQyxHQUNELE9BQU8sTUFBTUM7Ozs7SUFNUUMsT0FBZTtJQUVsQyxZQUNFLEFBQWdCQyxZQUFvQixJQUFJLENBQUMsV0FBVyxDQUFDQyxJQUFJLEVBQ3pELEFBQVVDLGFBQThCLEVBQ3hDLEFBQVVDLGFBQThCLENBQ3hDO2FBSGdCSCxZQUFBQTthQUNORSxnQkFBQUE7YUFDQUMsZ0JBQUFBO1FBRVYsSUFBSSxDQUFDSixNQUFNLEdBQUdqQixVQUFVUSx3QkFBd0IsSUFBSSxDQUFDVSxTQUFTLEVBQUU7SUFDbEU7SUFFQUksTUFBTUMsS0FBZSxFQUFRO1FBQzNCLE9BQU9YLEdBQUdVLEtBQUssQ0FBQ0M7SUFDbEI7SUFFQUMsUUFBUUQsS0FBZSxFQUFlO1FBQ3BDLHNCQUFzQjtRQUN0QixNQUFNRSxNQUFNYixHQUFHYyxxQkFBcUIsR0FB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
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { MigrationColumn, MigrationIndex } from "../types/types";
|
|
2
|
-
|
|
2
|
+
declare class CodeGeneratorClass {
|
|
3
3
|
getAlterColumnsTo(entityColumns: MigrationColumn[], dbColumns: MigrationColumn[]): {
|
|
4
4
|
add: MigrationColumn[];
|
|
5
5
|
drop: MigrationColumn[];
|
|
@@ -10,4 +10,6 @@ export declare class CodeGenerator {
|
|
|
10
10
|
drop: MigrationIndex[];
|
|
11
11
|
};
|
|
12
12
|
}
|
|
13
|
+
export declare const CodeGenerator: CodeGeneratorClass;
|
|
14
|
+
export {};
|
|
13
15
|
//# sourceMappingURL=code-generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/database/code-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGtE,
|
|
1
|
+
{"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/database/code-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGtE,cAAM,kBAAkB;IACtB,iBAAiB,CAAC,aAAa,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE;aAEjE,eAAe,EAAE;cAChB,eAAe,EAAE;eAChB,eAAe,EAAE;;IAuBlC,iBAAiB,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;aAG/D,cAAc,EAAE;cACf,cAAc,EAAE;;CAmBjC;AAED,eAAO,MAAM,aAAa,oBAA2B,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import equal from "fast-deep-equal";
|
|
2
2
|
import { diff } from "radashi";
|
|
3
3
|
import { differenceWith, intersectionBy } from "../utils/utils.js";
|
|
4
|
-
|
|
4
|
+
class CodeGeneratorClass {
|
|
5
5
|
getAlterColumnsTo(entityColumns, dbColumns) {
|
|
6
6
|
const columnsTo = {
|
|
7
7
|
add: [],
|
|
@@ -50,5 +50,6 @@ export class CodeGenerator {
|
|
|
50
50
|
return indexesTo;
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
+
export const CodeGenerator = new CodeGeneratorClass();
|
|
53
54
|
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9jb2RlLWdlbmVyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbFwiO1xuaW1wb3J0IHsgZGlmZiB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IE1pZ3JhdGlvbkNvbHVtbiwgTWlncmF0aW9uSW5kZXggfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoLCBpbnRlcnNlY3Rpb25CeSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5jbGFzcyBDb2RlR2VuZXJhdG9yQ2xhc3Mge1xuICBnZXRBbHRlckNvbHVtbnNUbyhlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSwgZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSkge1xuICAgIGNvbnN0IGNvbHVtbnNUbyA9IHtcbiAgICAgIGFkZDogW10gYXMgTWlncmF0aW9uQ29sdW1uW10sXG4gICAgICBkcm9wOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICAgIGFsdGVyOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICB9O1xuXG4gICAgLy8g7Lus65+866qFIOq4sOykgCDruYTqtZBcbiAgICBjb25zdCBleHRyYUNvbHVtbnMgPSB7XG4gICAgICBkYjogZGlmZihkYkNvbHVtbnMsIGVudGl0eUNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKSxcbiAgICAgIGVudGl0eTogZGlmZihlbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKSxcbiAgICB9O1xuICAgIGlmIChleHRyYUNvbHVtbnMuZW50aXR5Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbHVtbnNUby5hZGQgPSBjb2x1bW5zVG8uYWRkLmNvbmNhdChleHRyYUNvbHVtbnMuZW50aXR5KTtcbiAgICB9XG4gICAgaWYgKGV4dHJhQ29sdW1ucy5kYi5sZW5ndGggPiAwKSB7XG4gICAgICBjb2x1bW5zVG8uZHJvcCA9IGNvbHVtbnNUby5kcm9wLmNvbmNhdChleHRyYUNvbHVtbnMuZGIpO1xuICAgIH1cblxuICAgIC8vIOuPmeydvCDsu6zrn7zrqoXsnZgg7IS467aAIO2VhOuTnCDruYTqtZBcbiAgICBjb25zdCBzYW1lRGJDb2x1bW5zID0gaW50ZXJzZWN0aW9uQnkoZGJDb2x1bW5zLCBlbnRpdHlDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG4gICAgY29uc3Qgc2FtZU1kQ29sdW1ucyA9IGludGVyc2VjdGlvbkJ5KGVudGl0eUNvbHVtbnMsIGRiQ29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpO1xuICAgIGNvbHVtbnNUby5hbHRlciA9IGRpZmZlcmVuY2VXaXRoKHNhbWVEYkNvbHVtbnMsIHNhbWVNZENvbHVtbnMsIChhLCBiKSA9PiBlcXVhbChhLCBiKSk7XG5cbiAgICByZXR1cm4gY29sdW1uc1RvO1xuICB9XG5cbiAgZ2V0QWx0ZXJJbmRleGVzVG8oZW50aXR5SW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSwgZGJJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdKSB7XG4gICAgLy8g7J24642x7IqkIOu5hOq1kFxuICAgIGNvbnN0IGluZGV4ZXNUbyA9IHtcbiAgICAgIGFkZDogW10gYXMgTWlncmF0aW9uSW5kZXhbXSxcbiAgICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkluZGV4W10sXG4gICAgfTtcbiAgICBjb25zdCBleHRyYUluZGV4ZXMgPSB7XG4gICAgICBkYjogZGlmZihkYkluZGV4ZXMsIGVudGl0eUluZGV4ZXMsIChjb2wpID0+XG4gICAgICAgIFtjb2wudHlwZSwgY29sLmNvbHVtbnMubWFwKChjKSA9PiBjLm5hbWUpLmpvaW4oXCItXCIpXS5qb2luKFwiLy9cIiksXG4gICAgICApLFxuICAgICAgZW50aXR5OiBkaWZmKGVudGl0eUluZGV4ZXMsIGRiSW5kZXhlcywgKGNvbCkgPT5cbiAgICAgICAgW2NvbC50eXBlLCBjb2wuY29sdW1ucy5tYXAoKGMpID0+IGMubmFtZSkuam9pbihcIi1cIildLmpvaW4oXCIvL1wiKSxcbiAgICAgICksXG4gICAgfTtcbiAgICBpZiAoZXh0cmFJbmRleGVzLmVudGl0eS5sZW5ndGggPiAwKSB7XG4gICAgICBpbmRleGVzVG8uYWRkID0gaW5kZXhlc1RvLmFkZC5jb25jYXQoZXh0cmFJbmRleGVzLmVudGl0eSk7XG4gICAgfVxuICAgIGlmIChleHRyYUluZGV4ZXMuZGIubGVuZ3RoID4gMCkge1xuICAgICAgaW5kZXhlc1RvLmRyb3AgPSBpbmRleGVzVG8uZHJvcC5jb25jYXQoZXh0cmFJbmRleGVzLmRiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXhlc1RvO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBDb2RlR2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3JDbGFzcygpO1xuIl0sIm5hbWVzIjpbImVxdWFsIiwiZGlmZiIsImRpZmZlcmVuY2VXaXRoIiwiaW50ZXJzZWN0aW9uQnkiLCJDb2RlR2VuZXJhdG9yQ2xhc3MiLCJnZXRBbHRlckNvbHVtbnNUbyIsImVudGl0eUNvbHVtbnMiLCJkYkNvbHVtbnMiLCJjb2x1bW5zVG8iLCJhZGQiLCJkcm9wIiwiYWx0ZXIiLCJleHRyYUNvbHVtbnMiLCJkYiIsImNvbCIsIm5hbWUiLCJlbnRpdHkiLCJsZW5ndGgiLCJjb25jYXQiLCJzYW1lRGJDb2x1bW5zIiwic2FtZU1kQ29sdW1ucyIsImEiLCJiIiwiZ2V0QWx0ZXJJbmRleGVzVG8iLCJlbnRpdHlJbmRleGVzIiwiZGJJbmRleGVzIiwiaW5kZXhlc1RvIiwiZXh0cmFJbmRleGVzIiwidHlwZSIsImNvbHVtbnMiLCJtYXAiLCJjIiwiam9pbiIsIkNvZGVHZW5lcmF0b3IiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVcsa0JBQWtCO0FBQ3BDLFNBQVNDLElBQUksUUFBUSxVQUFVO0FBRS9CLFNBQVNDLGNBQWMsRUFBRUMsY0FBYyxRQUFRLG9CQUFpQjtBQUVoRSxNQUFNQztJQUNKQyxrQkFBa0JDLGFBQWdDLEVBQUVDLFNBQTRCLEVBQUU7UUFDaEYsTUFBTUMsWUFBWTtZQUNoQkMsS0FBSyxFQUFFO1lBQ1BDLE1BQU0sRUFBRTtZQUNSQyxPQUFPLEVBQUU7UUFDWDtRQUVBLFlBQVk7UUFDWixNQUFNQyxlQUFlO1lBQ25CQyxJQUFJWixLQUFLTSxXQUFXRCxlQUFlLENBQUNRLE1BQVFBLElBQUlDLElBQUk7WUFDcERDLFFBQVFmLEtBQUtLLGVBQWVDLFdBQVcsQ0FBQ08sTUFBUUEsSUFBSUMsSUFBSTtRQUMxRDtRQUNBLElBQUlILGFBQWFJLE1BQU0sQ0FBQ0MsTUFBTSxHQUFHLEdBQUc7WUFDbENULFVBQVVDLEdBQUcsR0FBR0QsVUFBVUMsR0FBRyxDQUFDUyxNQUFNLENBQUNOLGFBQWFJLE1BQU07UUFDMUQ7UUFDQSxJQUFJSixhQUFhQyxFQUFFLENBQUNJLE1BQU0sR0FBRyxHQUFHO1lBQzlCVCxVQUFVRSxJQUFJLEdBQUdGLFVBQVVFLElBQUksQ0FBQ1EsTUFBTSxDQUFDTixhQUFhQyxFQUFFO1FBQ3hEO1FBRUEsbUJBQW1CO1FBQ25CLE1BQU1NLGdCQUFnQmhCLGVBQWVJLFdBQVdELGVBQWUsQ0FBQ1EsTUFBUUEsSUFBSUMsSUFBSTtRQUNoRixNQUFNSyxnQkFBZ0JqQixlQUFlRyxlQUFlQyxXQUFXLENBQUNPLE1BQVFBLElBQUlDLElBQUk7UUFDaEZQLFVBQVVHLEtBQUssR0FBR1QsZUFBZWlCLGVBQWVDLGVBQWUsQ0FBQ0MsR0FBR0MsSUFBTXRCLE1BQU1xQixHQUFHQztRQUVsRixPQUFPZDtJQUNUO0lBRUFlLGtCQUFrQkMsYUFBK0IsRUFBRUMsU0FBMkIsRUFBRTtRQUM5RSxTQUFTO1FBQ1QsTUFBTUMsWUFBWTtZQUNoQmpCLEtBQUssRUFBRTtZQUNQQyxNQUFNLEVBQUU7UUFDVjtRQUNBLE1BQU1pQixlQUFlO1lBQ25CZCxJQUFJWixLQUFLd0IsV0FBV0QsZUFBZSxDQUFDVixNQUNsQztvQkFBQ0EsSUFBSWMsSUFBSTtvQkFBRWQsSUFBSWUsT0FBTyxDQUFDQyxHQUFHLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRWhCLElBQUksRUFBRWlCLElBQUksQ0FBQztpQkFBSyxDQUFDQSxJQUFJLENBQUM7WUFFNURoQixRQUFRZixLQUFLdUIsZUFBZUMsV0FBVyxDQUFDWCxNQUN0QztvQkFBQ0EsSUFBSWMsSUFBSTtvQkFBRWQsSUFBSWUsT0FBTyxDQUFDQyxHQUFHLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRWhCLElBQUksRUFBRWlCLElBQUksQ0FBQztpQkFBSyxDQUFDQSxJQUFJLENBQUM7UUFFOUQ7UUFDQSxJQUFJTCxhQUFhWCxNQUFNLENBQUNDLE1BQU0sR0FBRyxHQUFHO1lBQ2xDUyxVQUFVakIsR0FBRyxHQUFHaUIsVUFBVWpCLEdBQUcsQ0FBQ1MsTUFBTSxDQUFDUyxhQUFhWCxNQUFNO1FBQzFEO1FBQ0EsSUFBSVcsYUFBYWQsRUFBRSxDQUFDSSxNQUFNLEdBQUcsR0FBRztZQUM5QlMsVUFBVWhCLElBQUksR0FBR2dCLFVBQVVoQixJQUFJLENBQUNRLE1BQU0sQ0FBQ1MsYUFBYWQsRUFBRTtRQUN4RDtRQUVBLE9BQU9hO0lBQ1Q7QUFDRjtBQUVBLE9BQU8sTUFBTU8sZ0JBQWdCLElBQUk3QixxQkFBcUIifQ==
|
package/dist/database/db.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "async_hooks";
|
|
2
|
-
import {
|
|
2
|
+
import type { Knex } from "knex";
|
|
3
3
|
import type { SonamuConfig } from "../api/config";
|
|
4
4
|
import { TransactionContext } from "./transaction-context";
|
|
5
5
|
export type DBPreset = "w" | "r";
|