@sochdb/sochdb 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +356 -14
- package/_bin/aarch64-apple-darwin/libsochdb_storage.dylib +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-bulk +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-grpc-server +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-server +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb-bulk.exe +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb-grpc-server.exe +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb_storage.dll +0 -0
- package/_bin/x86_64-unknown-linux-gnu/libsochdb_storage.so +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-bulk +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-grpc-server +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-server +0 -0
- package/dist/cjs/embedded/database.js +98 -4
- package/dist/cjs/embedded/ffi/bindings.js +46 -8
- package/dist/cjs/index.js +28 -6
- package/dist/cjs/mcp/client.js +115 -0
- package/dist/cjs/mcp/index.js +28 -0
- package/dist/cjs/mcp/server.js +242 -0
- package/dist/cjs/mcp/types.js +32 -0
- package/dist/cjs/namespace.js +147 -19
- package/dist/cjs/policy/index.js +26 -0
- package/dist/cjs/policy/service.js +394 -0
- package/dist/cjs/policy/types.js +8 -0
- package/dist/esm/embedded/database.js +98 -4
- package/dist/esm/embedded/ffi/bindings.js +48 -8
- package/dist/esm/index.js +28 -6
- package/dist/esm/mcp/client.js +116 -0
- package/dist/esm/mcp/index.js +28 -0
- package/dist/esm/mcp/server.js +244 -0
- package/dist/esm/mcp/types.js +34 -0
- package/dist/esm/namespace.js +150 -19
- package/dist/esm/policy/index.js +26 -0
- package/dist/esm/policy/service.js +396 -0
- package/dist/esm/policy/types.js +8 -0
- package/dist/types/embedded/database.d.ts +66 -1
- package/dist/types/embedded/database.d.ts.map +1 -1
- package/dist/types/embedded/ffi/bindings.d.ts +7 -0
- package/dist/types/embedded/ffi/bindings.d.ts.map +1 -1
- package/dist/types/index.d.ts +23 -5
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/mcp/client.d.ts +69 -0
- package/dist/types/mcp/client.d.ts.map +1 -0
- package/dist/types/mcp/index.d.ts +9 -0
- package/dist/types/mcp/index.d.ts.map +1 -0
- package/dist/types/mcp/server.d.ts +87 -0
- package/dist/types/mcp/server.d.ts.map +1 -0
- package/dist/types/mcp/types.d.ts +124 -0
- package/dist/types/mcp/types.d.ts.map +1 -0
- package/dist/types/namespace.d.ts +13 -0
- package/dist/types/namespace.d.ts.map +1 -1
- package/dist/types/policy/index.d.ts +8 -0
- package/dist/types/policy/index.d.ts.map +1 -0
- package/dist/types/policy/service.d.ts +115 -0
- package/dist/types/policy/service.d.ts.map +1 -0
- package/dist/types/policy/types.d.ts +102 -0
- package/dist/types/policy/types.d.ts.map +1 -0
- package/package.json +2 -2
|
@@ -28,13 +28,19 @@ class EmbeddedDatabase {
|
|
|
28
28
|
bindings;
|
|
29
29
|
closed = false;
|
|
30
30
|
path;
|
|
31
|
-
|
|
31
|
+
concurrent = false;
|
|
32
|
+
_concurrentModeFallback = false;
|
|
33
|
+
constructor(path, handle, concurrent = false, fallback = false) {
|
|
32
34
|
this.path = path;
|
|
33
35
|
this.handle = handle;
|
|
36
|
+
this.concurrent = concurrent;
|
|
37
|
+
this._concurrentModeFallback = fallback;
|
|
34
38
|
this.bindings = bindings_1.NativeBindings.getInstance();
|
|
35
39
|
}
|
|
36
40
|
/**
|
|
37
|
-
* Open a database at the specified path
|
|
41
|
+
* Open a database at the specified path in standard mode
|
|
42
|
+
*
|
|
43
|
+
* For web applications with multiple processes, use `openConcurrent()` instead.
|
|
38
44
|
*
|
|
39
45
|
* @param path - Path to database directory
|
|
40
46
|
* @param config - Optional configuration
|
|
@@ -63,7 +69,95 @@ class EmbeddedDatabase {
|
|
|
63
69
|
if (!handle) {
|
|
64
70
|
throw new errors_1.DatabaseError(`Failed to open database at ${path}`);
|
|
65
71
|
}
|
|
66
|
-
return new EmbeddedDatabase(path, handle);
|
|
72
|
+
return new EmbeddedDatabase(path, handle, false);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Open a database in concurrent mode for multi-process web applications
|
|
76
|
+
*
|
|
77
|
+
* This mode allows multiple Node.js processes (e.g., PM2 cluster workers,
|
|
78
|
+
* multiple Express instances) to access the database simultaneously.
|
|
79
|
+
*
|
|
80
|
+
* Features:
|
|
81
|
+
* - Lock-free reads with ~100ns latency
|
|
82
|
+
* - Multi-reader, single-writer coordination
|
|
83
|
+
* - Automatic write serialization
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* import { EmbeddedDatabase } from '@sochdb/sochdb';
|
|
88
|
+
* import express from 'express';
|
|
89
|
+
*
|
|
90
|
+
* // Open in concurrent mode - multiple workers can access
|
|
91
|
+
* const db = EmbeddedDatabase.openConcurrent('./web_db');
|
|
92
|
+
*
|
|
93
|
+
* const app = express();
|
|
94
|
+
*
|
|
95
|
+
* app.get('/user/:id', async (req, res) => {
|
|
96
|
+
* // Multiple concurrent requests can read simultaneously
|
|
97
|
+
* const data = await db.get(Buffer.from(`user:${req.params.id}`));
|
|
98
|
+
* if (!data) {
|
|
99
|
+
* res.status(404).json({ error: 'not found' });
|
|
100
|
+
* return;
|
|
101
|
+
* }
|
|
102
|
+
* res.send(data);
|
|
103
|
+
* });
|
|
104
|
+
*
|
|
105
|
+
* app.post('/user/:id', async (req, res) => {
|
|
106
|
+
* // Writes are serialized automatically
|
|
107
|
+
* await db.put(Buffer.from(`user:${req.params.id}`), req.body);
|
|
108
|
+
* res.json({ status: 'ok' });
|
|
109
|
+
* });
|
|
110
|
+
*
|
|
111
|
+
* // Start with PM2 cluster mode:
|
|
112
|
+
* // pm2 start app.js -i max
|
|
113
|
+
* app.listen(3000);
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
116
|
+
* @param path - Path to database directory
|
|
117
|
+
* @param options - Optional configuration for concurrent mode
|
|
118
|
+
* @returns EmbeddedDatabase instance in concurrent mode
|
|
119
|
+
*/
|
|
120
|
+
static openConcurrent(path, options) {
|
|
121
|
+
const bindings = bindings_1.NativeBindings.getInstance();
|
|
122
|
+
const fallbackToStandard = options?.fallbackToStandard ?? false;
|
|
123
|
+
if (!bindings.isConcurrentModeAvailable()) {
|
|
124
|
+
if (fallbackToStandard) {
|
|
125
|
+
console.warn('[SochDB] Concurrent mode not available in native library (requires v0.4.8+). ' +
|
|
126
|
+
'Falling back to standard mode. For production multi-process deployments, ' +
|
|
127
|
+
'please upgrade the SochDB native library.');
|
|
128
|
+
const handle = bindings.sochdb_open(path);
|
|
129
|
+
if (!handle) {
|
|
130
|
+
throw new errors_1.DatabaseError(`Failed to open database at ${path}`);
|
|
131
|
+
}
|
|
132
|
+
return new EmbeddedDatabase(path, handle, false, true);
|
|
133
|
+
}
|
|
134
|
+
throw new errors_1.DatabaseError('Concurrent mode not supported. Please upgrade the SochDB native library to v0.4.8+ ' +
|
|
135
|
+
'or use openConcurrent(path, { fallbackToStandard: true }) to fall back to standard mode.');
|
|
136
|
+
}
|
|
137
|
+
const handle = bindings.sochdb_open_concurrent(path);
|
|
138
|
+
if (!handle) {
|
|
139
|
+
throw new errors_1.DatabaseError(`Failed to open database in concurrent mode at ${path}`);
|
|
140
|
+
}
|
|
141
|
+
const isConcurrent = bindings.sochdb_is_concurrent?.(handle) === 1;
|
|
142
|
+
return new EmbeddedDatabase(path, handle, isConcurrent, false);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Check if database is opened in concurrent mode
|
|
146
|
+
*/
|
|
147
|
+
get isConcurrent() {
|
|
148
|
+
return this.concurrent;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check if concurrent mode fell back to standard mode
|
|
152
|
+
*/
|
|
153
|
+
get isConcurrentFallback() {
|
|
154
|
+
return this._concurrentModeFallback;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Check if concurrent mode is available in the native library
|
|
158
|
+
*/
|
|
159
|
+
static isConcurrentModeAvailable() {
|
|
160
|
+
return bindings_1.NativeBindings.getInstance().isConcurrentModeAvailable();
|
|
67
161
|
}
|
|
68
162
|
/**
|
|
69
163
|
* Put a key-value pair (auto-transaction)
|
|
@@ -236,4 +330,4 @@ class EmbeddedDatabase {
|
|
|
236
330
|
}
|
|
237
331
|
}
|
|
238
332
|
exports.EmbeddedDatabase = EmbeddedDatabase;
|
|
239
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQVdwRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLGdCQUFnQjtJQUNqQixNQUFNLENBQU07SUFDWixRQUFRLENBQWlCO0lBQ3pCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixJQUFJLENBQVM7SUFFckIsWUFBb0IsSUFBWSxFQUFFLE1BQVc7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQVksRUFBRSxNQUErQjtRQUNyRCxNQUFNLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlDLElBQUksTUFBTSxDQUFDO1FBRVgsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULE1BQU0sT0FBTyxHQUFHO2dCQUNaLFdBQVcsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEtBQUs7Z0JBQ3ZDLGVBQWUsRUFBRSxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVM7Z0JBQ2hELFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEYsYUFBYSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUztnQkFD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Q0FBQztZQUNwRCxZQUFZLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDMUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtZQUM3QyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1lBQ3BELGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7U0FDdkQsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDO0lBRU8sVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLHNCQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVM7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVc7UUFDUCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztDQUNKO0FBOU9ELDRDQThPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW1iZWRkZWQgRGF0YWJhc2UgLSBGRkkgTW9kZVxuICogXG4gKiBEaXJlY3QgRkZJIGFjY2VzcyB0byBTb2NoREIgbmF0aXZlIGxpYnJhcnkuXG4gKiBObyBzZXJ2ZXIgcmVxdWlyZWQgLSBzaW1pbGFyIHRvIFB5dGhvbiBTREsncyBEYXRhYmFzZSBjbGFzcy5cbiAqL1xuXG5pbXBvcnQgeyBEYXRhYmFzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IE5hdGl2ZUJpbmRpbmdzIH0gZnJvbSAnLi9mZmkvYmluZGluZ3MnO1xuaW1wb3J0IHsgRW1iZWRkZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0ICogYXMga29mZmkgZnJvbSAna29mZmknO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGVkRGF0YWJhc2VDb25maWcge1xuICAgIHdhbEVuYWJsZWQ/OiBib29sZWFuO1xuICAgIHN5bmNNb2RlPzogJ2Z1bGwnIHwgJ25vcm1hbCcgfCAnb2ZmJztcbiAgICBtZW10YWJsZVNpemVCeXRlcz86IG51bWJlcjtcbiAgICBncm91cENvbW1pdD86IGJvb2xlYW47XG4gICAgaW5kZXhQb2xpY3k/OiAnd3JpdGVfb3B0aW1pemVkJyB8ICdiYWxhbmNlZCcgfCAnc2Nhbl9vcHRpbWl6ZWQnIHwgJ2FwcGVuZF9vbmx5Jztcbn1cblxuLyoqXG4gKiBFbWJlZGRlZCBEYXRhYmFzZSB1c2luZyBkaXJlY3QgRkZJXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiBjb25zdCBkYiA9IGF3YWl0IEVtYmVkZGVkRGF0YWJhc2Uub3BlbignLi9teWRiJyk7XG4gKiBhd2FpdCBkYi5wdXQoQnVmZmVyLmZyb20oJ2tleScpLCBCdWZmZXIuZnJvbSgndmFsdWUnKSk7XG4gKiBjb25zdCB2YWx1ZSA9IGF3YWl0IGRiLmdldChCdWZmZXIuZnJvbSgna2V5JykpO1xuICogYXdhaXQgZGIuY2xvc2UoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRW1iZWRkZWREYXRhYmFzZSB7XG4gICAgcHJpdmF0ZSBoYW5kbGU6IGFueTtcbiAgICBwcml2YXRlIGJpbmRpbmdzOiBOYXRpdmVCaW5kaW5ncztcbiAgICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgcGF0aDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwYXRoOiBzdHJpbmcsIGhhbmRsZTogYW55KSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgZGF0YWJhc2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoXG4gICAgICogXG4gICAgICogQHBhcmFtIHBhdGggLSBQYXRoIHRvIGRhdGFiYXNlIGRpcmVjdG9yeVxuICAgICAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uXG4gICAgICogQHJldHVybnMgRW1iZWRkZWREYXRhYmFzZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBvcGVuKHBhdGg6IHN0cmluZywgY29uZmlnPzogRW1iZWRkZWREYXRhYmFzZUNvbmZpZyk6IEVtYmVkZGVkRGF0YWJhc2Uge1xuICAgICAgICBjb25zdCBiaW5kaW5ncyA9IE5hdGl2ZUJpbmRpbmdzLmdldEluc3RhbmNlKCk7XG4gICAgICAgIGxldCBoYW5kbGU7XG5cbiAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgICAgY29uc3QgY0NvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICB3YWxfZW5hYmxlZDogY29uZmlnLndhbEVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgd2FsX2VuYWJsZWRfc2V0OiBjb25maWcud2FsRW5hYmxlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN5bmNfbW9kZTogY29uZmlnLnN5bmNNb2RlID09PSAnZnVsbCcgPyAyIDogKGNvbmZpZy5zeW5jTW9kZSA9PT0gJ25vcm1hbCcgPyAxIDogMCksXG4gICAgICAgICAgICAgICAgc3luY19tb2RlX3NldDogY29uZmlnLnN5bmNNb2RlICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbWVtdGFibGVfc2l6ZV9ieXRlczogQmlnSW50KGNvbmZpZy5tZW10YWJsZVNpemVCeXRlcyA/PyAwKSxcbiAgICAgICAgICAgICAgICBncm91cF9jb21taXQ6IGNvbmZpZy5ncm91cENvbW1pdCA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgICBncm91cF9jb21taXRfc2V0OiBjb25maWcuZ3JvdXBDb21taXQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBkZWZhdWx0X2luZGV4X3BvbGljeTogMSwgLy8gRGVmYXVsdCB0byBCYWxhbmNlZFxuICAgICAgICAgICAgICAgIGRlZmF1bHRfaW5kZXhfcG9saWN5X3NldDogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3Blbl93aXRoX2NvbmZpZyhwYXRoLCBjQ29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhbmRsZSA9IGJpbmRpbmdzLnNvY2hkYl9vcGVuKHBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKGBGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZSBhdCAke3BhdGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkRGF0YWJhc2UocGF0aCwgaGFuZGxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdXQgYSBrZXktdmFsdWUgcGFpciAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBwdXQoa2V5OiBCdWZmZXIsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLnB1dChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSB2YWx1ZSBieSBrZXkgKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgZ2V0KGtleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdHhuLmdldChrZXkpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIGtleSAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGUoa2V5OiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1dCB2YWx1ZSBhdCBwYXRoIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIHB1dFBhdGgocGF0aDogc3RyaW5nLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5wdXRQYXRoKHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdmFsdWUgYXQgcGF0aCAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBnZXRQYXRoKHBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHR4bi5nZXRQYXRoKHBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjYW4ga2V5cyB3aXRoIHByZWZpeFxuICAgICAqL1xuICAgIGFzeW5jICpzY2FuUHJlZml4KHByZWZpeDogQnVmZmVyKTogQXN5bmNHZW5lcmF0b3I8W0J1ZmZlciwgQnVmZmVyXT4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGVudHJ5IG9mIHR4bi5zY2FuUHJlZml4KHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBlbnRyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCZWdpbiBhIHRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb24oKTogRW1iZWRkZWRUcmFuc2FjdGlvbiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4bkhhbmRsZSA9IHRoaXMuYmluZGluZ3Muc29jaGRiX2JlZ2luX3R4bih0aGlzLmhhbmRsZSk7XG4gICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWRUcmFuc2FjdGlvbih0aGlzLCB0aGlzLmhhbmRsZSwgdHhuSGFuZGxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIG9wZXJhdGlvbnMgd2l0aGluIGEgdHJhbnNhY3Rpb24gKHdpdGggYXV0by1jb21taXQvYWJvcnQpXG4gICAgICovXG4gICAgYXN5bmMgd2l0aFRyYW5zYWN0aW9uPFQ+KGZuOiAodHhuOiBFbWJlZGRlZFRyYW5zYWN0aW9uKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKHR4bik7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcmNlIGEgY2hlY2twb2ludFxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrcG9pbnQoKTogUHJvbWlzZTxiaWdpbnQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IGxzbiA9IHRoaXMuYmluZGluZ3Muc29jaGRiX2NoZWNrcG9pbnQodGhpcy5oYW5kbGUpO1xuICAgICAgICByZXR1cm4gQmlnSW50KGxzbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHN0b3JhZ2Ugc3RhdGlzdGljc1xuICAgICAqL1xuICAgIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8e1xuICAgICAgICBtZW10YWJsZVNpemVCeXRlczogYmlnaW50O1xuICAgICAgICB3YWxTaXplQnl0ZXM6IGJpZ2ludDtcbiAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgICAgIG1pbkFjdGl2ZVNuYXBzaG90OiBiaWdpbnQ7XG4gICAgICAgIGxhc3RDaGVja3BvaW50THNuOiBiaWdpbnQ7XG4gICAgfT4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICAvLyBSZXR1cm5zIHN0cnVjdCBieSB2YWx1ZSAoYXV0b21hdGljYWxseSBkZWNvZGVkKVxuICAgICAgICBjb25zdCBzdGF0cyA9IHRoaXMuYmluZGluZ3Muc29jaGRiX3N0YXRzKHRoaXMuaGFuZGxlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBtZW10YWJsZVNpemVCeXRlczogQmlnSW50KHN0YXRzLm1lbXRhYmxlX3NpemVfYnl0ZXMpLFxuICAgICAgICAgICAgd2FsU2l6ZUJ5dGVzOiBCaWdJbnQoc3RhdHMud2FsX3NpemVfYnl0ZXMpLFxuICAgICAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBzdGF0cy5hY3RpdmVfdHJhbnNhY3Rpb25zLFxuICAgICAgICAgICAgbWluQWN0aXZlU25hcHNob3Q6IEJpZ0ludChzdGF0cy5taW5fYWN0aXZlX3NuYXBzaG90KSxcbiAgICAgICAgICAgIGxhc3RDaGVja3BvaW50THNuOiBCaWdJbnQoc3RhdHMubGFzdF9jaGVja3BvaW50X2xzbiksXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgZGF0YWJhc2VcbiAgICAgKi9cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5iaW5kaW5ncy5zb2NoZGJfY2xvc2UodGhpcy5oYW5kbGUpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbnN1cmVPcGVuKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKCdEYXRhYmFzZSBpcyBjbG9zZWQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBpbnRlcm5hbCBoYW5kbGUgKGZvciB0cmFuc2FjdGlvbnMpXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0SGFuZGxlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYmluZGluZ3MgaW5zdGFuY2UgKGZvciB0cmFuc2FjdGlvbnMpXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0QmluZGluZ3MoKTogTmF0aXZlQmluZGluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kaW5ncztcbiAgICB9XG59XG4iXX0=
|
|
333
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQVdwRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLGdCQUFnQjtJQUNqQixNQUFNLENBQU07SUFDWixRQUFRLENBQWlCO0lBQ3pCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixJQUFJLENBQVM7SUFDYixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUV4QyxZQUFvQixJQUFZLEVBQUUsTUFBVyxFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQUUsUUFBUSxHQUFHLEtBQUs7UUFDL0UsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFFBQVEsQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLHlCQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFZLEVBQUUsTUFBK0I7UUFDckQsTUFBTSxRQUFRLEdBQUcseUJBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QyxJQUFJLE1BQU0sQ0FBQztRQUVYLElBQUksTUFBTSxFQUFFLENBQUM7WUFDVCxNQUFNLE9BQU8sR0FBRztnQkFDWixXQUFXLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxLQUFLO2dCQUN2QyxlQUFlLEVBQUUsTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTO2dCQUNoRCxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xGLGFBQWEsRUFBRSxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVM7Z0JBQzVDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxZQUFZLEVBQUUsTUFBTSxDQUFDLFdBQVcsSUFBSSxLQUFLO2dCQUN6QyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsV0FBVyxLQUFLLFNBQVM7Z0JBQ2xELG9CQUFvQixFQUFFLENBQUMsRUFBRSxzQkFBc0I7Z0JBQy9DLHdCQUF3QixFQUFFLEtBQUs7YUFDbEMsQ0FBQztZQUNGLE1BQU0sR0FBRyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdELENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSxzQkFBYSxDQUFDLDhCQUE4QixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFFRCxPQUFPLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTZDRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBWSxFQUFFLE9BQTBDO1FBQzFFLE1BQU0sUUFBUSxHQUFHLHlCQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUMsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLEVBQUUsa0JBQWtCLElBQUksS0FBSyxDQUFDO1FBRWhFLElBQUksQ0FBQyxRQUFRLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxDQUFDLElBQUksQ0FDUiwrRUFBK0U7b0JBQy9FLDJFQUEyRTtvQkFDM0UsMkNBQTJDLENBQzlDLENBQUM7Z0JBQ0YsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNWLE1BQU0sSUFBSSxzQkFBYSxDQUFDLDhCQUE4QixJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDO2dCQUNELE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLHNCQUFhLENBQ25CLHFGQUFxRjtnQkFDckYsMEZBQTBGLENBQzdGLENBQUM7UUFDTixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSxzQkFBYSxDQUFDLGlEQUFpRCxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkUsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLG9CQUFvQjtRQUNwQixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMseUJBQXlCO1FBQzVCLE9BQU8seUJBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDaEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDRCxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFCLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVztRQUNqQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNiLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLE1BQU0sS0FBSyxDQUFDO1FBQ2hCLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQVc7UUFDcEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDRCxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEIsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUNyQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQztZQUNELE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0IsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFZO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFjO1FBQzVCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0QsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLEtBQUssQ0FBQztZQUNoQixDQUFDO1lBQ0QsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNQLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RCxPQUFPLElBQUksaUNBQW1CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBSSxFQUE0QztRQUNqRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0IsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVU7UUFDWixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFPUCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsa0RBQWtEO1FBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0RCxNQUFNLE1BQU0sR0FBRztZQUNYLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7WUFDcEQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1lBQzFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7WUFDN0MsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztZQUNwRCxpQkFBaUIsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1NBQ3ZELENBQUM7UUFFRixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDO0lBQ0wsQ0FBQztJQUVPLFVBQVU7UUFDZCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxzQkFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7Q0FDSjtBQXZWRCw0Q0F1VkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVtYmVkZGVkIERhdGFiYXNlIC0gRkZJIE1vZGVcbiAqIFxuICogRGlyZWN0IEZGSSBhY2Nlc3MgdG8gU29jaERCIG5hdGl2ZSBsaWJyYXJ5LlxuICogTm8gc2VydmVyIHJlcXVpcmVkIC0gc2ltaWxhciB0byBQeXRob24gU0RLJ3MgRGF0YWJhc2UgY2xhc3MuXG4gKi9cblxuaW1wb3J0IHsgRGF0YWJhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBOYXRpdmVCaW5kaW5ncyB9IGZyb20gJy4vZmZpL2JpbmRpbmdzJztcbmltcG9ydCB7IEVtYmVkZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCAqIGFzIGtvZmZpIGZyb20gJ2tvZmZpJztcblxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIHtcbiAgICB3YWxFbmFibGVkPzogYm9vbGVhbjtcbiAgICBzeW5jTW9kZT86ICdmdWxsJyB8ICdub3JtYWwnIHwgJ29mZic7XG4gICAgbWVtdGFibGVTaXplQnl0ZXM/OiBudW1iZXI7XG4gICAgZ3JvdXBDb21taXQ/OiBib29sZWFuO1xuICAgIGluZGV4UG9saWN5PzogJ3dyaXRlX29wdGltaXplZCcgfCAnYmFsYW5jZWQnIHwgJ3NjYW5fb3B0aW1pemVkJyB8ICdhcHBlbmRfb25seSc7XG59XG5cbi8qKlxuICogRW1iZWRkZWQgRGF0YWJhc2UgdXNpbmcgZGlyZWN0IEZGSVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogY29uc3QgZGIgPSBhd2FpdCBFbWJlZGRlZERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogY29uc3QgdmFsdWUgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oJ2tleScpKTtcbiAqIGF3YWl0IGRiLmNsb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGVkRGF0YWJhc2Uge1xuICAgIHByaXZhdGUgaGFuZGxlOiBhbnk7XG4gICAgcHJpdmF0ZSBiaW5kaW5nczogTmF0aXZlQmluZGluZ3M7XG4gICAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHBhdGg6IHN0cmluZztcbiAgICBwcml2YXRlIGNvbmN1cnJlbnQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jb25jdXJyZW50TW9kZUZhbGxiYWNrID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZywgaGFuZGxlOiBhbnksIGNvbmN1cnJlbnQgPSBmYWxzZSwgZmFsbGJhY2sgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLmhhbmRsZSA9IGhhbmRsZTtcbiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDtcbiAgICAgICAgdGhpcy5fY29uY3VycmVudE1vZGVGYWxsYmFjayA9IGZhbGxiYWNrO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgZGF0YWJhc2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGluIHN0YW5kYXJkIG1vZGVcbiAgICAgKiBcbiAgICAgKiBGb3Igd2ViIGFwcGxpY2F0aW9ucyB3aXRoIG11bHRpcGxlIHByb2Nlc3NlcywgdXNlIGBvcGVuQ29uY3VycmVudCgpYCBpbnN0ZWFkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBkYXRhYmFzZSBkaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvblxuICAgICAqIEByZXR1cm5zIEVtYmVkZGVkRGF0YWJhc2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgb3BlbihwYXRoOiBzdHJpbmcsIGNvbmZpZz86IEVtYmVkZGVkRGF0YWJhc2VDb25maWcpOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBsZXQgaGFuZGxlO1xuXG4gICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgd2FsX2VuYWJsZWQ6IGNvbmZpZy53YWxFbmFibGVkID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdhbF9lbmFibGVkX3NldDogY29uZmlnLndhbEVuYWJsZWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzeW5jX21vZGU6IGNvbmZpZy5zeW5jTW9kZSA9PT0gJ2Z1bGwnID8gMiA6IChjb25maWcuc3luY01vZGUgPT09ICdub3JtYWwnID8gMSA6IDApLFxuICAgICAgICAgICAgICAgIHN5bmNfbW9kZV9zZXQ6IGNvbmZpZy5zeW5jTW9kZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1lbXRhYmxlX3NpemVfYnl0ZXM6IEJpZ0ludChjb25maWcubWVtdGFibGVTaXplQnl0ZXMgPz8gMCksXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0OiBjb25maWcuZ3JvdXBDb21taXQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0X3NldDogY29uZmlnLmdyb3VwQ29tbWl0ICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGVmYXVsdF9pbmRleF9wb2xpY3k6IDEsIC8vIERlZmF1bHQgdG8gQmFsYW5jZWRcbiAgICAgICAgICAgICAgICBkZWZhdWx0X2luZGV4X3BvbGljeV9zZXQ6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW5fd2l0aF9jb25maWcocGF0aCwgY0NvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3BlbihwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihgRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgYXQgJHtwYXRofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZERhdGFiYXNlKHBhdGgsIGhhbmRsZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW4gYSBkYXRhYmFzZSBpbiBjb25jdXJyZW50IG1vZGUgZm9yIG11bHRpLXByb2Nlc3Mgd2ViIGFwcGxpY2F0aW9uc1xuICAgICAqIFxuICAgICAqIFRoaXMgbW9kZSBhbGxvd3MgbXVsdGlwbGUgTm9kZS5qcyBwcm9jZXNzZXMgKGUuZy4sIFBNMiBjbHVzdGVyIHdvcmtlcnMsXG4gICAgICogbXVsdGlwbGUgRXhwcmVzcyBpbnN0YW5jZXMpIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2Ugc2ltdWx0YW5lb3VzbHkuXG4gICAgICogXG4gICAgICogRmVhdHVyZXM6XG4gICAgICogLSBMb2NrLWZyZWUgcmVhZHMgd2l0aCB+MTAwbnMgbGF0ZW5jeVxuICAgICAqIC0gTXVsdGktcmVhZGVyLCBzaW5nbGUtd3JpdGVyIGNvb3JkaW5hdGlvblxuICAgICAqIC0gQXV0b21hdGljIHdyaXRlIHNlcmlhbGl6YXRpb25cbiAgICAgKiBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBpbXBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICAgICAqIGltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuICAgICAqIFxuICAgICAqIC8vIE9wZW4gaW4gY29uY3VycmVudCBtb2RlIC0gbXVsdGlwbGUgd29ya2VycyBjYW4gYWNjZXNzXG4gICAgICogY29uc3QgZGIgPSBFbWJlZGRlZERhdGFiYXNlLm9wZW5Db25jdXJyZW50KCcuL3dlYl9kYicpO1xuICAgICAqIFxuICAgICAqIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbiAgICAgKiBcbiAgICAgKiBhcHAuZ2V0KCcvdXNlci86aWQnLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgKiAgIC8vIE11bHRpcGxlIGNvbmN1cnJlbnQgcmVxdWVzdHMgY2FuIHJlYWQgc2ltdWx0YW5lb3VzbHlcbiAgICAgKiAgIGNvbnN0IGRhdGEgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oYHVzZXI6JHtyZXEucGFyYW1zLmlkfWApKTtcbiAgICAgKiAgIGlmICghZGF0YSkge1xuICAgICAqICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiAnbm90IGZvdW5kJyB9KTtcbiAgICAgKiAgICAgcmV0dXJuO1xuICAgICAqICAgfVxuICAgICAqICAgcmVzLnNlbmQoZGF0YSk7XG4gICAgICogfSk7XG4gICAgICogXG4gICAgICogYXBwLnBvc3QoJy91c2VyLzppZCcsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAqICAgLy8gV3JpdGVzIGFyZSBzZXJpYWxpemVkIGF1dG9tYXRpY2FsbHlcbiAgICAgKiAgIGF3YWl0IGRiLnB1dChCdWZmZXIuZnJvbShgdXNlcjoke3JlcS5wYXJhbXMuaWR9YCksIHJlcS5ib2R5KTtcbiAgICAgKiAgIHJlcy5qc29uKHsgc3RhdHVzOiAnb2snIH0pO1xuICAgICAqIH0pO1xuICAgICAqIFxuICAgICAqIC8vIFN0YXJ0IHdpdGggUE0yIGNsdXN0ZXIgbW9kZTpcbiAgICAgKiAvLyBwbTIgc3RhcnQgYXBwLmpzIC1pIG1heFxuICAgICAqIGFwcC5saXN0ZW4oMzAwMCk7XG4gICAgICogYGBgXG4gICAgICogXG4gICAgICogQHBhcmFtIHBhdGggLSBQYXRoIHRvIGRhdGFiYXNlIGRpcmVjdG9yeVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgY29uY3VycmVudCBtb2RlXG4gICAgICogQHJldHVybnMgRW1iZWRkZWREYXRhYmFzZSBpbnN0YW5jZSBpbiBjb25jdXJyZW50IG1vZGVcbiAgICAgKi9cbiAgICBzdGF0aWMgb3BlbkNvbmN1cnJlbnQocGF0aDogc3RyaW5nLCBvcHRpb25zPzogeyBmYWxsYmFja1RvU3RhbmRhcmQ/OiBib29sZWFuIH0pOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCBmYWxsYmFja1RvU3RhbmRhcmQgPSBvcHRpb25zPy5mYWxsYmFja1RvU3RhbmRhcmQgPz8gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWJpbmRpbmdzLmlzQ29uY3VycmVudE1vZGVBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgaWYgKGZhbGxiYWNrVG9TdGFuZGFyZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgJ1tTb2NoREJdIENvbmN1cnJlbnQgbW9kZSBub3QgYXZhaWxhYmxlIGluIG5hdGl2ZSBsaWJyYXJ5IChyZXF1aXJlcyB2MC40LjgrKS4gJyArXG4gICAgICAgICAgICAgICAgICAgICdGYWxsaW5nIGJhY2sgdG8gc3RhbmRhcmQgbW9kZS4gRm9yIHByb2R1Y3Rpb24gbXVsdGktcHJvY2VzcyBkZXBsb3ltZW50cywgJyArXG4gICAgICAgICAgICAgICAgICAgICdwbGVhc2UgdXBncmFkZSB0aGUgU29jaERCIG5hdGl2ZSBsaWJyYXJ5LidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IGJpbmRpbmdzLnNvY2hkYl9vcGVuKHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKGBGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZSBhdCAke3BhdGh9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWREYXRhYmFzZShwYXRoLCBoYW5kbGUsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKFxuICAgICAgICAgICAgICAgICdDb25jdXJyZW50IG1vZGUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVwZ3JhZGUgdGhlIFNvY2hEQiBuYXRpdmUgbGlicmFyeSB0byB2MC40LjgrICcgK1xuICAgICAgICAgICAgICAgICdvciB1c2Ugb3BlbkNvbmN1cnJlbnQocGF0aCwgeyBmYWxsYmFja1RvU3RhbmRhcmQ6IHRydWUgfSkgdG8gZmFsbCBiYWNrIHRvIHN0YW5kYXJkIG1vZGUuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IGJpbmRpbmdzLnNvY2hkYl9vcGVuX2NvbmN1cnJlbnQocGF0aCk7XG4gICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihgRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgaW4gY29uY3VycmVudCBtb2RlIGF0ICR7cGF0aH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzQ29uY3VycmVudCA9IGJpbmRpbmdzLnNvY2hkYl9pc19jb25jdXJyZW50Py4oaGFuZGxlKSA9PT0gMTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZERhdGFiYXNlKHBhdGgsIGhhbmRsZSwgaXNDb25jdXJyZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgZGF0YWJhc2UgaXMgb3BlbmVkIGluIGNvbmN1cnJlbnQgbW9kZVxuICAgICAqL1xuICAgIGdldCBpc0NvbmN1cnJlbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgY29uY3VycmVudCBtb2RlIGZlbGwgYmFjayB0byBzdGFuZGFyZCBtb2RlXG4gICAgICovXG4gICAgZ2V0IGlzQ29uY3VycmVudEZhbGxiYWNrKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uY3VycmVudE1vZGVGYWxsYmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBjb25jdXJyZW50IG1vZGUgaXMgYXZhaWxhYmxlIGluIHRoZSBuYXRpdmUgbGlicmFyeVxuICAgICAqL1xuICAgIHN0YXRpYyBpc0NvbmN1cnJlbnRNb2RlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKS5pc0NvbmN1cnJlbnRNb2RlQXZhaWxhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHV0IGEga2V5LXZhbHVlIHBhaXIgKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgcHV0KGtleTogQnVmZmVyLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5wdXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgdmFsdWUgYnkga2V5IChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGdldChrZXk6IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHR4bi5nZXQoa2V5KTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYSBrZXkgKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlKGtleTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdXQgdmFsdWUgYXQgcGF0aCAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBwdXRQYXRoKHBhdGg6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4ucHV0UGF0aChwYXRoLCB2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHZhbHVlIGF0IHBhdGggKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UGF0aChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0eG4uZ2V0UGF0aChwYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTY2FuIGtleXMgd2l0aCBwcmVmaXhcbiAgICAgKi9cbiAgICBhc3luYyAqc2NhblByZWZpeChwcmVmaXg6IEJ1ZmZlcik6IEFzeW5jR2VuZXJhdG9yPFtCdWZmZXIsIEJ1ZmZlcl0+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiB0eG4uc2NhblByZWZpeChwcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgZW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmVnaW4gYSB0cmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uKCk6IEVtYmVkZGVkVHJhbnNhY3Rpb24ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG5IYW5kbGUgPSB0aGlzLmJpbmRpbmdzLnNvY2hkYl9iZWdpbl90eG4odGhpcy5oYW5kbGUpO1xuICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkVHJhbnNhY3Rpb24odGhpcywgdGhpcy5oYW5kbGUsIHR4bkhhbmRsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBvcGVyYXRpb25zIHdpdGhpbiBhIHRyYW5zYWN0aW9uICh3aXRoIGF1dG8tY29tbWl0L2Fib3J0KVxuICAgICAqL1xuICAgIGFzeW5jIHdpdGhUcmFuc2FjdGlvbjxUPihmbjogKHR4bjogRW1iZWRkZWRUcmFuc2FjdGlvbikgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbih0eG4pO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZSBhIGNoZWNrcG9pbnRcbiAgICAgKi9cbiAgICBhc3luYyBjaGVja3BvaW50KCk6IFByb21pc2U8YmlnaW50PiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgICAgICBjb25zdCBsc24gPSB0aGlzLmJpbmRpbmdzLnNvY2hkYl9jaGVja3BvaW50KHRoaXMuaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIEJpZ0ludChsc24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzdG9yYWdlIHN0YXRpc3RpY3NcbiAgICAgKi9cbiAgICBhc3luYyBzdGF0cygpOiBQcm9taXNlPHtcbiAgICAgICAgbWVtdGFibGVTaXplQnl0ZXM6IGJpZ2ludDtcbiAgICAgICAgd2FsU2l6ZUJ5dGVzOiBiaWdpbnQ7XG4gICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgICAgICBtaW5BY3RpdmVTbmFwc2hvdDogYmlnaW50O1xuICAgICAgICBsYXN0Q2hlY2twb2ludExzbjogYmlnaW50O1xuICAgIH0+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgLy8gUmV0dXJucyBzdHJ1Y3QgYnkgdmFsdWUgKGF1dG9tYXRpY2FsbHkgZGVjb2RlZClcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLmJpbmRpbmdzLnNvY2hkYl9zdGF0cyh0aGlzLmhhbmRsZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbWVtdGFibGVTaXplQnl0ZXM6IEJpZ0ludChzdGF0cy5tZW10YWJsZV9zaXplX2J5dGVzKSxcbiAgICAgICAgICAgIHdhbFNpemVCeXRlczogQmlnSW50KHN0YXRzLndhbF9zaXplX2J5dGVzKSxcbiAgICAgICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uczogc3RhdHMuYWN0aXZlX3RyYW5zYWN0aW9ucyxcbiAgICAgICAgICAgIG1pbkFjdGl2ZVNuYXBzaG90OiBCaWdJbnQoc3RhdHMubWluX2FjdGl2ZV9zbmFwc2hvdCksXG4gICAgICAgICAgICBsYXN0Q2hlY2twb2ludExzbjogQmlnSW50KHN0YXRzLmxhc3RfY2hlY2twb2ludF9sc24pLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIGRhdGFiYXNlXG4gICAgICovXG4gICAgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3Muc29jaGRiX2Nsb3NlKHRoaXMuaGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZW5zdXJlT3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcignRGF0YWJhc2UgaXMgY2xvc2VkJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW50ZXJuYWwgaGFuZGxlIChmb3IgdHJhbnNhY3Rpb25zKVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldEhhbmRsZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJpbmRpbmdzIGluc3RhbmNlIChmb3IgdHJhbnNhY3Rpb25zKVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldEJpbmRpbmdzKCk6IE5hdGl2ZUJpbmRpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluZGluZ3M7XG4gICAgfVxufVxuIl19
|
|
@@ -36,18 +36,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.NativeBindings = void 0;
|
|
37
37
|
const koffi = __importStar(require("koffi"));
|
|
38
38
|
const library_finder_1 = require("./library-finder");
|
|
39
|
-
// Opaque pointer types
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
// Opaque pointer types - wrap in function to handle duplicates
|
|
40
|
+
function definePointerType(name) {
|
|
41
|
+
try {
|
|
42
|
+
return koffi.pointer(name, koffi.opaque());
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
// Type already defined in test environment, return undefined
|
|
46
|
+
// koffi will still recognize the type name in function signatures
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function defineStructType(name, fields) {
|
|
51
|
+
try {
|
|
52
|
+
return koffi.struct(name, fields);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
// Type already defined in test environment, return undefined
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const DatabaseHandle = definePointerType('DatabaseHandle');
|
|
60
|
+
const IteratorHandle = definePointerType('IteratorHandle');
|
|
42
61
|
// Structs
|
|
43
|
-
const Stats =
|
|
62
|
+
const Stats = defineStructType('Stats', {
|
|
44
63
|
memtable_size_bytes: 'size_t',
|
|
45
64
|
wal_size_bytes: 'size_t',
|
|
46
65
|
active_transactions: 'uint32',
|
|
47
66
|
min_active_snapshot: 'uint64',
|
|
48
67
|
last_checkpoint_lsn: 'uint64'
|
|
49
68
|
});
|
|
50
|
-
const DatabaseConfig =
|
|
69
|
+
const DatabaseConfig = defineStructType('DatabaseConfig', {
|
|
51
70
|
wal_enabled: 'bool',
|
|
52
71
|
wal_enabled_set: 'bool',
|
|
53
72
|
sync_mode: 'uint8',
|
|
@@ -58,20 +77,23 @@ const DatabaseConfig = koffi.struct('DatabaseConfig', {
|
|
|
58
77
|
default_index_policy: 'uint8',
|
|
59
78
|
default_index_policy_set: 'bool'
|
|
60
79
|
});
|
|
61
|
-
const TxnHandle =
|
|
80
|
+
const TxnHandle = defineStructType('TxnHandle', {
|
|
62
81
|
txn_id: 'uint64',
|
|
63
82
|
snapshot_ts: 'uint64'
|
|
64
83
|
});
|
|
65
|
-
const CommitResult =
|
|
84
|
+
const CommitResult = defineStructType('CommitResult', {
|
|
66
85
|
commit_ts: 'uint64',
|
|
67
86
|
error_code: 'int32'
|
|
68
87
|
});
|
|
69
88
|
class NativeBindings {
|
|
70
89
|
static instance;
|
|
71
90
|
lib;
|
|
91
|
+
_concurrentModeAvailable = false;
|
|
72
92
|
// FFIs
|
|
73
93
|
sochdb_open;
|
|
74
94
|
sochdb_open_with_config;
|
|
95
|
+
sochdb_open_concurrent;
|
|
96
|
+
sochdb_is_concurrent;
|
|
75
97
|
sochdb_close;
|
|
76
98
|
// Transactional Operations (mapped to base functions)
|
|
77
99
|
sochdb_begin_txn;
|
|
@@ -109,6 +131,18 @@ class NativeBindings {
|
|
|
109
131
|
// DB Management
|
|
110
132
|
this.sochdb_open = this.lib.func('sochdb_open', DatabaseHandle, ['string']);
|
|
111
133
|
this.sochdb_open_with_config = this.lib.func('sochdb_open_with_config', DatabaseHandle, ['string', DatabaseConfig]);
|
|
134
|
+
// Concurrent mode (v0.4.8+)
|
|
135
|
+
try {
|
|
136
|
+
this.sochdb_open_concurrent = this.lib.func('sochdb_open_concurrent', DatabaseHandle, ['string']);
|
|
137
|
+
this.sochdb_is_concurrent = this.lib.func('sochdb_is_concurrent', 'int', [DatabaseHandle]);
|
|
138
|
+
this._concurrentModeAvailable = true;
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
// Older library versions don't have concurrent mode
|
|
142
|
+
this.sochdb_open_concurrent = null;
|
|
143
|
+
this.sochdb_is_concurrent = null;
|
|
144
|
+
this._concurrentModeAvailable = false;
|
|
145
|
+
}
|
|
112
146
|
this.sochdb_close = this.lib.func('sochdb_close', 'void', [DatabaseHandle]);
|
|
113
147
|
// Transactions
|
|
114
148
|
this.sochdb_begin_txn = this.lib.func('sochdb_begin_txn', TxnHandle, [DatabaseHandle]);
|
|
@@ -137,6 +171,12 @@ class NativeBindings {
|
|
|
137
171
|
}
|
|
138
172
|
return NativeBindings.instance;
|
|
139
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* Check if concurrent mode is available in the native library
|
|
176
|
+
*/
|
|
177
|
+
isConcurrentModeAvailable() {
|
|
178
|
+
return this._concurrentModeAvailable;
|
|
179
|
+
}
|
|
140
180
|
}
|
|
141
181
|
exports.NativeBindings = NativeBindings;
|
|
142
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW1iZWRkZWQvZmZpL2JpbmRpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixxREFBK0M7QUFFL0MsdUJBQXVCO0FBQ3ZCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDdkUsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUV2RSxVQUFVO0FBQ1YsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7SUFDaEMsbUJBQW1CLEVBQUUsUUFBUTtJQUM3QixjQUFjLEVBQUUsUUFBUTtJQUN4QixtQkFBbUIsRUFBRSxRQUFRO0lBQzdCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsbUJBQW1CLEVBQUUsUUFBUTtDQUNoQyxDQUFDLENBQUM7QUFFSCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO0lBQ2xELFdBQVcsRUFBRSxNQUFNO0lBQ25CLGVBQWUsRUFBRSxNQUFNO0lBQ3ZCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLGFBQWEsRUFBRSxNQUFNO0lBQ3JCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsWUFBWSxFQUFFLE1BQU07SUFDcEIsZ0JBQWdCLEVBQUUsTUFBTTtJQUN4QixvQkFBb0IsRUFBRSxPQUFPO0lBQzdCLHdCQUF3QixFQUFFLE1BQU07Q0FDbkMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUU7SUFDeEMsTUFBTSxFQUFFLFFBQVE7SUFDaEIs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d0NBdUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMga29mZmkgZnJvbSAna29mZmknO1xuaW1wb3J0IHsgZmluZExpYnJhcnkgfSBmcm9tICcuL2xpYnJhcnktZmluZGVyJztcblxuLy8gT3BhcXVlIHBvaW50ZXIgdHlwZXNcbmNvbnN0IERhdGFiYXNlSGFuZGxlID0ga29mZmkucG9pbnRlcignRGF0YWJhc2VIYW5kbGUnLCBrb2ZmaS5vcGFxdWUoKSk7XG5jb25zdCBJdGVyYXRvckhhbmRsZSA9IGtvZmZpLnBvaW50ZXIoJ0l0ZXJhdG9ySGFuZGxlJywga29mZmkub3BhcXVlKCkpO1xuXG4vLyBTdHJ1Y3RzXG5jb25zdCBTdGF0cyA9IGtvZmZpLnN0cnVjdCgnU3RhdHMnLCB7XG4gICAgbWVtdGFibGVfc2l6ZV9ieXRlczogJ3NpemVfdCcsXG4gICAgd2FsX3NpemVfYnl0ZXM6ICdzaXplX3QnLFxuICAgIGFjdGl2ZV90cmFuc2FjdGlvbnM6ICd1aW50MzInLFxuICAgIG1pbl9hY3RpdmVfc25hcHNob3Q6ICd1aW50NjQnLFxuICAgIGxhc3RfY2hlY2twb2ludF9sc246ICd1aW50NjQnXG59KTtcblxuY29uc3QgRGF0YWJhc2VDb25maWcgPSBrb2ZmaS5zdHJ1Y3QoJ0RhdGFiYXNlQ29uZmlnJywge1xuICAgIHdhbF9lbmFibGVkOiAnYm9vbCcsXG4gICAgd2FsX2VuYWJsZWRfc2V0OiAnYm9vbCcsXG4gICAgc3luY19tb2RlOiAndWludDgnLFxuICAgIHN5bmNfbW9kZV9zZXQ6ICdib29sJyxcbiAgICBtZW10YWJsZV9zaXplX2J5dGVzOiAndWludDY0JyxcbiAgICBncm91cF9jb21taXQ6ICdib29sJyxcbiAgICBncm91cF9jb21taXRfc2V0OiAnYm9vbCcsXG4gICAgZGVmYXVsdF9pbmRleF9wb2xpY3k6ICd1aW50OCcsXG4gICAgZGVmYXVsdF9pbmRleF9wb2xpY3lfc2V0OiAnYm9vbCdcbn0pO1xuXG5jb25zdCBUeG5IYW5kbGUgPSBrb2ZmaS5zdHJ1Y3QoJ1R4bkhhbmRsZScsIHtcbiAgICB0eG5faWQ6ICd1aW50NjQnLFxuICAgIHNuYXBzaG90X3RzOiAndWludDY0J1xufSk7XG5cbmNvbnN0IENvbW1pdFJlc3VsdCA9IGtvZmZpLnN0cnVjdCgnQ29tbWl0UmVzdWx0Jywge1xuICAgIGNvbW1pdF90czogJ3VpbnQ2NCcsXG4gICAgZXJyb3JfY29kZTogJ2ludDMyJ1xufSk7XG5cbmV4cG9ydCBjbGFzcyBOYXRpdmVCaW5kaW5ncyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE5hdGl2ZUJpbmRpbmdzO1xuICAgIHByaXZhdGUgbGliOiBhbnk7XG5cbiAgICAvLyBGRklzXG4gICAgcHVibGljIHNvY2hkYl9vcGVuOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9vcGVuX3dpdGhfY29uZmlnOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9jbG9zZTogYW55O1xuXG4gICAgLy8gVHJhbnNhY3Rpb25hbCBPcGVyYXRpb25zIChtYXBwZWQgdG8gYmFzZSBmdW5jdGlvbnMpXG4gICAgcHVibGljIHNvY2hkYl9iZWdpbl90eG46IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2NvbW1pdDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfYWJvcnQ6IGFueTtcblxuICAgIC8vIEtWIE9wZXJhdGlvbnMgKEFsbCB0YWtlIERhdGFiYXNlSGFuZGxlIEFORCBUeG5IYW5kbGUpXG4gICAgLy8gcHV0OiAoZGIsIHR4biwga2V5LCBrbGVuLCB2YWwsIHZsZW4pIC0+IGludFxuICAgIHB1YmxpYyBzb2NoZGJfcHV0OiBhbnk7XG4gICAgLy8gZ2V0OiAoZGIsIHR4biwga2V5LCBrbGVuLCB2YWxfb3V0KiwgbGVuX291dCopIC0+IGludFxuICAgIHB1YmxpYyBzb2NoZGJfZ2V0OiBhbnk7XG4gICAgLy8gZGVsZXRlOiAoZGIsIHR4biwga2V5LCBrbGVuKSAtPiBpbnRcbiAgICBwdWJsaWMgc29jaGRiX2RlbGV0ZTogYW55O1xuXG4gICAgLy8gUGF0aCBPcGVyYXRpb25zXG4gICAgcHVibGljIHNvY2hkYl9wdXRfcGF0aDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfZ2V0X3BhdGg6IGFueTtcblxuICAgIC8vIFNjYW5uaW5nXG4gICAgcHVibGljIHNvY2hkYl9zY2FuX3ByZWZpeDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfaXRlcmF0b3JfbmV4dDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfaXRlcmF0b3JfY2xvc2U6IGFueTtcblxuICAgIC8vIFN0YXRzXG4gICAgcHVibGljIHNvY2hkYl9zdGF0czogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfY2hlY2twb2ludDogYW55O1xuXG4gICAgLy8gTWVtb3J5XG4gICAgcHVibGljIHNvY2hkYl9mcmVlX2J5dGVzOiBhbnk7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBjb25zdCBsaWJQYXRoID0gZmluZExpYnJhcnkoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMubGliID0ga29mZmkubG9hZChsaWJQYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvYWQgU29jaERCIGxpYnJhcnkgZnJvbSAke2xpYlBhdGh9OmAsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBiaW5kaW5nc1xuXG4gICAgICAgIC8vIERCIE1hbmFnZW1lbnRcbiAgICAgICAgdGhpcy5zb2NoZGJfb3BlbiA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9vcGVuJywgRGF0YWJhc2VIYW5kbGUsIFsnc3RyaW5nJ10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9vcGVuX3dpdGhfY29uZmlnID0gdGhpcy5saWIuZnVuYygnc29jaGRiX29wZW5fd2l0aF9jb25maWcnLCBEYXRhYmFzZUhhbmRsZSwgWydzdHJpbmcnLCBEYXRhYmFzZUNvbmZpZ10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jbG9zZScsICd2b2lkJywgW0RhdGFiYXNlSGFuZGxlXSk7XG5cbiAgICAgICAgLy8gVHJhbnNhY3Rpb25zXG4gICAgICAgIHRoaXMuc29jaGRiX2JlZ2luX3R4biA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9iZWdpbl90eG4nLCBUeG5IYW5kbGUsIFtEYXRhYmFzZUhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9jb21taXQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfY29tbWl0JywgQ29tbWl0UmVzdWx0LCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9hYm9ydCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9hYm9ydCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuXG4gICAgICAgIC8vIEtWIE9wZXJhdGlvbnNcbiAgICAgICAgdGhpcy5zb2NoZGJfcHV0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX3B1dCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCAndWludDgqJywgJ3NpemVfdCddKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfZ2V0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX2dldCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcigndWludDgqJykpLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcignc2l6ZV90JykpXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2RlbGV0ZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9kZWxldGUnLCAnaW50JywgW0RhdGFiYXNlSGFuZGxlLCBUeG5IYW5kbGUsICd1aW50OConLCAnc2l6ZV90J10pO1xuXG4gICAgICAgIC8vIFBhdGggT3BlcmF0aW9uc1xuICAgICAgICB0aGlzLnNvY2hkYl9wdXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9wdXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsICd1aW50OConLCAnc2l6ZV90J10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9nZXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9nZXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCd1aW50OConKSksIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCdzaXplX3QnKSldKTtcblxuICAgICAgICAvLyBTY2FubmluZ1xuICAgICAgICB0aGlzLnNvY2hkYl9zY2FuX3ByZWZpeCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX3ByZWZpeCcsIEl0ZXJhdG9ySGFuZGxlLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2l0ZXJhdG9yX25leHQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfc2Nhbl9uZXh0JywgJ2ludCcsIFtJdGVyYXRvckhhbmRsZSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9pdGVyYXRvcl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX2ZyZWUnLCAndm9pZCcsIFtJdGVyYXRvckhhbmRsZV0pO1xuXG4gICAgICAgIC8vIFN0YXRzICYgQ2hlY2twb2ludFxuICAgICAgICB0aGlzLnNvY2hkYl9zdGF0cyA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zdGF0cycsIFN0YXRzLCBbRGF0YWJhc2VIYW5kbGVdKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfY2hlY2twb2ludCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jaGVja3BvaW50JywgJ2ludCcsIFtEYXRhYmFzZUhhbmRsZV0pO1xuXG4gICAgICAgIC8vIE1lbW9yeSBNYW5hZ2VtZW50XG4gICAgICAgIHRoaXMuc29jaGRiX2ZyZWVfYnl0ZXMgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfZnJlZV9ieXRlcycsICd2b2lkJywgWyd1aW50OConLCAnc2l6ZV90J10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTmF0aXZlQmluZGluZ3Mge1xuICAgICAgICBpZiAoIU5hdGl2ZUJpbmRpbmdzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZSA9IG5ldyBOYXRpdmVCaW5kaW5ncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZTtcbiAgICB9XG59XG4iXX0=
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW1iZWRkZWQvZmZpL2JpbmRpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixxREFBK0M7QUFFL0MsK0RBQStEO0FBQy9ELFNBQVMsaUJBQWlCLENBQUMsSUFBWTtJQUNyQyxJQUFJLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsNkRBQTZEO1FBQzdELGtFQUFrRTtRQUNsRSxPQUFPLFNBQWdCLENBQUM7SUFDMUIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLElBQVksRUFBRSxNQUFXO0lBQ2pELElBQUksQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCw2REFBNkQ7UUFDN0QsT0FBTyxTQUFnQixDQUFDO0lBQzFCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMzRCxNQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTNELFVBQVU7QUFDVixNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7SUFDcEMsbUJBQW1CLEVBQUUsUUFBUTtJQUM3QixjQUFjLEVBQUUsUUFBUTtJQUN4QixtQkFBbUIsRUFBRSxRQUFRO0lBQzdCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsbUJBQW1CLEVBQUUsUUFBUTtDQUNoQyxDQUFDLENBQUM7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R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBrb2ZmaSBmcm9tICdrb2ZmaSc7XG5pbXBvcnQgeyBmaW5kTGlicmFyeSB9IGZyb20gJy4vbGlicmFyeS1maW5kZXInO1xuXG4vLyBPcGFxdWUgcG9pbnRlciB0eXBlcyAtIHdyYXAgaW4gZnVuY3Rpb24gdG8gaGFuZGxlIGR1cGxpY2F0ZXNcbmZ1bmN0aW9uIGRlZmluZVBvaW50ZXJUeXBlKG5hbWU6IHN0cmluZykge1xuICB0cnkge1xuICAgIHJldHVybiBrb2ZmaS5wb2ludGVyKG5hbWUsIGtvZmZpLm9wYXF1ZSgpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFR5cGUgYWxyZWFkeSBkZWZpbmVkIGluIHRlc3QgZW52aXJvbm1lbnQsIHJldHVybiB1bmRlZmluZWRcbiAgICAvLyBrb2ZmaSB3aWxsIHN0aWxsIHJlY29nbml6ZSB0aGUgdHlwZSBuYW1lIGluIGZ1bmN0aW9uIHNpZ25hdHVyZXNcbiAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZpbmVTdHJ1Y3RUeXBlKG5hbWU6IHN0cmluZywgZmllbGRzOiBhbnkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4ga29mZmkuc3RydWN0KG5hbWUsIGZpZWxkcyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUeXBlIGFscmVhZHkgZGVmaW5lZCBpbiB0ZXN0IGVudmlyb25tZW50LCByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gIH1cbn1cblxuY29uc3QgRGF0YWJhc2VIYW5kbGUgPSBkZWZpbmVQb2ludGVyVHlwZSgnRGF0YWJhc2VIYW5kbGUnKTtcbmNvbnN0IEl0ZXJhdG9ySGFuZGxlID0gZGVmaW5lUG9pbnRlclR5cGUoJ0l0ZXJhdG9ySGFuZGxlJyk7XG5cbi8vIFN0cnVjdHNcbmNvbnN0IFN0YXRzID0gZGVmaW5lU3RydWN0VHlwZSgnU3RhdHMnLCB7XG4gICAgbWVtdGFibGVfc2l6ZV9ieXRlczogJ3NpemVfdCcsXG4gICAgd2FsX3NpemVfYnl0ZXM6ICdzaXplX3QnLFxuICAgIGFjdGl2ZV90cmFuc2FjdGlvbnM6ICd1aW50MzInLFxuICAgIG1pbl9hY3RpdmVfc25hcHNob3Q6ICd1aW50NjQnLFxuICAgIGxhc3RfY2hlY2twb2ludF9sc246ICd1aW50NjQnXG59KTtcblxuY29uc3QgRGF0YWJhc2VDb25maWcgPSBkZWZpbmVTdHJ1Y3RUeXBlKCdEYXRhYmFzZUNvbmZpZycsIHtcbiAgICB3YWxfZW5hYmxlZDogJ2Jvb2wnLFxuICAgIHdhbF9lbmFibGVkX3NldDogJ2Jvb2wnLFxuICAgIHN5bmNfbW9kZTogJ3VpbnQ4JyxcbiAgICBzeW5jX21vZGVfc2V0OiAnYm9vbCcsXG4gICAgbWVtdGFibGVfc2l6ZV9ieXRlczogJ3VpbnQ2NCcsXG4gICAgZ3JvdXBfY29tbWl0OiAnYm9vbCcsXG4gICAgZ3JvdXBfY29tbWl0X3NldDogJ2Jvb2wnLFxuICAgIGRlZmF1bHRfaW5kZXhfcG9saWN5OiAndWludDgnLFxuICAgIGRlZmF1bHRfaW5kZXhfcG9saWN5X3NldDogJ2Jvb2wnXG59KTtcblxuY29uc3QgVHhuSGFuZGxlID0gZGVmaW5lU3RydWN0VHlwZSgnVHhuSGFuZGxlJywge1xuICAgIHR4bl9pZDogJ3VpbnQ2NCcsXG4gICAgc25hcHNob3RfdHM6ICd1aW50NjQnXG59KTtcblxuY29uc3QgQ29tbWl0UmVzdWx0ID0gZGVmaW5lU3RydWN0VHlwZSgnQ29tbWl0UmVzdWx0Jywge1xuICAgIGNvbW1pdF90czogJ3VpbnQ2NCcsXG4gICAgZXJyb3JfY29kZTogJ2ludDMyJ1xufSk7XG5cbmV4cG9ydCBjbGFzcyBOYXRpdmVCaW5kaW5ncyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE5hdGl2ZUJpbmRpbmdzO1xuICAgIHByaXZhdGUgbGliOiBhbnk7XG4gICAgcHJpdmF0ZSBfY29uY3VycmVudE1vZGVBdmFpbGFibGUgPSBmYWxzZTtcblxuICAgIC8vIEZGSXNcbiAgICBwdWJsaWMgc29jaGRiX29wZW46IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX29wZW5fd2l0aF9jb25maWc6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX29wZW5fY29uY3VycmVudDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfaXNfY29uY3VycmVudDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfY2xvc2U6IGFueTtcblxuICAgIC8vIFRyYW5zYWN0aW9uYWwgT3BlcmF0aW9ucyAobWFwcGVkIHRvIGJhc2UgZnVuY3Rpb25zKVxuICAgIHB1YmxpYyBzb2NoZGJfYmVnaW5fdHhuOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9jb21taXQ6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2Fib3J0OiBhbnk7XG5cbiAgICAvLyBLViBPcGVyYXRpb25zIChBbGwgdGFrZSBEYXRhYmFzZUhhbmRsZSBBTkQgVHhuSGFuZGxlKVxuICAgIC8vIHB1dDogKGRiLCB0eG4sIGtleSwga2xlbiwgdmFsLCB2bGVuKSAtPiBpbnRcbiAgICBwdWJsaWMgc29jaGRiX3B1dDogYW55O1xuICAgIC8vIGdldDogKGRiLCB0eG4sIGtleSwga2xlbiwgdmFsX291dCosIGxlbl9vdXQqKSAtPiBpbnRcbiAgICBwdWJsaWMgc29jaGRiX2dldDogYW55O1xuICAgIC8vIGRlbGV0ZTogKGRiLCB0eG4sIGtleSwga2xlbikgLT4gaW50XG4gICAgcHVibGljIHNvY2hkYl9kZWxldGU6IGFueTtcblxuICAgIC8vIFBhdGggT3BlcmF0aW9uc1xuICAgIHB1YmxpYyBzb2NoZGJfcHV0X3BhdGg6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2dldF9wYXRoOiBhbnk7XG5cbiAgICAvLyBTY2FubmluZ1xuICAgIHB1YmxpYyBzb2NoZGJfc2Nhbl9wcmVmaXg6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2l0ZXJhdG9yX25leHQ6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2l0ZXJhdG9yX2Nsb3NlOiBhbnk7XG5cbiAgICAvLyBTdGF0c1xuICAgIHB1YmxpYyBzb2NoZGJfc3RhdHM6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2NoZWNrcG9pbnQ6IGFueTtcblxuICAgIC8vIE1lbW9yeVxuICAgIHB1YmxpYyBzb2NoZGJfZnJlZV9ieXRlczogYW55O1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgbGliUGF0aCA9IGZpbmRMaWJyYXJ5KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmxpYiA9IGtvZmZpLmxvYWQobGliUGF0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBsb2FkIFNvY2hEQiBsaWJyYXJ5IGZyb20gJHtsaWJQYXRofTpgLCBlcnJvcik7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpYWxpemUgYmluZGluZ3NcblxuICAgICAgICAvLyBEQiBNYW5hZ2VtZW50XG4gICAgICAgIHRoaXMuc29jaGRiX29wZW4gPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfb3BlbicsIERhdGFiYXNlSGFuZGxlLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfb3Blbl93aXRoX2NvbmZpZyA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9vcGVuX3dpdGhfY29uZmlnJywgRGF0YWJhc2VIYW5kbGUsIFsnc3RyaW5nJywgRGF0YWJhc2VDb25maWddKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENvbmN1cnJlbnQgbW9kZSAodjAuNC44KylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc29jaGRiX29wZW5fY29uY3VycmVudCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9vcGVuX2NvbmN1cnJlbnQnLCBEYXRhYmFzZUhhbmRsZSwgWydzdHJpbmcnXSk7XG4gICAgICAgICAgICB0aGlzLnNvY2hkYl9pc19jb25jdXJyZW50ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX2lzX2NvbmN1cnJlbnQnLCAnaW50JywgW0RhdGFiYXNlSGFuZGxlXSk7XG4gICAgICAgICAgICB0aGlzLl9jb25jdXJyZW50TW9kZUF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBPbGRlciBsaWJyYXJ5IHZlcnNpb25zIGRvbid0IGhhdmUgY29uY3VycmVudCBtb2RlXG4gICAgICAgICAgICB0aGlzLnNvY2hkYl9vcGVuX2NvbmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zb2NoZGJfaXNfY29uY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jb25jdXJyZW50TW9kZUF2YWlsYWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLnNvY2hkYl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jbG9zZScsICd2b2lkJywgW0RhdGFiYXNlSGFuZGxlXSk7XG5cbiAgICAgICAgLy8gVHJhbnNhY3Rpb25zXG4gICAgICAgIHRoaXMuc29jaGRiX2JlZ2luX3R4biA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9iZWdpbl90eG4nLCBUeG5IYW5kbGUsIFtEYXRhYmFzZUhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9jb21taXQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfY29tbWl0JywgQ29tbWl0UmVzdWx0LCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9hYm9ydCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9hYm9ydCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuXG4gICAgICAgIC8vIEtWIE9wZXJhdGlvbnNcbiAgICAgICAgdGhpcy5zb2NoZGJfcHV0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX3B1dCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCAndWludDgqJywgJ3NpemVfdCddKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfZ2V0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX2dldCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcigndWludDgqJykpLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcignc2l6ZV90JykpXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2RlbGV0ZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9kZWxldGUnLCAnaW50JywgW0RhdGFiYXNlSGFuZGxlLCBUeG5IYW5kbGUsICd1aW50OConLCAnc2l6ZV90J10pO1xuXG4gICAgICAgIC8vIFBhdGggT3BlcmF0aW9uc1xuICAgICAgICB0aGlzLnNvY2hkYl9wdXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9wdXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsICd1aW50OConLCAnc2l6ZV90J10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9nZXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9nZXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCd1aW50OConKSksIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCdzaXplX3QnKSldKTtcblxuICAgICAgICAvLyBTY2FubmluZ1xuICAgICAgICB0aGlzLnNvY2hkYl9zY2FuX3ByZWZpeCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX3ByZWZpeCcsIEl0ZXJhdG9ySGFuZGxlLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2l0ZXJhdG9yX25leHQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfc2Nhbl9uZXh0JywgJ2ludCcsIFtJdGVyYXRvckhhbmRsZSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9pdGVyYXRvcl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX2ZyZWUnLCAndm9pZCcsIFtJdGVyYXRvckhhbmRsZV0pO1xuXG4gICAgICAgIC8vIFN0YXRzICYgQ2hlY2twb2ludFxuICAgICAgICB0aGlzLnNvY2hkYl9zdGF0cyA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zdGF0cycsIFN0YXRzLCBbRGF0YWJhc2VIYW5kbGVdKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfY2hlY2twb2ludCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jaGVja3BvaW50JywgJ2ludCcsIFtEYXRhYmFzZUhhbmRsZV0pO1xuXG4gICAgICAgIC8vIE1lbW9yeSBNYW5hZ2VtZW50XG4gICAgICAgIHRoaXMuc29jaGRiX2ZyZWVfYnl0ZXMgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfZnJlZV9ieXRlcycsICd2b2lkJywgWyd1aW50OConLCAnc2l6ZV90J10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTmF0aXZlQmluZGluZ3Mge1xuICAgICAgICBpZiAoIU5hdGl2ZUJpbmRpbmdzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZSA9IG5ldyBOYXRpdmVCaW5kaW5ncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBjb25jdXJyZW50IG1vZGUgaXMgYXZhaWxhYmxlIGluIHRoZSBuYXRpdmUgbGlicmFyeVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0NvbmN1cnJlbnRNb2RlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uY3VycmVudE1vZGVBdmFpbGFibGU7XG4gICAgfVxufVxuIl19
|
package/dist/esm/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* SochDB Node.js SDK v0.4.
|
|
3
|
+
* SochDB Node.js SDK v0.4.4
|
|
4
4
|
*
|
|
5
5
|
* Dual-mode architecture: Embedded (FFI) + Server (gRPC/IPC)
|
|
6
6
|
*
|
|
@@ -13,7 +13,12 @@
|
|
|
13
13
|
* - No server required - just npm install and run
|
|
14
14
|
* - Best for: Local development, simple apps
|
|
15
15
|
*
|
|
16
|
-
* 2.
|
|
16
|
+
* 2. Concurrent Mode (FFI) - For multi-process apps:
|
|
17
|
+
* - Same FFI bindings with MVCC for concurrent access
|
|
18
|
+
* - Multiple Node.js processes can access same database
|
|
19
|
+
* - Best for: PM2 cluster, Express workers
|
|
20
|
+
*
|
|
21
|
+
* 3. Server Mode (gRPC/IPC) - For distributed systems:
|
|
17
22
|
* - Thin client connecting to sochdb-grpc server
|
|
18
23
|
* - Best for: Production, multi-language, scalability
|
|
19
24
|
*
|
|
@@ -27,6 +32,15 @@
|
|
|
27
32
|
* await db.close();
|
|
28
33
|
* ```
|
|
29
34
|
*
|
|
35
|
+
* @example Concurrent Mode
|
|
36
|
+
* ```typescript
|
|
37
|
+
* import { Database } from '@sochdb/sochdb';
|
|
38
|
+
*
|
|
39
|
+
* // Multiple processes can access simultaneously
|
|
40
|
+
* const db = Database.openConcurrent('./mydb');
|
|
41
|
+
* console.log(`Concurrent: ${db.isConcurrent}`);
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
30
44
|
* @example Server Mode
|
|
31
45
|
* ```typescript
|
|
32
46
|
* import { SochDBClient } from '@sochdb/sochdb';
|
|
@@ -37,9 +51,9 @@
|
|
|
37
51
|
* ```
|
|
38
52
|
*/
|
|
39
53
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
exports.GrpcClient = exports.SplitBrainError = exports.EpochMismatchError = exports.LockTimeoutError = exports.DatabaseLockedError = exports.LockError = exports.ErrorCode = exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = exports.Query = exports.FormatConversionError = exports.FormatCapabilities = exports.CanonicalFormat = exports.ContextFormat = exports.WireFormat = exports.IpcClient = exports.SochDBClient = exports.
|
|
54
|
+
exports.GrpcClient = exports.SplitBrainError = exports.EpochMismatchError = exports.LockTimeoutError = exports.DatabaseLockedError = exports.LockError = exports.ErrorCode = exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = exports.Query = exports.FormatConversionError = exports.FormatCapabilities = exports.CanonicalFormat = exports.ContextFormat = exports.WireFormat = exports.IpcClient = exports.SochDBClient = exports.PolicyService = exports.MCP_ERROR_CODES = exports.McpError = exports.McpClient = exports.McpServer = exports.AllowedSet = exports.HybridRetriever = exports.Consolidator = exports.ExtractionPipeline = exports.createContextBuilder = exports.TruncationStrategy = exports.ContextOutputFormat = exports.ContextQueryBuilder = exports.SemanticCache = exports.createQueue = exports.TaskState = exports.PriorityQueue = exports.CollectionExistsError = exports.CollectionNotFoundError = exports.NamespaceExistsError = exports.NamespaceNotFoundError = exports.DistanceMetric = exports.Collection = exports.Namespace = exports.Database = exports.HnswBindings = exports.HnswIndex = exports.EmbeddedTransaction = exports.EmbeddedDatabase = exports.VERSION = void 0;
|
|
41
55
|
// Version
|
|
42
|
-
exports.VERSION = '0.4.
|
|
56
|
+
exports.VERSION = '0.4.4';
|
|
43
57
|
// Embedded mode (FFI) - NEW
|
|
44
58
|
var embedded_1 = require("./embedded");
|
|
45
59
|
Object.defineProperty(exports, "EmbeddedDatabase", { enumerable: true, get: function () { return embedded_1.EmbeddedDatabase; } });
|
|
@@ -80,7 +94,15 @@ Object.defineProperty(exports, "ExtractionPipeline", { enumerable: true, get: fu
|
|
|
80
94
|
Object.defineProperty(exports, "Consolidator", { enumerable: true, get: function () { return memory_1.Consolidator; } });
|
|
81
95
|
Object.defineProperty(exports, "HybridRetriever", { enumerable: true, get: function () { return memory_1.HybridRetriever; } });
|
|
82
96
|
Object.defineProperty(exports, "AllowedSet", { enumerable: true, get: function () { return memory_1.AllowedSet; } });
|
|
83
|
-
|
|
97
|
+
// MCP - Model Context Protocol (v0.4.3)
|
|
98
|
+
var mcp_1 = require("./mcp");
|
|
99
|
+
Object.defineProperty(exports, "McpServer", { enumerable: true, get: function () { return mcp_1.McpServer; } });
|
|
100
|
+
Object.defineProperty(exports, "McpClient", { enumerable: true, get: function () { return mcp_1.McpClient; } });
|
|
101
|
+
Object.defineProperty(exports, "McpError", { enumerable: true, get: function () { return mcp_1.McpError; } });
|
|
102
|
+
Object.defineProperty(exports, "MCP_ERROR_CODES", { enumerable: true, get: function () { return mcp_1.MCP_ERROR_CODES; } });
|
|
103
|
+
// Policy Service (v0.4.3)
|
|
104
|
+
var policy_1 = require("./policy");
|
|
105
|
+
Object.defineProperty(exports, "PolicyService", { enumerable: true, get: function () { return policy_1.PolicyService; } });
|
|
84
106
|
// Server mode (gRPC/IPC)
|
|
85
107
|
var grpc_client_1 = require("./grpc-client");
|
|
86
108
|
Object.defineProperty(exports, "SochDBClient", { enumerable: true, get: function () { return grpc_client_1.SochDBClient; } });
|
|
@@ -112,4 +134,4 @@ Object.defineProperty(exports, "SplitBrainError", { enumerable: true, get: funct
|
|
|
112
134
|
// Convenience alias
|
|
113
135
|
var grpc_client_2 = require("./grpc-client");
|
|
114
136
|
Object.defineProperty(exports, "GrpcClient", { enumerable: true, get: function () { return grpc_client_2.SochDBClient; } });
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERzs7O0FBRUgsVUFBVTtBQUNHLFFBQUEsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUUvQiw0QkFBNEI7QUFDNUIsdUNBQXNFO0FBQTdELDRHQUFBLGdCQUFnQixPQUFBO0FBQ3pCLHVDQUFpRDtBQUF4QywrR0FBQSxtQkFBbUIsT0FBQTtBQUM1Qix1Q0FBaUU7QUFBeEQscUdBQUEsU0FBUyxPQUFBO0FBQWMsd0dBQUEsWUFBWSxPQUFBO0FBRzVDLDBDQUEwQztBQUMxQyx1Q0FBMEQ7QUFBakQsb0dBQUEsZ0JBQWdCLE9BQVk7QUFFckMseUJBQXlCO0FBQ3pCLHlDQVFxQjtBQVBuQixzR0FBQSxTQUFTLE9BQUE7QUFDVCx1R0FBQSxVQUFVLE9BQUE7QUFDViwyR0FBQSxjQUFjLE9BQUE7QUFDZCxtSEFBQSxzQkFBc0IsT0FBQTtBQUN0QixpSEFBQSxvQkFBb0IsT0FBQTtBQUNwQixvSEFBQSx1QkFBdUIsT0FBQTtBQUN2QixrSEFBQSxxQkFBcUIsT0FBQTtBQVN2QixxQkFBcUI7QUFDckIsaUNBSWlCO0FBSGYsc0dBQUEsYUFBYSxPQUFBO0FBQ2Isa0dBQUEsU0FBUyxPQUFBO0FBQ1Qsb0dBQUEsV0FBVyxPQUFBO0FBU2IsMEJBQTBCO0FBQzFCLG1EQUUwQjtBQUR4QiwrR0FBQSxhQUFhLE9BQUE7QUFRZiwyQkFBMkI7QUFDM0IscURBSzJCO0FBSnpCLHNIQUFBLG1CQUFtQixPQUFBO0FBQ25CLHNIQUFBLG1CQUFtQixPQUFBO0FBQ25CLHFIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHVIQUFBLG9CQUFvQixPQUFBO0FBTXRCLHlCQUF5QjtBQUN6QixtQ0FLa0I7QUFKaEIsNEdBQUEsa0JBQWtCLE9BQUE7QUFDbEIsc0dBQUEsWUFBWSxPQUFBO0FBQ1oseUdBQUEsZUFBZSxPQUFBO0FBQ2Ysb0dBQUEsVUFBVSxPQUFBO0FBZ0JaLHdDQUF3QztBQUN4Qyw2QkFLZTtBQUpiLGdHQUFBLFNBQVMsT0FBQTtBQUNULGdHQUFBLFNBQVMsT0FBQTtBQUNULCtGQUFBLFFBQVEsT0FBQTtBQUNSLHNHQUFBLGVBQWUsT0FBQTtBQWlCakIsMEJBQTBCO0FBQzFCLG1DQUVrQjtBQURoQix1R0FBQSxhQUFhLE9BQUE7QUFlZix5QkFBeUI7QUFDekIsNkNBQTZDO0FBQXBDLDJHQUFBLFlBQVksT0FBQTtBQVFyQiwyQ0FBeUM7QUFBaEMsdUdBQUEsU0FBUyxPQUFBO0FBRWxCLG1CQUFtQjtBQUNuQixtQ0FNa0I7QUFMaEIsb0dBQUEsVUFBVSxPQUFBO0FBQ1YsdUdBQUEsYUFBYSxPQUFBO0FBQ2IseUdBQUEsZUFBZSxPQUFBO0FBQ2YsNEdBQUEsa0JBQWtCLE9BQUE7QUFDbEIsK0dBQUEscUJBQXFCLE9BQUE7QUFHdkIsbUJBQW1CO0FBQ25CLGlDQUFnQztBQUF2Qiw4RkFBQSxLQUFLLE9BQUE7QUFHZCxtQ0Fha0I7QUFaaEIscUdBQUEsV0FBVyxPQUFBO0FBQ1gseUdBQUEsZUFBZSxPQUFBO0FBQ2YsMEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsdUdBQUEsYUFBYSxPQUFBO0FBQ2IsdUdBQUEsYUFBYSxPQUFBO0FBQ2IsdUJBQXVCO0FBQ3ZCLG1HQUFBLFNBQVMsT0FBQTtBQUNULG1HQUFBLFNBQVMsT0FBQTtBQUNULDZHQUFBLG1CQUFtQixPQUFBO0FBQ25CLDBHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHlHQUFBLGVBQWUsT0FBQTtBQUdqQixvQkFBb0I7QUFDcEIsNkNBQTJEO0FBQWxELHlHQUFBLFlBQVksT0FBYyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU29jaERCIE5vZGUuanMgU0RLIHYwLjQuNFxuICogXG4gKiBEdWFsLW1vZGUgYXJjaGl0ZWN0dXJlOiBFbWJlZGRlZCAoRkZJKSArIFNlcnZlciAoZ1JQQy9JUEMpXG4gKiBcbiAqIEFyY2hpdGVjdHVyZTogRmxleGlibGUgRGVwbG95bWVudFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogVGhpcyBTREsgc3VwcG9ydHMgQk9USCBtb2RlczpcbiAqIFxuICogMS4gRW1iZWRkZWQgTW9kZSAoRkZJKSAtIEZvciBzaW5nbGUtcHJvY2VzcyBhcHBzOlxuICogICAgLSBEaXJlY3QgRkZJIGJpbmRpbmdzIHRvIFJ1c3QgbGlicmFyaWVzXG4gKiAgICAtIE5vIHNlcnZlciByZXF1aXJlZCAtIGp1c3QgbnBtIGluc3RhbGwgYW5kIHJ1blxuICogICAgLSBCZXN0IGZvcjogTG9jYWwgZGV2ZWxvcG1lbnQsIHNpbXBsZSBhcHBzXG4gKiBcbiAqIDIuIENvbmN1cnJlbnQgTW9kZSAoRkZJKSAtIEZvciBtdWx0aS1wcm9jZXNzIGFwcHM6XG4gKiAgICAtIFNhbWUgRkZJIGJpbmRpbmdzIHdpdGggTVZDQyBmb3IgY29uY3VycmVudCBhY2Nlc3NcbiAqICAgIC0gTXVsdGlwbGUgTm9kZS5qcyBwcm9jZXNzZXMgY2FuIGFjY2VzcyBzYW1lIGRhdGFiYXNlXG4gKiAgICAtIEJlc3QgZm9yOiBQTTIgY2x1c3RlciwgRXhwcmVzcyB3b3JrZXJzXG4gKiBcbiAqIDMuIFNlcnZlciBNb2RlIChnUlBDL0lQQykgLSBGb3IgZGlzdHJpYnV0ZWQgc3lzdGVtczpcbiAqICAgIC0gVGhpbiBjbGllbnQgY29ubmVjdGluZyB0byBzb2NoZGItZ3JwYyBzZXJ2ZXJcbiAqICAgIC0gQmVzdCBmb3I6IFByb2R1Y3Rpb24sIG11bHRpLWxhbmd1YWdlLCBzY2FsYWJpbGl0eVxuICogXG4gKiBAZXhhbXBsZSBFbWJlZGRlZCBNb2RlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogLy8gRGlyZWN0IEZGSSAtIG5vIHNlcnZlciBuZWVkZWRcbiAqIGNvbnN0IGRiID0gYXdhaXQgRGF0YWJhc2Uub3BlbignLi9teWRiJyk7XG4gKiBhd2FpdCBkYi5wdXQoQnVmZmVyLmZyb20oJ2tleScpLCBCdWZmZXIuZnJvbSgndmFsdWUnKSk7XG4gKiBhd2FpdCBkYi5jbG9zZSgpO1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlIENvbmN1cnJlbnQgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKiBcbiAqIC8vIE11bHRpcGxlIHByb2Nlc3NlcyBjYW4gYWNjZXNzIHNpbXVsdGFuZW91c2x5XG4gKiBjb25zdCBkYiA9IERhdGFiYXNlLm9wZW5Db25jdXJyZW50KCcuL215ZGInKTtcbiAqIGNvbnNvbGUubG9nKGBDb25jdXJyZW50OiAke2RiLmlzQ29uY3VycmVudH1gKTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZSBTZXJ2ZXIgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgU29jaERCQ2xpZW50IH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiAvLyBDb25uZWN0IHRvIHNlcnZlclxuICogY29uc3QgY2xpZW50ID0gbmV3IFNvY2hEQkNsaWVudCh7IGFkZHJlc3M6ICdsb2NhbGhvc3Q6NTAwNTEnIH0pO1xuICogYXdhaXQgY2xpZW50LnB1dEt2KCdrZXknLCBCdWZmZXIuZnJvbSgndmFsdWUnKSk7XG4gKiBgYGBcbiAqL1xuXG4vLyBWZXJzaW9uXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9ICcwLjQuNCc7XG5cbi8vIEVtYmVkZGVkIG1vZGUgKEZGSSkgLSBORVdcbmV4cG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UsIEVtYmVkZGVkRGF0YWJhc2VDb25maWcgfSBmcm9tICcuL2VtYmVkZGVkJztcbmV4cG9ydCB7IEVtYmVkZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuL2VtYmVkZGVkJztcbmV4cG9ydCB7IEhuc3dJbmRleCwgSG5zd0NvbmZpZywgSG5zd0JpbmRpbmdzIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBTZWFyY2hSZXN1bHQgYXMgSG5zd1NlYXJjaFJlc3VsdCB9IGZyb20gJy4vZW1iZWRkZWQnO1xuXG4vLyBFbWJlZGRlZCBtb2RlIChGRkkpIC0gQ29udmVuaWVuY2UgYWxpYXNcbmV4cG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UgYXMgRGF0YWJhc2UgfSBmcm9tICcuL2VtYmVkZGVkJztcblxuLy8gTmFtZXNwYWNlIEFQSSAodjAuNC4xKVxuZXhwb3J0IHtcbiAgTmFtZXNwYWNlLFxuICBDb2xsZWN0aW9uLFxuICBEaXN0YW5jZU1ldHJpYyxcbiAgTmFtZXNwYWNlTm90Rm91bmRFcnJvcixcbiAgTmFtZXNwYWNlRXhpc3RzRXJyb3IsXG4gIENvbGxlY3Rpb25Ob3RGb3VuZEVycm9yLFxuICBDb2xsZWN0aW9uRXhpc3RzRXJyb3IsXG59IGZyb20gJy4vbmFtZXNwYWNlJztcbmV4cG9ydCB0eXBlIHtcbiAgTmFtZXNwYWNlQ29uZmlnLFxuICBDb2xsZWN0aW9uQ29uZmlnLFxuICBTZWFyY2hSZXF1ZXN0LFxuICBTZWFyY2hSZXN1bHQgYXMgTmFtZXNwYWNlU2VhcmNoUmVzdWx0LFxufSBmcm9tICcuL25hbWVzcGFjZSc7XG5cbi8vIFF1ZXVlIEFQSSAodjAuNC4xKVxuZXhwb3J0IHtcbiAgUHJpb3JpdHlRdWV1ZSxcbiAgVGFza1N0YXRlLFxuICBjcmVhdGVRdWV1ZSxcbn0gZnJvbSAnLi9xdWV1ZSc7XG5leHBvcnQgdHlwZSB7XG4gIFF1ZXVlQ29uZmlnLFxuICBRdWV1ZUtleSxcbiAgVGFzayxcbiAgUXVldWVTdGF0cyxcbn0gZnJvbSAnLi9xdWV1ZSc7XG5cbi8vIFNlbWFudGljIENhY2hlICh2MC40LjEpXG5leHBvcnQge1xuICBTZW1hbnRpY0NhY2hlLFxufSBmcm9tICcuL3NlbWFudGljLWNhY2hlJztcbmV4cG9ydCB0eXBlIHtcbiAgQ2FjaGVFbnRyeSxcbiAgQ2FjaGVIaXQsXG4gIENhY2hlU3RhdHMsXG59IGZyb20gJy4vc2VtYW50aWMtY2FjaGUnO1xuXG4vLyBDb250ZXh0IEJ1aWxkZXIgKHYwLjQuMSlcbmV4cG9ydCB7XG4gIENvbnRleHRRdWVyeUJ1aWxkZXIsXG4gIENvbnRleHRPdXRwdXRGb3JtYXQsXG4gIFRydW5jYXRpb25TdHJhdGVneSxcbiAgY3JlYXRlQ29udGV4dEJ1aWxkZXIsXG59IGZyb20gJy4vY29udGV4dC1idWlsZGVyJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29udGV4dFJlc3VsdCxcbn0gZnJvbSAnLi9jb250ZXh0LWJ1aWxkZXInO1xuXG4vLyBNZW1vcnkgU3lzdGVtICh2MC40LjIpXG5leHBvcnQge1xuICBFeHRyYWN0aW9uUGlwZWxpbmUsXG4gIENvbnNvbGlkYXRvcixcbiAgSHlicmlkUmV0cmlldmVyLFxuICBBbGxvd2VkU2V0LFxufSBmcm9tICcuL21lbW9yeSc7XG5leHBvcnQgdHlwZSB7XG4gIEVudGl0eSxcbiAgUmVsYXRpb24sXG4gIEFzc2VydGlvbixcbiAgUmF3QXNzZXJ0aW9uLFxuICBDYW5vbmljYWxGYWN0LFxuICBFeHRyYWN0aW9uUmVzdWx0LFxuICBFeHRyYWN0aW9uU2NoZW1hLFxuICBDb25zb2xpZGF0aW9uQ29uZmlnLFxuICBSZXRyaWV2YWxDb25maWcsXG4gIFJldHJpZXZhbFJlc3VsdCxcbiAgUmV0cmlldmFsUmVzcG9uc2UsXG59IGZyb20gJy4vbWVtb3J5JztcblxuLy8gTUNQIC0gTW9kZWwgQ29udGV4dCBQcm90b2NvbCAodjAuNC4zKVxuZXhwb3J0IHtcbiAgTWNwU2VydmVyLFxuICBNY3BDbGllbnQsXG4gIE1jcEVycm9yLFxuICBNQ1BfRVJST1JfQ09ERVMsXG59IGZyb20gJy4vbWNwJztcbmV4cG9ydCB0eXBlIHtcbiAgTWNwVG9vbCxcbiAgTWNwVG9vbENhbGwsXG4gIE1jcFRvb2xSZXN1bHQsXG4gIE1jcFJlc291cmNlLFxuICBNY3BSZXNvdXJjZUNvbnRlbnQsXG4gIE1jcFByb21wdCxcbiAgTWNwUHJvbXB0QXJndW1lbnQsXG4gIE1jcFByb21wdE1lc3NhZ2UsXG4gIE1jcFNlcnZlckNhcGFiaWxpdGllcyxcbiAgTWNwU2VydmVyQ29uZmlnLFxuICBNY3BDbGllbnRDb25maWcsXG4gIE1jcFRyYW5zcG9ydCxcbn0gZnJvbSAnLi9tY3AnO1xuXG4vLyBQb2xpY3kgU2VydmljZSAodjAuNC4zKVxuZXhwb3J0IHtcbiAgUG9saWN5U2VydmljZSxcbn0gZnJvbSAnLi9wb2xpY3knO1xuZXhwb3J0IHR5cGUge1xuICBQb2xpY3lSdWxlLFxuICBQb2xpY3lDb25kaXRpb24sXG4gIFBvbGljeUV2YWx1YXRpb24sXG4gIE5hbWVzcGFjZVBvbGljeSxcbiAgTmFtZXNwYWNlR3JhbnQsXG4gIE5hbWVzcGFjZVBlcm1pc3Npb24sXG4gIFBvbGljeUFjdGlvbixcbiAgUG9saWN5UmVxdWVzdCxcbiAgUG9saWN5U2V0LFxuICBQb2xpY3lBdWRpdEVudHJ5LFxufSBmcm9tICcuL3BvbGljeSc7XG5cbi8vIFNlcnZlciBtb2RlIChnUlBDL0lQQylcbmV4cG9ydCB7IFNvY2hEQkNsaWVudCB9IGZyb20gJy4vZ3JwYy1jbGllbnQnO1xuZXhwb3J0IHR5cGUge1xuICBTZWFyY2hSZXN1bHQsXG4gIERvY3VtZW50LFxuICBHcmFwaE5vZGUsXG4gIEdyYXBoRWRnZSxcbn0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG5cbmV4cG9ydCB7IElwY0NsaWVudCB9IGZyb20gJy4vaXBjLWNsaWVudCc7XG5cbi8vIEZvcm1hdCB1dGlsaXRpZXNcbmV4cG9ydCB7XG4gIFdpcmVGb3JtYXQsXG4gIENvbnRleHRGb3JtYXQsXG4gIENhbm9uaWNhbEZvcm1hdCxcbiAgRm9ybWF0Q2FwYWJpbGl0aWVzLFxuICBGb3JtYXRDb252ZXJzaW9uRXJyb3IsXG59IGZyb20gJy4vZm9ybWF0JztcblxuLy8gVHlwZSBkZWZpbml0aW9uc1xuZXhwb3J0IHsgUXVlcnkgfSBmcm9tICcuL3F1ZXJ5JztcbmV4cG9ydCB0eXBlIHsgUXVlcnlSZXN1bHQgfSBmcm9tICcuL3F1ZXJ5JztcblxuZXhwb3J0IHtcbiAgU29jaERCRXJyb3IsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgVHJhbnNhY3Rpb25FcnJvcixcbiAgUHJvdG9jb2xFcnJvcixcbiAgRGF0YWJhc2VFcnJvcixcbiAgLy8gTG9jayBlcnJvcnMgKHYwLjQuMSlcbiAgRXJyb3JDb2RlLFxuICBMb2NrRXJyb3IsXG4gIERhdGFiYXNlTG9ja2VkRXJyb3IsXG4gIExvY2tUaW1lb3V0RXJyb3IsXG4gIEVwb2NoTWlzbWF0Y2hFcnJvcixcbiAgU3BsaXRCcmFpbkVycm9yLFxufSBmcm9tICcuL2Vycm9ycyc7XG5cbi8vIENvbnZlbmllbmNlIGFsaWFzXG5leHBvcnQgeyBTb2NoREJDbGllbnQgYXMgR3JwY0NsaWVudCB9IGZyb20gJy4vZ3JwYy1jbGllbnQnO1xuIl19
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Client Implementation
|
|
4
|
+
*
|
|
5
|
+
* Client for connecting to MCP servers.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.McpClient = void 0;
|
|
9
|
+
const types_1 = require("./types");
|
|
10
|
+
/**
|
|
11
|
+
* MCP Client for connecting to MCP servers
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { McpClient } from '@sochdb/sochdb';
|
|
16
|
+
*
|
|
17
|
+
* const client = new McpClient({
|
|
18
|
+
* serverUri: 'stdio://./mcp-server',
|
|
19
|
+
* transport: 'stdio'
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* // List available tools
|
|
23
|
+
* const tools = await client.listTools();
|
|
24
|
+
*
|
|
25
|
+
* // Call a tool
|
|
26
|
+
* const result = await client.callTool('db_get', { key: 'user:123' });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
class McpClient {
|
|
30
|
+
config;
|
|
31
|
+
connected = false;
|
|
32
|
+
requestId = 0;
|
|
33
|
+
constructor(config) {
|
|
34
|
+
this.config = {
|
|
35
|
+
transport: 'stdio',
|
|
36
|
+
timeout: 30000,
|
|
37
|
+
...config,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Connect to the MCP server
|
|
42
|
+
*/
|
|
43
|
+
async connect() {
|
|
44
|
+
// In a full implementation, this would establish the transport connection
|
|
45
|
+
this.connected = true;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Disconnect from the MCP server
|
|
49
|
+
*/
|
|
50
|
+
async disconnect() {
|
|
51
|
+
this.connected = false;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if connected
|
|
55
|
+
*/
|
|
56
|
+
isConnected() {
|
|
57
|
+
return this.connected;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* List available tools
|
|
61
|
+
*/
|
|
62
|
+
async listTools() {
|
|
63
|
+
this.ensureConnected();
|
|
64
|
+
// In a full implementation, this would send a tools/list request
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Call a tool
|
|
69
|
+
*/
|
|
70
|
+
async callTool(name, args) {
|
|
71
|
+
this.ensureConnected();
|
|
72
|
+
const callId = `call_${++this.requestId}`;
|
|
73
|
+
// In a full implementation, this would send a tools/call request
|
|
74
|
+
return {
|
|
75
|
+
id: callId,
|
|
76
|
+
content: null,
|
|
77
|
+
isError: true,
|
|
78
|
+
errorMessage: 'Not implemented - use McpServer directly for embedded mode',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* List available resources
|
|
83
|
+
*/
|
|
84
|
+
async listResources() {
|
|
85
|
+
this.ensureConnected();
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Read a resource
|
|
90
|
+
*/
|
|
91
|
+
async readResource(uri) {
|
|
92
|
+
this.ensureConnected();
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* List available prompts
|
|
97
|
+
*/
|
|
98
|
+
async listPrompts() {
|
|
99
|
+
this.ensureConnected();
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get prompt messages
|
|
104
|
+
*/
|
|
105
|
+
async getPrompt(name, args) {
|
|
106
|
+
this.ensureConnected();
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
ensureConnected() {
|
|
110
|
+
if (!this.connected) {
|
|
111
|
+
throw new types_1.McpError('Not connected to MCP server', types_1.MCP_ERROR_CODES.INTERNAL_ERROR);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.McpClient = McpClient;
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21jcC9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVILG1DQVdpQjtBQUVqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBYSxTQUFTO0lBQ1osTUFBTSxDQUFrQjtJQUN4QixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFdEIsWUFBWSxNQUF1QjtRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osU0FBUyxFQUFFLE9BQU87WUFDbEIsT0FBTyxFQUFFLEtBQUs7WUFDZCxHQUFHLE1BQU07U0FDVixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU87UUFDWCwwRUFBMEU7UUFDMUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxTQUFTO1FBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLGlFQUFpRTtRQUNqRSxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBWSxFQUFFLElBQXlCO1FBQ3BELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QixNQUFNLE1BQU0sR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRTFDLGlFQUFpRTtRQUNqRSxPQUFPO1lBQ0wsRUFBRSxFQUFFLE1BQU07WUFDVixPQUFPLEVBQUUsSUFBSTtZQUNiLE9BQU8sRUFBRSxJQUFJO1lBQ2IsWUFBWSxFQUFFLDREQUE0RDtTQUMzRSxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGFBQWE7UUFDakIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFXO1FBQzVCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXO1FBQ2YsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFZLEVBQUUsSUFBMEI7UUFDdEQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksZ0JBQVEsQ0FBQyw2QkFBNkIsRUFBRSx1QkFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFsR0QsOEJBa0dDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNQ1AgQ2xpZW50IEltcGxlbWVudGF0aW9uXG4gKiBcbiAqIENsaWVudCBmb3IgY29ubmVjdGluZyB0byBNQ1Agc2VydmVycy5cbiAqL1xuXG5pbXBvcnQge1xuICBNY3BUb29sLFxuICBNY3BUb29sQ2FsbCxcbiAgTWNwVG9vbFJlc3VsdCxcbiAgTWNwUmVzb3VyY2UsXG4gIE1jcFJlc291cmNlQ29udGVudCxcbiAgTWNwUHJvbXB0LFxuICBNY3BQcm9tcHRNZXNzYWdlLFxuICBNY3BDbGllbnRDb25maWcsXG4gIE1jcEVycm9yLFxuICBNQ1BfRVJST1JfQ09ERVMsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIE1DUCBDbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gTUNQIHNlcnZlcnNcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IE1jcENsaWVudCB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogY29uc3QgY2xpZW50ID0gbmV3IE1jcENsaWVudCh7XG4gKiAgIHNlcnZlclVyaTogJ3N0ZGlvOi8vLi9tY3Atc2VydmVyJyxcbiAqICAgdHJhbnNwb3J0OiAnc3RkaW8nXG4gKiB9KTtcbiAqIFxuICogLy8gTGlzdCBhdmFpbGFibGUgdG9vbHNcbiAqIGNvbnN0IHRvb2xzID0gYXdhaXQgY2xpZW50Lmxpc3RUb29scygpO1xuICogXG4gKiAvLyBDYWxsIGEgdG9vbFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmNhbGxUb29sKCdkYl9nZXQnLCB7IGtleTogJ3VzZXI6MTIzJyB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTWNwQ2xpZW50IHtcbiAgcHJpdmF0ZSBjb25maWc6IE1jcENsaWVudENvbmZpZztcbiAgcHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXF1ZXN0SWQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogTWNwQ2xpZW50Q29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICB0cmFuc3BvcnQ6ICdzdGRpbycsXG4gICAgICB0aW1lb3V0OiAzMDAwMCxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgdG8gdGhlIE1DUCBzZXJ2ZXJcbiAgICovXG4gIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gSW4gYSBmdWxsIGltcGxlbWVudGF0aW9uLCB0aGlzIHdvdWxkIGVzdGFibGlzaCB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb25cbiAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdCBmcm9tIHRoZSBNQ1Agc2VydmVyXG4gICAqL1xuICBhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY29ubmVjdGVkXG4gICAqL1xuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhdmFpbGFibGUgdG9vbHNcbiAgICovXG4gIGFzeW5jIGxpc3RUb29scygpOiBQcm9taXNlPE1jcFRvb2xbXT4ge1xuICAgIHRoaXMuZW5zdXJlQ29ubmVjdGVkKCk7XG4gICAgLy8gSW4gYSBmdWxsIGltcGxlbWVudGF0aW9uLCB0aGlzIHdvdWxkIHNlbmQgYSB0b29scy9saXN0IHJlcXVlc3RcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBhIHRvb2xcbiAgICovXG4gIGFzeW5jIGNhbGxUb29sKG5hbWU6IHN0cmluZywgYXJnczogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb21pc2U8TWNwVG9vbFJlc3VsdD4ge1xuICAgIHRoaXMuZW5zdXJlQ29ubmVjdGVkKCk7XG4gICAgXG4gICAgY29uc3QgY2FsbElkID0gYGNhbGxfJHsrK3RoaXMucmVxdWVzdElkfWA7XG4gICAgXG4gICAgLy8gSW4gYSBmdWxsIGltcGxlbWVudGF0aW9uLCB0aGlzIHdvdWxkIHNlbmQgYSB0b29scy9jYWxsIHJlcXVlc3RcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGNhbGxJZCxcbiAgICAgIGNvbnRlbnQ6IG51bGwsXG4gICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgZXJyb3JNZXNzYWdlOiAnTm90IGltcGxlbWVudGVkIC0gdXNlIE1jcFNlcnZlciBkaXJlY3RseSBmb3IgZW1iZWRkZWQgbW9kZScsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGF2YWlsYWJsZSByZXNvdXJjZXNcbiAgICovXG4gIGFzeW5jIGxpc3RSZXNvdXJjZXMoKTogUHJvbWlzZTxNY3BSZXNvdXJjZVtdPiB7XG4gICAgdGhpcy5lbnN1cmVDb25uZWN0ZWQoKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhIHJlc291cmNlXG4gICAqL1xuICBhc3luYyByZWFkUmVzb3VyY2UodXJpOiBzdHJpbmcpOiBQcm9taXNlPE1jcFJlc291cmNlQ29udGVudCB8IG51bGw+IHtcbiAgICB0aGlzLmVuc3VyZUNvbm5lY3RlZCgpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYXZhaWxhYmxlIHByb21wdHNcbiAgICovXG4gIGFzeW5jIGxpc3RQcm9tcHRzKCk6IFByb21pc2U8TWNwUHJvbXB0W10+IHtcbiAgICB0aGlzLmVuc3VyZUNvbm5lY3RlZCgpO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcHJvbXB0IG1lc3NhZ2VzXG4gICAqL1xuICBhc3luYyBnZXRQcm9tcHQobmFtZTogc3RyaW5nLCBhcmdzPzogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb21pc2U8TWNwUHJvbXB0TWVzc2FnZVtdIHwgbnVsbD4ge1xuICAgIHRoaXMuZW5zdXJlQ29ubmVjdGVkKCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUNvbm5lY3RlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgTWNwRXJyb3IoJ05vdCBjb25uZWN0ZWQgdG8gTUNQIHNlcnZlcicsIE1DUF9FUlJPUl9DT0RFUy5JTlRFUk5BTF9FUlJPUik7XG4gICAgfVxuICB9XG59XG4iXX0=
|