obsidian-typings 2.2.1-beta.8 → 2.3.0
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/.gitattributes +1 -0
- package/README.md +7 -7
- package/dist/implementations.cjs +89 -36
- package/dist/implementations.d.ts +3700 -163
- package/dist/obsidian-typings.api.json +39429 -17295
- package/dist/style-mod.d.cts +1 -1
- package/dist/types.d.ts +6178 -4883
- package/package.json +21 -9
- package/tools/generateTypes.js +381 -0
- package/tools/generateTypes.ts +479 -0
package/.gitattributes
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* text=auto eol=lf
|
package/README.md
CHANGED
|
@@ -79,20 +79,20 @@ Be aware that the typings currently only cover a subset of the full API: while m
|
|
|
79
79
|
|
|
80
80
|
3. **Explicit type importing**
|
|
81
81
|
|
|
82
|
-
If you prefer not to add `obsidian-typings` to your `types`, you can also add `import
|
|
82
|
+
If you prefer not to add `obsidian-typings` to your `types`, you can also add `import 'obsidian-typings';` to any project file.
|
|
83
83
|
|
|
84
84
|
|
|
85
85
|
|
|
86
86
|
4. **Using `obsidian-typings/implementations`** <span id="using-obsidian-typings-implementations"></span>
|
|
87
87
|
|
|
88
|
-
Depending on how your project is set up, `import { X } from
|
|
88
|
+
Depending on how your project is set up, `import { X } from 'obsidian-typings/implementations';` may not work straight out of the box, e.g., if you have `"moduleResolution": "node"` or `"node10"` in your `tsconfig.json`
|
|
89
89
|
|
|
90
90
|
To solve this, you can add the following to your `tsconfig.json`:
|
|
91
91
|
|
|
92
92
|
```json
|
|
93
93
|
{
|
|
94
94
|
"compilerOptions": {
|
|
95
|
-
...
|
|
95
|
+
"...": "...",
|
|
96
96
|
"paths": {
|
|
97
97
|
"obsidian-typings/implementations": [
|
|
98
98
|
"./node_modules/obsidian-typings/dist/implementations.d.ts",
|
|
@@ -110,7 +110,7 @@ Be aware that the typings currently only cover a subset of the full API: while m
|
|
|
110
110
|
To access types from the `obsidian` module, the import syntax does not change:
|
|
111
111
|
|
|
112
112
|
```ts
|
|
113
|
-
import { App } from
|
|
113
|
+
import { App } from 'obsidian';
|
|
114
114
|
|
|
115
115
|
function printInternalPlugins(app: App): void {
|
|
116
116
|
console.log(app.internalPlugins);
|
|
@@ -122,7 +122,7 @@ function printInternalPlugins(app: App): void {
|
|
|
122
122
|
Additional interfaces added by this package (which do not exist in the official API), can be imported using:
|
|
123
123
|
|
|
124
124
|
```ts
|
|
125
|
-
import { InternalPlugins } from
|
|
125
|
+
import { InternalPlugins } from 'obsidian-typings';
|
|
126
126
|
|
|
127
127
|
const internalPlugins: InternalPlugins = this.app.internalPlugins;
|
|
128
128
|
```
|
|
@@ -132,7 +132,7 @@ const internalPlugins: InternalPlugins = this.app.internalPlugins;
|
|
|
132
132
|
Additional helper functions/types/... added by this package can be used by importing from `obsidian-typings/implementations`:
|
|
133
133
|
|
|
134
134
|
```ts
|
|
135
|
-
import { InternalPluginName } from
|
|
135
|
+
import { InternalPluginName } from 'obsidian-typings/implementations';
|
|
136
136
|
|
|
137
137
|
this.app.internalPlugins.getEnabledPluginById(InternalPluginName.FileExplorer);
|
|
138
138
|
```
|
|
@@ -145,7 +145,7 @@ If you need to extend the typings provided by this package, add the following to
|
|
|
145
145
|
|
|
146
146
|
```ts
|
|
147
147
|
export {}; // This is a very essential line. If you don't have any other top-level `import/export` statements, those typings will work not as expected.
|
|
148
|
-
declare module
|
|
148
|
+
declare module 'obsidian-typings' {
|
|
149
149
|
interface PluginsPluginsRecord {
|
|
150
150
|
myPlugin: MyPlugin;
|
|
151
151
|
}
|
package/dist/implementations.cjs
CHANGED
|
@@ -26,8 +26,17 @@ var implementations_exports = {};
|
|
|
26
26
|
__export(implementations_exports, {
|
|
27
27
|
CustomArrayDictImpl: () => CustomArrayDictImpl,
|
|
28
28
|
InternalPluginName: () => InternalPluginName,
|
|
29
|
+
constructApp: () => constructApp,
|
|
30
|
+
constructInternalPlugin: () => constructInternalPlugin,
|
|
31
|
+
constructInternalPlugins: () => constructInternalPlugins,
|
|
32
|
+
constructTFile: () => constructTFile,
|
|
33
|
+
constructTFolder: () => constructTFolder,
|
|
29
34
|
createTFileInstance: () => createTFileInstance,
|
|
30
35
|
createTFolderInstance: () => createTFolderInstance,
|
|
36
|
+
isEmbedCache: () => isEmbedCache,
|
|
37
|
+
isFrontmatterLinkCache: () => isFrontmatterLinkCache,
|
|
38
|
+
isLinkCache: () => isLinkCache,
|
|
39
|
+
isReferenceCache: () => isReferenceCache,
|
|
31
40
|
parentFolderPath: () => parentFolderPath
|
|
32
41
|
});
|
|
33
42
|
module.exports = __toCommonJS(implementations_exports);
|
|
@@ -37,79 +46,66 @@ function parentFolderPath(path) {
|
|
|
37
46
|
return path.replace(/\/?[^\/]*$/, "") || "/";
|
|
38
47
|
}
|
|
39
48
|
|
|
40
|
-
// src/obsidian/implementations/
|
|
49
|
+
// src/obsidian/implementations/Constructors/constructTFolder.ts
|
|
41
50
|
var import_obsidian = require("obsidian");
|
|
51
|
+
function constructTFolder(vault, path) {
|
|
52
|
+
return new import_obsidian.TFolder(vault, path);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// src/obsidian/implementations/createTFolderInstance.ts
|
|
42
56
|
function createTFolderInstance(vault, path) {
|
|
43
57
|
let folder = vault.getFolderByPath(path);
|
|
44
58
|
if (folder) {
|
|
45
59
|
return folder;
|
|
46
60
|
}
|
|
47
|
-
folder =
|
|
61
|
+
folder = constructTFolder(vault, path);
|
|
48
62
|
folder.parent = createTFolderInstance(vault, parentFolderPath(path));
|
|
49
63
|
folder.deleted = true;
|
|
50
64
|
return folder;
|
|
51
65
|
}
|
|
52
66
|
|
|
53
|
-
// src/obsidian/implementations/createTFileInstance.ts
|
|
54
|
-
var import_obsidian2 = require("obsidian");
|
|
55
|
-
function createTFileInstance(vault, path) {
|
|
56
|
-
let file = vault.getFileByPath(path);
|
|
57
|
-
if (file) {
|
|
58
|
-
return file;
|
|
59
|
-
}
|
|
60
|
-
file = new import_obsidian2.TFile(vault, path);
|
|
61
|
-
file.parent = createTFolderInstance(vault, parentFolderPath(path));
|
|
62
|
-
file.deleted = true;
|
|
63
|
-
return file;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
67
|
// src/obsidian/implementations/CustomArrayDictImpl.ts
|
|
67
68
|
var CustomArrayDictImpl = class {
|
|
68
|
-
data =
|
|
69
|
+
data = /* @__PURE__ */ new Map();
|
|
69
70
|
add(key, value) {
|
|
70
|
-
|
|
71
|
-
|
|
71
|
+
let values = this.get(key);
|
|
72
|
+
if (!values) {
|
|
73
|
+
values = [];
|
|
74
|
+
this.data.set(key, []);
|
|
72
75
|
}
|
|
73
|
-
const values = this.data[key];
|
|
74
76
|
if (!values.includes(value)) {
|
|
75
77
|
values.push(value);
|
|
76
78
|
}
|
|
77
79
|
}
|
|
78
80
|
remove(key, value) {
|
|
79
|
-
const values = this.
|
|
81
|
+
const values = this.get(key);
|
|
80
82
|
if (!values) {
|
|
81
83
|
return;
|
|
82
84
|
}
|
|
83
85
|
values.remove(value);
|
|
84
86
|
if (values.length === 0) {
|
|
85
|
-
|
|
87
|
+
this.clear(key);
|
|
86
88
|
}
|
|
87
89
|
}
|
|
88
|
-
removeKey(key) {
|
|
89
|
-
delete this.data[key];
|
|
90
|
-
}
|
|
91
90
|
get(key) {
|
|
92
|
-
return this.data.
|
|
91
|
+
return this.data.get(key) || null;
|
|
93
92
|
}
|
|
94
93
|
keys() {
|
|
95
|
-
return
|
|
94
|
+
return Array.from(this.data.keys());
|
|
96
95
|
}
|
|
97
96
|
clear(key) {
|
|
98
|
-
|
|
97
|
+
this.data.delete(key);
|
|
99
98
|
}
|
|
100
99
|
clearAll() {
|
|
101
|
-
this.data
|
|
100
|
+
this.data.clear();
|
|
102
101
|
}
|
|
103
102
|
contains(key, value) {
|
|
104
|
-
|
|
105
|
-
return values && values.contains(value) || false;
|
|
103
|
+
return !!this.get(key)?.contains(value);
|
|
106
104
|
}
|
|
107
105
|
count() {
|
|
108
106
|
let ans = 0;
|
|
109
|
-
for (const key in this.
|
|
110
|
-
|
|
111
|
-
ans += this.data[key].length;
|
|
112
|
-
}
|
|
107
|
+
for (const key in this.keys()) {
|
|
108
|
+
ans += this.get(key)?.length ?? 0;
|
|
113
109
|
}
|
|
114
110
|
return ans;
|
|
115
111
|
}
|
|
@@ -138,7 +134,6 @@ var InternalPluginName = {
|
|
|
138
134
|
RandomNote: "random-note",
|
|
139
135
|
SlashCommand: "slash-command",
|
|
140
136
|
Slides: "slides",
|
|
141
|
-
Starred: "starred",
|
|
142
137
|
Switcher: "switcher",
|
|
143
138
|
Sync: "sync",
|
|
144
139
|
TagPane: "tag-pane",
|
|
@@ -147,4 +142,62 @@ var InternalPluginName = {
|
|
|
147
142
|
Workspaces: "workspaces",
|
|
148
143
|
ZkPrefixer: "zk-prefixer"
|
|
149
144
|
};
|
|
150
|
-
|
|
145
|
+
|
|
146
|
+
// src/obsidian/implementations/Constructors/constructTFile.ts
|
|
147
|
+
var import_obsidian2 = require("obsidian");
|
|
148
|
+
function constructTFile(vault, path) {
|
|
149
|
+
return new import_obsidian2.TFile(vault, path);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// src/obsidian/implementations/createTFileInstance.ts
|
|
153
|
+
function createTFileInstance(vault, path) {
|
|
154
|
+
let file = vault.getFileByPath(path);
|
|
155
|
+
if (file) {
|
|
156
|
+
return file;
|
|
157
|
+
}
|
|
158
|
+
file = constructTFile(vault, path);
|
|
159
|
+
file.parent = createTFolderInstance(vault, parentFolderPath(path));
|
|
160
|
+
file.deleted = true;
|
|
161
|
+
return file;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// src/obsidian/implementations/TypeGuards/isReferenceCache.ts
|
|
165
|
+
function isReferenceCache(reference) {
|
|
166
|
+
return !!reference.position;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// src/obsidian/implementations/TypeGuards/isEmbedCache.ts
|
|
170
|
+
function isEmbedCache(reference) {
|
|
171
|
+
return isReferenceCache(reference) && reference.original[0] === "!";
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// src/obsidian/implementations/TypeGuards/isFrontmatterLinkCache.ts
|
|
175
|
+
function isFrontmatterLinkCache(reference) {
|
|
176
|
+
return !!reference.key;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// src/obsidian/implementations/TypeGuards/isLinkCache.ts
|
|
180
|
+
function isLinkCache(reference) {
|
|
181
|
+
return isReferenceCache(reference) && reference.original[0] !== "!";
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// src/obsidian/implementations/Constructors/constructInternalPlugins.ts
|
|
185
|
+
function constructInternalPlugins(app) {
|
|
186
|
+
return new app.internalPlugins.constructor(app);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// src/obsidian/implementations/Constructors/constructInternalPlugin.ts
|
|
190
|
+
function constructInternalPlugin(app, instance, internalPlugins) {
|
|
191
|
+
const anyPlugin = Object.values(app.internalPlugins.plugins)[0];
|
|
192
|
+
if (!anyPlugin) {
|
|
193
|
+
throw new Error("No internal plugin found");
|
|
194
|
+
}
|
|
195
|
+
return new anyPlugin.constructor(app, instance, internalPlugins);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// src/obsidian/implementations/Constructors/constructApp.ts
|
|
199
|
+
var import_obsidian3 = require("obsidian");
|
|
200
|
+
function constructApp(adapter, appId) {
|
|
201
|
+
return new import_obsidian3.App(adapter, appId);
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL29ic2lkaWFuL2ltcGxlbWVudGF0aW9ucy9pbmRleC50cyIsICIuLi9zcmMvb2JzaWRpYW4vaW1wbGVtZW50YXRpb25zL1BhdGhVdGlscy50cyIsICIuLi9zcmMvb2JzaWRpYW4vaW1wbGVtZW50YXRpb25zL0NvbnN0cnVjdG9ycy9jb25zdHJ1Y3RURm9sZGVyLnRzIiwgIi4uL3NyYy9vYnNpZGlhbi9pbXBsZW1lbnRhdGlvbnMvY3JlYXRlVEZvbGRlckluc3RhbmNlLnRzIiwgIi4uL3NyYy9vYnNpZGlhbi9pbXBsZW1lbnRhdGlvbnMvQ3VzdG9tQXJyYXlEaWN0SW1wbC50cyIsICIuLi9zcmMvb2JzaWRpYW4vaW1wbGVtZW50YXRpb25zL0ludGVybmFsUGx1Z2luTmFtZS50cyIsICIuLi9zcmMvb2JzaWRpYW4vaW1wbGVtZW50YXRpb25zL0NvbnN0cnVjdG9ycy9jb25zdHJ1Y3RURmlsZS50cyIsICIuLi9zcmMvb2JzaWRpYW4vaW1wbGVtZW50YXRpb25zL2NyZWF0ZVRGaWxlSW5zdGFuY2UudHMiLCAiLi4vc3JjL29ic2lkaWFuL2ltcGxlbWVudGF0aW9ucy9UeXBlR3VhcmRzL2lzUmVmZXJlbmNlQ2FjaGUudHMiLCAiLi4vc3JjL29ic2lkaWFuL2ltcGxlbWVudGF0aW9ucy9UeXBlR3VhcmRzL2lzRW1iZWRDYWNoZS50cyIsICIuLi9zcmMvb2JzaWRpYW4vaW1wbGVtZW50YXRpb25zL1R5cGVHdWFyZHMvaXNGcm9udG1hdHRlckxpbmtDYWNoZS50cyIsICIuLi9zcmMvb2JzaWRpYW4vaW1wbGVtZW50YXRpb25zL1R5cGVHdWFyZHMvaXNMaW5rQ2FjaGUudHMiLCAiLi4vc3JjL29ic2lkaWFuL2ltcGxlbWVudGF0aW9ucy9Db25zdHJ1Y3RvcnMvY29uc3RydWN0SW50ZXJuYWxQbHVnaW5zLnRzIiwgIi4uL3NyYy9vYnNpZGlhbi9pbXBsZW1lbnRhdGlvbnMvQ29uc3RydWN0b3JzL2NvbnN0cnVjdEludGVybmFsUGx1Z2luLnRzIiwgIi4uL3NyYy9vYnNpZGlhbi9pbXBsZW1lbnRhdGlvbnMvQ29uc3RydWN0b3JzL2NvbnN0cnVjdEFwcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGZyb20gJy4vUGF0aFV0aWxzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY3JlYXRlVEZvbGRlckluc3RhbmNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ3VzdG9tQXJyYXlEaWN0SW1wbC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ludGVybmFsUGx1Z2luTmFtZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NyZWF0ZVRGaWxlSW5zdGFuY2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9UeXBlR3VhcmRzL2lzRW1iZWRDYWNoZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1R5cGVHdWFyZHMvaXNGcm9udG1hdHRlckxpbmtDYWNoZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1R5cGVHdWFyZHMvaXNSZWZlcmVuY2VDYWNoZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1R5cGVHdWFyZHMvaXNMaW5rQ2FjaGUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25zdHJ1Y3RvcnMvY29uc3RydWN0VEZvbGRlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbnN0cnVjdG9ycy9jb25zdHJ1Y3RJbnRlcm5hbFBsdWdpbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25zdHJ1Y3RvcnMvY29uc3RydWN0SW50ZXJuYWxQbHVnaW4uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25zdHJ1Y3RvcnMvY29uc3RydWN0QXBwLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ29uc3RydWN0b3JzL2NvbnN0cnVjdFRGaWxlLmpzJztcbmltcG9ydCAnLi4vLi4vaW5kZXguanMnO1xuIiwgImV4cG9ydCBmdW5jdGlvbiBwYXJlbnRGb2xkZXJQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwvP1teXFwvXSokLywgJycpIHx8ICcvJztcbn1cbiIsICJpbXBvcnQge1xuICAgIFRGb2xkZXIsXG4gICAgdHlwZSBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5cbnR5cGUgVEZvbGRlckNvbnN0cnVjdG9yID0gbmV3KHZhdWx0OiBWYXVsdCwgcGF0aDogc3RyaW5nKSA9PiBURm9sZGVyO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgVEZvbGRlciBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gdmF1bHQgLSBUaGUgdmF1bHQgdG8gd2hpY2ggdGhlIGZvbGRlciBiZWxvbmdzLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZm9sZGVyLlxuICogQHJldHVybnMgVGhlIGNvbnN0cnVjdGVkIFRGb2xkZXIgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3RURm9sZGVyKHZhdWx0OiBWYXVsdCwgcGF0aDogc3RyaW5nKTogVEZvbGRlciB7XG4gICAgcmV0dXJuIG5ldyAoVEZvbGRlciBhcyBURm9sZGVyQ29uc3RydWN0b3IpKHZhdWx0LCBwYXRoKTtcbn1cbiIsICJpbXBvcnQge1xuICAgIFRGb2xkZXIsXG4gICAgdHlwZSBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBjb25zdHJ1Y3RURm9sZGVyIH0gZnJvbSAnLi9Db25zdHJ1Y3RvcnMvY29uc3RydWN0VEZvbGRlci50cyc7XG5pbXBvcnQgeyBwYXJlbnRGb2xkZXJQYXRoIH0gZnJvbSAnLi9QYXRoVXRpbHMudHMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW5kIHByb3Blcmx5IGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSBvZiBURm9sZGVyIGV2ZW4gdGhlIHVuZGVybHlpbmcgZm9sZGVyIGRvZXMgbm90IGV4aXN0LlxuICogVGhpcyBkb2Vzbid0IGNyZWF0ZSB0aGUgbWlzc2luZyBmb2xkZXIgb24gdGhlIGZpbGUgc3lzdGVtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVEZvbGRlckluc3RhbmNlKHZhdWx0OiBWYXVsdCwgcGF0aDogc3RyaW5nKTogVEZvbGRlciB7XG4gICAgbGV0IGZvbGRlciA9IHZhdWx0LmdldEZvbGRlckJ5UGF0aChwYXRoKTtcbiAgICBpZiAoZm9sZGVyKSB7XG4gICAgICAgIHJldHVybiBmb2xkZXI7XG4gICAgfVxuXG4gICAgZm9sZGVyID0gY29uc3RydWN0VEZvbGRlcih2YXVsdCwgcGF0aCk7XG4gICAgZm9sZGVyLnBhcmVudCA9IGNyZWF0ZVRGb2xkZXJJbnN0YW5jZSh2YXVsdCwgcGFyZW50Rm9sZGVyUGF0aChwYXRoKSk7XG4gICAgZm9sZGVyLmRlbGV0ZWQgPSB0cnVlO1xuICAgIHJldHVybiBmb2xkZXI7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICcuLi9pbnRlcm5hbHMvQ3VzdG9tQXJyYXlEaWN0LmpzJztcblxuZXhwb3J0IGNsYXNzIEN1c3RvbUFycmF5RGljdEltcGw8VD4gaW1wbGVtZW50cyBDdXN0b21BcnJheURpY3Q8VD4ge1xuICAgIHB1YmxpYyBkYXRhOiBNYXA8c3RyaW5nLCBUW10+ID0gbmV3IE1hcCgpO1xuXG4gICAgcHVibGljIGFkZChrZXk6IHN0cmluZywgdmFsdWU6IFQpOiB2b2lkIHtcbiAgICAgICAgbGV0IHZhbHVlcyA9IHRoaXMuZ2V0KGtleSk7XG4gICAgICAgIGlmICghdmFsdWVzKSB7XG4gICAgICAgICAgICB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXQoa2V5LCBbXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUoa2V5OiBzdHJpbmcsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0KGtleSk7XG4gICAgICAgIGlmICghdmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWVzLnJlbW92ZSh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBUW10gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5nZXQoa2V5KSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBrZXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5kYXRhLmtleXMoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGF0YS5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGF0YS5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb250YWlucyhrZXk6IHN0cmluZywgdmFsdWU6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXQoa2V5KT8uY29udGFpbnModmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3VudCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgYW5zID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5rZXlzKCkpIHtcbiAgICAgICAgICAgIGFucyArPSB0aGlzLmdldChrZXkpPy5sZW5ndGggPz8gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbnM7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBJbnRlcm5hbFBsdWdpbk5hbWUgPSB7XG4gICAgQXVkaW9SZWNvcmRlcjogJ2F1ZGlvLXJlY29yZGVyJyxcbiAgICBCYWNrbGluazogJ2JhY2tsaW5rJyxcbiAgICBCb29rbWFya3M6ICdib29rbWFya3MnLFxuICAgIENhbnZhczogJ2NhbnZhcycsXG4gICAgQ29tbWFuZFBhbGV0dGU6ICdjb21tYW5kLXBhbGV0dGUnLFxuICAgIERhaWx5Tm90ZXM6ICdkYWlseS1ub3RlcycsXG4gICAgRWRpdG9yU3RhdHVzOiAnZWRpdG9yLXN0YXR1cycsXG4gICAgRmlsZUV4cGxvcmVyOiAnZmlsZS1leHBsb3JlcicsXG4gICAgRmlsZVJlY292ZXJ5OiAnZmlsZS1yZWNvdmVyeScsXG4gICAgR2xvYmFsU2VhcmNoOiAnZ2xvYmFsLXNlYXJjaCcsXG4gICAgR3JhcGg6ICdncmFwaCcsXG4gICAgTWFya2Rvd25JbXBvcnRlcjogJ21hcmtkb3duLWltcG9ydGVyJyxcbiAgICBOb3RlQ29tcG9zZXI6ICdub3RlLWNvbXBvc2VyJyxcbiAgICBPdXRnb2luZ0xpbms6ICdvdXRnb2luZy1saW5rJyxcbiAgICBPdXRsaW5lOiAnb3V0bGluZScsXG4gICAgUGFnZVByZXZpZXc6ICdwYWdlLXByZXZpZXcnLFxuICAgIFByb3BlcnRpZXM6ICdwcm9wZXJ0aWVzJyxcbiAgICBQdWJsaXNoOiAncHVibGlzaCcsXG4gICAgUmFuZG9tTm90ZTogJ3JhbmRvbS1ub3RlJyxcbiAgICBTbGFzaENvbW1hbmQ6ICdzbGFzaC1jb21tYW5kJyxcbiAgICBTbGlkZXM6ICdzbGlkZXMnLFxuICAgIFN3aXRjaGVyOiAnc3dpdGNoZXInLFxuICAgIFN5bmM6ICdzeW5jJyxcbiAgICBUYWdQYW5lOiAndGFnLXBhbmUnLFxuICAgIFRlbXBsYXRlczogJ3RlbXBsYXRlcycsXG4gICAgV29yZENvdW50OiAnd29yZC1jb3VudCcsXG4gICAgV29ya3NwYWNlczogJ3dvcmtzcGFjZXMnLFxuICAgIFprUHJlZml4ZXI6ICd6ay1wcmVmaXhlcidcbn0gYXMgY29uc3Q7XG4iLCAiaW1wb3J0IHtcbiAgICBURmlsZSxcbiAgICB0eXBlIFZhdWx0XG59IGZyb20gJ29ic2lkaWFuJztcblxudHlwZSBURmlsZUNvbnN0cnVjdG9yID0gbmV3KHZhdWx0OiBWYXVsdCwgcGF0aDogc3RyaW5nKSA9PiBURmlsZTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IFRGaWxlIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB2YXVsdCAtIFRoZSB2YXVsdCB0byB3aGljaCB0aGUgZmlsZSBiZWxvbmdzLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZS5cbiAqIEByZXR1cm5zIFRoZSBjb25zdHJ1Y3RlZCBURmlsZSBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdFRGaWxlKHZhdWx0OiBWYXVsdCwgcGF0aDogc3RyaW5nKTogVEZpbGUge1xuICAgIHJldHVybiBuZXcgKFRGaWxlIGFzIFRGaWxlQ29uc3RydWN0b3IpKHZhdWx0LCBwYXRoKTtcbn1cbiIsICJpbXBvcnQge1xuICAgIFRGaWxlLFxuICAgIHR5cGUgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgY29uc3RydWN0VEZpbGUgfSBmcm9tICcuL0NvbnN0cnVjdG9ycy9jb25zdHJ1Y3RURmlsZS50cyc7XG5pbXBvcnQgeyBjcmVhdGVURm9sZGVySW5zdGFuY2UgfSBmcm9tICcuL2NyZWF0ZVRGb2xkZXJJbnN0YW5jZS50cyc7XG5pbXBvcnQgeyBwYXJlbnRGb2xkZXJQYXRoIH0gZnJvbSAnLi9QYXRoVXRpbHMudHMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW5kIHByb3Blcmx5IGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSBvZiBURmlsZSBldmVuIHRoZSB1bmRlcmx5aW5nIGZpbGUgZG9lcyBub3QgZXhpc3QuXG4gKiBUaGlzIGRvZXNuJ3QgY3JlYXRlIHRoZSBtaXNzaW5nIGZpbGUgb24gdGhlIGZpbGUgc3lzdGVtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVEZpbGVJbnN0YW5jZSh2YXVsdDogVmF1bHQsIHBhdGg6IHN0cmluZyk6IFRGaWxlIHtcbiAgICBsZXQgZmlsZSA9IHZhdWx0LmdldEZpbGVCeVBhdGgocGF0aCk7XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfVxuXG4gICAgZmlsZSA9IGNvbnN0cnVjdFRGaWxlKHZhdWx0LCBwYXRoKTtcbiAgICBmaWxlLnBhcmVudCA9IGNyZWF0ZVRGb2xkZXJJbnN0YW5jZSh2YXVsdCwgcGFyZW50Rm9sZGVyUGF0aChwYXRoKSk7XG4gICAgZmlsZS5kZWxldGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gZmlsZTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7XG4gICAgUmVmZXJlbmNlLFxuICAgIFJlZmVyZW5jZUNhY2hlXG59IGZyb20gJ29ic2lkaWFuJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVmZXJlbmNlQ2FjaGUocmVmZXJlbmNlOiBSZWZlcmVuY2UpOiByZWZlcmVuY2UgaXMgUmVmZXJlbmNlQ2FjaGUge1xuICAgIHJldHVybiAhIShyZWZlcmVuY2UgYXMgUGFydGlhbDxSZWZlcmVuY2VDYWNoZT4pLnBvc2l0aW9uO1xufVxuIiwgImltcG9ydCB0eXBlIHtcbiAgICBFbWJlZENhY2hlLFxuICAgIFJlZmVyZW5jZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBpc1JlZmVyZW5jZUNhY2hlIH0gZnJvbSAnLi9pc1JlZmVyZW5jZUNhY2hlLnRzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1iZWRDYWNoZShyZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHJlZmVyZW5jZSBpcyBFbWJlZENhY2hlIHtcbiAgICByZXR1cm4gaXNSZWZlcmVuY2VDYWNoZShyZWZlcmVuY2UpICYmIHJlZmVyZW5jZS5vcmlnaW5hbFswXSA9PT0gJyEnO1xufVxuIiwgImltcG9ydCB0eXBlIHtcbiAgICBGcm9udG1hdHRlckxpbmtDYWNoZSxcbiAgICBSZWZlcmVuY2Vcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNGcm9udG1hdHRlckxpbmtDYWNoZShyZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHJlZmVyZW5jZSBpcyBGcm9udG1hdHRlckxpbmtDYWNoZSB7XG4gICAgcmV0dXJuICEhKHJlZmVyZW5jZSBhcyBQYXJ0aWFsPEZyb250bWF0dGVyTGlua0NhY2hlPikua2V5O1xufVxuIiwgImltcG9ydCB0eXBlIHtcbiAgICBMaW5rQ2FjaGUsXG4gICAgUmVmZXJlbmNlXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IGlzUmVmZXJlbmNlQ2FjaGUgfSBmcm9tICcuL2lzUmVmZXJlbmNlQ2FjaGUudHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNMaW5rQ2FjaGUocmVmZXJlbmNlOiBSZWZlcmVuY2UpOiByZWZlcmVuY2UgaXMgTGlua0NhY2hlIHtcbiAgICByZXR1cm4gaXNSZWZlcmVuY2VDYWNoZShyZWZlcmVuY2UpICYmIHJlZmVyZW5jZS5vcmlnaW5hbFswXSAhPT0gJyEnO1xufVxuIiwgImltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbFBsdWdpbnMgfSBmcm9tICcuLi8uLi9pbnRlcm5hbHMvSW50ZXJuYWxQbHVnaW4vSW50ZXJuYWxQbHVnaW5zLmpzJztcblxudHlwZSBJbnRlcm5hbFBsdWdpbnNDb25zdHJ1Y3RvciA9IG5ldyhhcHA6IEFwcCkgPT4gSW50ZXJuYWxQbHVnaW5zO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgSW50ZXJuYWxQbHVnaW5zIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwIGluc3RhbmNlLlxuICogQHJldHVybnMgVGhlIGNvbnN0cnVjdGVkIEludGVybmFsUGx1Z2lucyBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdEludGVybmFsUGx1Z2lucyhhcHA6IEFwcCk6IEludGVybmFsUGx1Z2lucyB7XG4gICAgcmV0dXJuIG5ldyAoYXBwLmludGVybmFsUGx1Z2lucy5jb25zdHJ1Y3RvciBhcyBJbnRlcm5hbFBsdWdpbnNDb25zdHJ1Y3RvcikoYXBwKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxQbHVnaW4gfSBmcm9tICcuLi8uLi9pbnRlcm5hbHMvSW50ZXJuYWxQbHVnaW4vSW50ZXJuYWxQbHVnaW4uanMnO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbFBsdWdpbnMgfSBmcm9tICcuLi8uLi9pbnRlcm5hbHMvSW50ZXJuYWxQbHVnaW4vSW50ZXJuYWxQbHVnaW5zLmpzJztcblxudHlwZSBJbnRlcm5hbFBsdWdpbkNvbnN0cnVjdG9yPEluc3RhbmNlPiA9IG5ldyhcbiAgICBhcHA6IEFwcCxcbiAgICBpbnN0YW5jZTogSW5zdGFuY2UsXG4gICAgaW50ZXJuYWxQbHVnaW5zOiBJbnRlcm5hbFBsdWdpbnNcbikgPT4gSW50ZXJuYWxQbHVnaW48SW5zdGFuY2U+O1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgSW50ZXJuYWxQbHVnaW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gaW5zdGFuY2UgLSBUaGUgaW5zdGFuY2Ugb2YgdGhlIHBsdWdpbi5cbiAqIEBwYXJhbSBpbnRlcm5hbFBsdWdpbnMgLSBUaGUgaW50ZXJuYWwgcGx1Z2lucyBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIFRoZSBjb25zdHJ1Y3RlZCBJbnRlcm5hbFBsdWdpbiBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdEludGVybmFsUGx1Z2luPEluc3RhbmNlPihcbiAgICBhcHA6IEFwcCxcbiAgICBpbnN0YW5jZTogSW5zdGFuY2UsXG4gICAgaW50ZXJuYWxQbHVnaW5zOiBJbnRlcm5hbFBsdWdpbnNcbik6IEludGVybmFsUGx1Z2luPEluc3RhbmNlPiB7XG4gICAgY29uc3QgYW55UGx1Z2luID0gT2JqZWN0LnZhbHVlcyhhcHAuaW50ZXJuYWxQbHVnaW5zLnBsdWdpbnMpWzBdO1xuICAgIGlmICghYW55UGx1Z2luKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gaW50ZXJuYWwgcGx1Z2luIGZvdW5kJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgKGFueVBsdWdpbi5jb25zdHJ1Y3RvciBhcyBJbnRlcm5hbFBsdWdpbkNvbnN0cnVjdG9yPEluc3RhbmNlPikoYXBwLCBpbnN0YW5jZSwgaW50ZXJuYWxQbHVnaW5zKTtcbn1cbiIsICJpbXBvcnQge1xuICAgIEFwcCxcbiAgICB0eXBlIERhdGFBZGFwdGVyXG59IGZyb20gJ29ic2lkaWFuJztcblxudHlwZSBBcHBDb25zdHJ1Y3RvciA9IG5ldyhhZGFwdGVyOiBEYXRhQWRhcHRlciwgYXBwSWQ6IHN0cmluZykgPT4gQXBwO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgQXBwIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBhZGFwdGVyIC0gVGhlIGRhdGEgYWRhcHRlciB0byB1c2UuXG4gKiBAcGFyYW0gYXBwSWQgLSBUaGUgSUQgb2YgdGhlIGFwcC5cbiAqIEByZXR1cm5zIFRoZSBjb25zdHJ1Y3RlZCBBcHAgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3RBcHAoYWRhcHRlcjogRGF0YUFkYXB0ZXIsIGFwcElkOiBzdHJpbmcpOiBBcHAge1xuICAgIHJldHVybiBuZXcgKEFwcCBhcyBBcHBDb25zdHJ1Y3RvcikoYWRhcHRlciwgYXBwSWQpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBTyxTQUFTLGlCQUFpQixNQUFzQjtBQUNuRCxTQUFPLEtBQUssUUFBUSxjQUFjLEVBQUUsS0FBSztBQUM3Qzs7O0FDRkEsc0JBR087QUFXQSxTQUFTLGlCQUFpQixPQUFjLE1BQXVCO0FB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
|