-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.js
315 lines (308 loc) · 29.3 KB
/
main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __create = Object.create;
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
__markAsModule(target);
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
}
return target;
};
var __toModule = (module2) => {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// main.ts
__export(exports, {
default: () => LinkKeeperPlugin
});
var import_obsidian4 = __toModule(require("obsidian"));
// modals.ts
var import_obsidian2 = __toModule(require("obsidian"));
// utils.ts
var import_obsidian = __toModule(require("obsidian"));
var noticeHandler = (msg) => new import_obsidian.Notice(msg);
// modals.ts
var AddLink = class extends import_obsidian2.Modal {
constructor(app, linkUrl, onSubmit) {
super(app);
this.linkName = "";
this.linkUrl = linkUrl;
this.onSubmit = onSubmit;
}
onOpen() {
const { contentEl } = this;
contentEl.createEl("h1", { text: "Add Link", cls: "title" });
new import_obsidian2.Setting(contentEl).setName("Link name").addText((text) => text.setValue(this.linkName).setPlaceholder("name").onChange((value) => {
this.linkName = value;
}));
new import_obsidian2.Setting(contentEl).setName("Link url").addText((text) => text.setValue(this.linkUrl).setPlaceholder("url").onChange((value) => {
this.linkUrl = value;
}));
new import_obsidian2.Setting(contentEl).addButton((btn) => btn.setButtonText("Add").setCta().onClick(() => {
const { linkName, linkUrl } = this;
if (!linkName.trim()) {
noticeHandler("Link name is required!");
} else if (!linkUrl.trim()) {
noticeHandler("Link url is required!");
} else {
this.close();
this.onSubmit(this.linkName, this.linkUrl);
}
}));
}
onClose() {
this.contentEl.empty();
}
};
var DeleteLink = class extends import_obsidian2.Modal {
constructor(app, options, onDelete) {
super(app);
this.onDelete = onDelete;
this.options = options;
this.linkName = Object.keys(options)[0] || "";
}
onOpen() {
const { contentEl } = this;
contentEl.createEl("h1", { text: "Delete Link", cls: "title" });
new import_obsidian2.Setting(contentEl).setName("Link name").addDropdown((dp) => dp.addOptions(this.options).onChange((value) => {
this.linkName = value;
}));
new import_obsidian2.Setting(contentEl).addButton((btn) => btn.setButtonText("Delete").setCta().onClick(() => {
const { linkName } = this;
if (!linkName) {
noticeHandler("Link name is required!");
} else {
this.close();
this.onDelete(this.linkName);
}
}));
}
onClose() {
this.contentEl.empty();
}
};
var ListAllLinks = class extends import_obsidian2.Modal {
constructor(app, options) {
super(app);
this.options = options;
}
createListItem(container, key, value, isLink = true) {
const box = container.createEl("div", { cls: `list-item ${!isLink ? "list-item-header" : ""}` });
box.createEl("div", { text: key });
const linkBox = box.createEl("div");
if (isLink) {
linkBox.createEl("a", { text: value, href: value });
} else {
linkBox.createSpan({ text: value });
}
}
renderList(key = "") {
let options = this.options;
if (key) {
options = Object.keys(options).reduce((obj, item) => {
if (item.includes(key))
obj = __spreadProps(__spreadValues({}, obj), { [item]: options[item] });
return obj;
}, {});
}
const container = this.contentEl.createEl("div");
this.createListItem(container, "Name", "Url", false);
const listContainer = container.createEl("div", { cls: "list-container" });
const keys = Object.keys(options);
if (keys.length) {
keys.forEach((key2) => {
this.createListItem(listContainer, key2, options[key2]);
});
} else {
listContainer.createEl("div", { text: "No results!", cls: "list-empty" });
}
return container;
}
onOpen() {
const { contentEl } = this;
contentEl.createEl("h1", { text: "All Links", cls: "title" });
let contentBox = null;
new import_obsidian2.Setting(contentEl).setName("Search").addSearch((el) => {
el.setPlaceholder("Input the link name...").onChange((val) => {
contentBox.empty();
contentBox = this.renderList(val);
});
});
contentBox = this.renderList();
}
onClose() {
this.contentEl.empty();
}
};
// settings.ts
var import_obsidian3 = __toModule(require("obsidian"));
var LinkKeeperSettingTab = class extends import_obsidian3.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
new import_obsidian3.Setting(containerEl).setName("Link Filepath").setDesc("The file where saves the links.").addText((text) => text.setPlaceholder("Enter the full filepath").setValue(this.plugin.settings.filepath).onChange((value) => __async(this, null, function* () {
this.plugin.settings.filepath = value;
yield this.plugin.saveSettings();
})));
}
};
// main.ts
var import_promises = __toModule(require("fs/promises"));
var DEFAULT_SETTINGS = {
filepath: `${process.env.HOME}/etl.json`
};
var LinkKeeperPlugin = class extends import_obsidian4.Plugin {
getLinks(cb) {
return __async(this, null, function* () {
try {
const data = yield (0, import_promises.readFile)(this.settings.filepath, { encoding: "utf-8" });
cb(JSON.parse(data || "{}"));
} catch (err) {
noticeHandler(err.message);
}
});
}
saveLink(data, message) {
return __async(this, null, function* () {
try {
yield (0, import_promises.writeFile)(this.settings.filepath, JSON.stringify(data));
noticeHandler(message);
} catch (err) {
noticeHandler(err.message);
}
});
}
onSubmit(name, url) {
this.getLinks((data) => __async(this, null, function* () {
if (Object.prototype.toString.call(data) === "[object Object]") {
this.saveLink(__spreadProps(__spreadValues({}, data), { [name]: url }), "Add Link successfully!");
} else {
noticeHandler("Data format error! It must be a json object.");
}
}));
}
onDelete(name) {
return __async(this, null, function* () {
yield this.getLinks((data) => __async(this, null, function* () {
delete data[name];
this.saveLink(data, `Link named ${name} has been deleted!`);
}));
});
}
initModal(type, options) {
switch (type) {
case "addLink":
return new AddLink(this.app, options.link, this.onSubmit.bind(this));
case "deleteLink":
return new DeleteLink(this.app, options, this.onDelete.bind(this));
case "listLink":
return new ListAllLinks(this.app, options);
default:
break;
}
}
onload() {
return __async(this, null, function* () {
yield this.loadSettings();
this.addSettingTab(new LinkKeeperSettingTab(this.app, this));
this.addRibbonIcon("link", "List all links", () => {
this.app.commands.executeCommandById("obsidian-link-keeper:list-links");
});
this.addCommand({
id: "add-link",
name: "Add link",
editorCallback: (editor) => {
const selection = editor.getSelection();
this.initModal("addLink", { link: selection }).open();
}
});
this.addCommand({
id: "delete-link",
name: "Delete link",
callback: () => {
this.getLinks((data) => __async(this, null, function* () {
this.initModal("deleteLink", Object.keys(data).reduce((obj, key) => __spreadProps(__spreadValues({}, obj), {
[key]: key
}), {})).open();
}));
}
});
this.addCommand({
id: "list-links",
name: "List links",
icon: "link",
callback: () => {
this.getLinks((data) => __async(this, null, function* () {
this.initModal("listLink", data).open();
}));
}
});
});
}
loadSettings() {
return __async(this, null, function* () {
this.settings = __spreadValues(__spreadValues({}, DEFAULT_SETTINGS), yield this.loadData());
});
}
saveSettings() {
return __async(this, null, function* () {
yield this.saveData(this.settings);
});
}
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJtb2RhbHMudHMiLCAidXRpbHMudHMiLCAic2V0dGluZ3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFBsdWdpbiwgRWRpdG9yIH0gZnJvbSBcIm9ic2lkaWFuXCJcclxuaW1wb3J0IHsgQWRkTGluaywgRGVsZXRlTGluaywgTGlzdEFsbExpbmtzIH0gZnJvbSBcIi4vbW9kYWxzXCJcclxuaW1wb3J0IHsgTGlua0tlZXBlclNldHRpbmdUYWIgfSBmcm9tICcuL3NldHRpbmdzJ1xyXG5pbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSAnZnMvcHJvbWlzZXMnXHJcbmltcG9ydCB7IG5vdGljZUhhbmRsZXIgfSBmcm9tICcuL3V0aWxzJ1xyXG5pbnRlcmZhY2UgTGlua0tlZXBlclNldHRpbmdzIHtcclxuICBmaWxlcGF0aDogc3RyaW5nXHJcbn1cclxuXHJcbmludGVyZmFjZSBPcHRpb25zIHtcclxuICBba2V5OiBzdHJpbmddOiBzdHJpbmdcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogUGFydGlhbDxMaW5rS2VlcGVyU2V0dGluZ3M+ID0ge1xyXG4gIGZpbGVwYXRoOiBgJHtwcm9jZXNzLmVudi5IT01FfS9ldGwuanNvbmBcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlua0tlZXBlclBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcbiAgc2V0dGluZ3M6IExpbmtLZWVwZXJTZXR0aW5nc1xyXG5cclxuICAvKipcclxuICAgKiBnZXQgYWxsIGxpbmtzXHJcbiAgICogQHBhcmFtIGNiIFxyXG4gICAqL1xyXG4gIGFzeW5jIGdldExpbmtzIChjYjogKGRhdGE6IE9wdGlvbnMpID0+IHZvaWQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZWFkRmlsZSh0aGlzLnNldHRpbmdzLmZpbGVwYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnfSlcclxuICAgICAgY2IoSlNPTi5wYXJzZShkYXRhIHx8ICd7fScpKVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIG5vdGljZUhhbmRsZXIoZXJyLm1lc3NhZ2UpXHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIHNhdmUgbGlua1xyXG4gICAqIEBwYXJhbSBkYXRhIFxyXG4gICAqIEBwYXJhbSBtZXNzYWdlIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNhdmVMaW5rIChkYXRhOiBPcHRpb25zLCBtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHdyaXRlRmlsZSh0aGlzLnNldHRpbmdzLmZpbGVwYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcclxuICAgICAgbm90aWNlSGFuZGxlcihtZXNzYWdlKVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIG5vdGljZUhhbmRsZXIoZXJyLm1lc3NhZ2UpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBhZGQgbGluayBzdWJtaXNzaW9uXHJcbiAgICogQHBhcmFtIG5hbWUgXHJcbiAgICogQHBhcmFtIHVybCBcclxuICAgKi9cclxuICBvblN1Ym1pdCAobmFtZTogc3RyaW5nLCB1cmw6IHN0cmluZykge1xyXG4gICAgdGhpcy5nZXRMaW5rcyhhc3luYyAoZGF0YTogT3B0aW9ucykgPT4ge1xyXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBPYmplY3RdJykge1xyXG4gICAgICAgIHRoaXMuc2F2ZUxpbmsoey4uLmRhdGEsIFtuYW1lXTogdXJsfSwgJ0FkZCBMaW5rIHN1Y2Nlc3NmdWxseSEnKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5vdGljZUhhbmRsZXIoJ0RhdGEgZm9ybWF0IGVycm9yISBJdCBtdXN0IGJlIGEganNvbiBvYmplY3QuJylcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGRlbGV0ZSBsaW5rIGJ5IG5hbWVcclxuICAgKiBAcGFyYW0gbmFtZSBcclxuICAgKi9cclxuICBhc3luYyBvbkRlbGV0ZSAobmFtZTogc3RyaW5nKSB7XHJcbiAgICBhd2FpdCB0aGlzLmdldExpbmtzKGFzeW5jIChkYXRhOiBPcHRpb25zKSA9PiB7XHJcbiAgICAgIGRlbGV0ZSBkYXRhW25hbWVdXHJcbiAgICAgIHRoaXMuc2F2ZUxpbmsoZGF0YSwgYExpbmsgbmFtZWQgJHtuYW1lfSBoYXMgYmVlbiBkZWxldGVkIWApXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogaW5pdCBtb2RhbFxyXG4gICAqIEBwYXJhbSB0eXBlIFxyXG4gICAqIEBwYXJhbSBvcHRpb25zIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGluaXRNb2RhbCAodHlwZTogc3RyaW5nLCBvcHRpb25zPzogT3B0aW9ucykge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2FkZExpbmsnOlxyXG4gICAgICAgIHJldHVybiBuZXcgQWRkTGluayh0aGlzLmFwcCwgb3B0aW9ucy5saW5rLCB0aGlzLm9uU3VibWl0LmJpbmQodGhpcykpXHJcblxyXG4gICAgICBjYXNlICdkZWxldGVMaW5rJzpcclxuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZUxpbmsodGhpcy5hcHAsIG9wdGlvbnMsIHRoaXMub25EZWxldGUuYmluZCh0aGlzKSlcclxuXHJcbiAgICAgIGNhc2UgJ2xpc3RMaW5rJzpcclxuICAgICAgICByZXR1cm4gbmV3IExpc3RBbGxMaW5rcyh0aGlzLmFwcCwgb3B0aW9ucylcclxuXHJcbiAgICAgIGRlZmF1bHQ6IGJyZWFrXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbmxvYWQoKSB7XHJcbiAgICAvLyBsb2FkIHNldHRpbmdzXHJcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpXHJcbiAgICAvLyBhZGQgc2V0dGluZyB0YWJcclxuICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgTGlua0tlZXBlclNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKVxyXG4gICAgLy8gYWRkIHJpYmJvbiBpY29uXHJcbiAgICB0aGlzLmFkZFJpYmJvbkljb24oXCJsaW5rXCIsIFwiTGlzdCBhbGwgbGlua3NcIiwgKCkgPT4ge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHRoaXMuYXBwLmNvbW1hbmRzLmV4ZWN1dGVDb21tYW5kQnlJZCgnb2JzaWRpYW4tbGluay1rZWVwZXI6bGlzdC1saW5rcycpXHJcbiAgICB9KTtcclxuICAgIC8vIGFkZCBjb21tYW5kXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJhZGQtbGlua1wiLFxyXG4gICAgICBuYW1lOiBcIkFkZCBsaW5rXCIsXHJcbiAgICAgIGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yOiBFZGl0b3IpID0+IHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uKClcclxuICAgICAgICB0aGlzLmluaXRNb2RhbCgnYWRkTGluaycsIHsgbGluazogc2VsZWN0aW9uIH0pLm9wZW4oKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcImRlbGV0ZS1saW5rXCIsXHJcbiAgICAgIG5hbWU6ICdEZWxldGUgbGluaycsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXRMaW5rcyhhc3luYyAoZGF0YTogT3B0aW9ucykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pbml0TW9kYWwoJ2RlbGV0ZUxpbmsnLCBPYmplY3Qua2V5cyhkYXRhKS5yZWR1Y2UoKG9iaiwga2V5KSA9PiAoe1xyXG4gICAgICAgICAgICAuLi5vYmosXHJcbiAgICAgICAgICAgIFtrZXldOiBrZXlcclxuICAgICAgICAgIH0pLCB7fSkpLm9wZW4oKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6ICdsaXN0LWxpbmtzJyxcclxuICAgICAgbmFtZTogJ0xpc3QgbGlua3MnLFxyXG4gICAgICBpY29uOiAnbGluaycsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXRMaW5rcyhhc3luYyAoZGF0YTogT3B0aW9ucykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pbml0TW9kYWwoJ2xpc3RMaW5rJywgZGF0YSkub3BlbigpXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGFzeW5jIGxvYWRTZXR0aW5ncyAoKSB7XHJcbiAgICB0aGlzLnNldHRpbmdzID0ge1xyXG4gICAgICAuLi5ERUZBVUxUX1NFVFRJTkdTLFxyXG4gICAgICAuLi5hd2FpdCB0aGlzLmxvYWREYXRhKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHNhdmVTZXR0aW5ncyAoKSB7XHJcbiAgICBhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpXHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyBBcHAsIE1vZGFsLCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCJcbmltcG9ydCB7IG5vdGljZUhhbmRsZXIgfSBmcm9tICcuL3V0aWxzJ1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIFtrZXk6IHN0cmluZ106IHN0cmluZ1xufVxuXG4vLyBhZGQgbGlua1xuZXhwb3J0IGNsYXNzIEFkZExpbmsgZXh0ZW5kcyBNb2RhbCB7XG4gIGxpbmtOYW1lOiBzdHJpbmdcbiAgbGlua1VybDogc3RyaW5nXG5cbiAgb25TdWJtaXQ6IChsaW5rTmFtZTogc3RyaW5nLCBsaW5rVXJsOiBzdHJpbmcpID0+IHZvaWRcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhcHA6IEFwcCxcbiAgICBsaW5rVXJsOiBzdHJpbmcsXG4gICAgb25TdWJtaXQ6IChsaW5rTmFtZTogc3RyaW5nLCBsaW5rVXJsOiBzdHJpbmcpID0+IHZvaWRcbiAgKSB7XG4gICAgc3VwZXIoYXBwKVxuICAgIHRoaXMubGlua05hbWUgPSAnJ1xuICAgIHRoaXMubGlua1VybCA9IGxpbmtVcmxcbiAgICB0aGlzLm9uU3VibWl0ID0gb25TdWJtaXRcbiAgfVxuXG4gIG9uT3BlbiAoKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXNcblxuICAgIGNvbnRlbnRFbC5jcmVhdGVFbChcImgxXCIsIHsgdGV4dDogXCJBZGQgTGlua1wiLCBjbHM6IFwidGl0bGVcIiB9KVxuXG4gICAgbmV3IFNldHRpbmcoY29udGVudEVsKS5zZXROYW1lKFwiTGluayBuYW1lXCIpLmFkZFRleHQodGV4dCA9PiBcbiAgICAgIHRleHQuc2V0VmFsdWUodGhpcy5saW5rTmFtZSkuc2V0UGxhY2Vob2xkZXIoJ25hbWUnKS5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5saW5rTmFtZSA9IHZhbHVlXG4gICAgICB9KVxuICAgIClcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRlbnRFbCkuc2V0TmFtZShcIkxpbmsgdXJsXCIpLmFkZFRleHQodGV4dCA9PlxuICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLmxpbmtVcmwpLnNldFBsYWNlaG9sZGVyKCd1cmwnKS5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5saW5rVXJsID0gdmFsdWVcbiAgICAgIH0pXG4gICAgKVxuXG4gICAgbmV3IFNldHRpbmcoY29udGVudEVsKS5hZGRCdXR0b24oKGJ0bikgPT5cbiAgICAgIGJ0blxuICAgICAgICAuc2V0QnV0dG9uVGV4dCgnQWRkJylcbiAgICAgICAgLnNldEN0YSgpXG4gICAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGxpbmtOYW1lLCBsaW5rVXJsIH0gPSB0aGlzXG4gICAgICAgICAgaWYgKCEobGlua05hbWUudHJpbSgpKSkge1xuICAgICAgICAgICAgbm90aWNlSGFuZGxlcignTGluayBuYW1lIGlzIHJlcXVpcmVkIScpXG4gICAgICAgICAgfSBlbHNlIGlmICghKGxpbmtVcmwudHJpbSgpKSkge1xuICAgICAgICAgICAgbm90aWNlSGFuZGxlcignTGluayB1cmwgaXMgcmVxdWlyZWQhJylcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpXG4gICAgICAgICAgICB0aGlzLm9uU3VibWl0KHRoaXMubGlua05hbWUsIHRoaXMubGlua1VybClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpXG4gIH1cbn1cblxuLy8gZGVsZXRlIGxpbmtcbmV4cG9ydCBjbGFzcyBEZWxldGVMaW5rIGV4dGVuZHMgTW9kYWwge1xuICBsaW5rTmFtZTogc3RyaW5nXG4gIG9wdGlvbnM6IE9wdGlvbnNcblxuICBvbkRlbGV0ZTogKGxpbmtOYW1lOiBzdHJpbmcpID0+IHZvaWRcblxuICBjb25zdHJ1Y3RvciAoXG4gICAgYXBwOiBBcHAsXG4gICAgb3B0aW9uczogT3B0aW9ucyxcbiAgICBvbkRlbGV0ZTogKGxpbmtOYW1lOiBzdHJpbmcpID0+IHZvaWRcbiAgKSB7XG4gICAgc3VwZXIoYXBwKVxuICAgIHRoaXMub25EZWxldGUgPSBvbkRlbGV0ZVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxpbmtOYW1lID0gT2JqZWN0LmtleXMob3B0aW9ucylbMF0gfHwgJydcbiAgfVxuXG4gIG9uT3BlbiAoKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXNcblxuICAgIGNvbnRlbnRFbC5jcmVhdGVFbChcImgxXCIsIHsgdGV4dDogXCJEZWxldGUgTGlua1wiLCBjbHM6IFwidGl0bGVcIiB9KVxuXG4gICAgbmV3IFNldHRpbmcoY29udGVudEVsKS5zZXROYW1lKFwiTGluayBuYW1lXCIpLmFkZERyb3Bkb3duKGRwID0+IFxuICAgICAgZHAuYWRkT3B0aW9ucyh0aGlzLm9wdGlvbnMpLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgdGhpcy5saW5rTmFtZSA9IHZhbHVlXG4gICAgICB9KVxuICAgIClcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRlbnRFbCkuYWRkQnV0dG9uKChidG4pID0+XG4gICAgICBidG5cbiAgICAgICAgLnNldEJ1dHRvblRleHQoJ0RlbGV0ZScpXG4gICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBsaW5rTmFtZSB9ID0gdGhpc1xuICAgICAgICAgIGlmICghbGlua05hbWUpIHtcbiAgICAgICAgICAgIG5vdGljZUhhbmRsZXIoJ0xpbmsgbmFtZSBpcyByZXF1aXJlZCEnKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgICAgICAgIHRoaXMub25EZWxldGUodGhpcy5saW5rTmFtZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpXG4gIH1cbn1cblxuLy8gbGlzdCBhbGwgbGlua3NcbmV4cG9ydCBjbGFzcyBMaXN0QWxsTGlua3MgZXh0ZW5kcyBNb2RhbCB7XG4gIG9wdGlvbnM6IE9wdGlvbnNcblxuICBjb25zdHJ1Y3RvciAoXG4gICAgYXBwOiBBcHAsXG4gICAgb3B0aW9uczogT3B0aW9uc1xuICApIHtcbiAgICBzdXBlcihhcHApXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBsaXN0IGl0ZW1cbiAgICogQHBhcmFtIGNvbnRhaW5lciBsaXN0IGNvbnRhaW5lclxuICAgKiBAcGFyYW0ga2V5IGxpbmsgbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgbGluayB1cmxcbiAgICogQHBhcmFtIGlzTGluayBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBhIGxpbmtcbiAgICovXG4gIGNyZWF0ZUxpc3RJdGVtIChjb250YWluZXI6IEVsZW1lbnQsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBpc0xpbmsgPSB0cnVlKSB7XG4gICAgY29uc3QgYm94ID0gY29udGFpbmVyLmNyZWF0ZUVsKFwiZGl2XCIsIHsgY2xzOiBgbGlzdC1pdGVtICR7IWlzTGluayA/ICdsaXN0LWl0ZW0taGVhZGVyJyA6ICcnfWB9KVxuICAgIGJveC5jcmVhdGVFbChcImRpdlwiLCB7IHRleHQ6IGtleSB9KVxuICAgIGNvbnN0IGxpbmtCb3ggPSBib3guY3JlYXRlRWwoXCJkaXZcIilcbiAgICBpZiAoaXNMaW5rKSB7XG4gICAgICBsaW5rQm94LmNyZWF0ZUVsKCdhJywgeyB0ZXh0OiB2YWx1ZSwgaHJlZjogdmFsdWV9KVxuICAgIH0gZWxzZSB7XG4gICAgICBsaW5rQm94LmNyZWF0ZVNwYW4oeyB0ZXh0OiB2YWx1ZSB9KVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlckxpc3QgKGtleSA9ICcnKTogRWxlbWVudCB7XG4gICAgbGV0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcbiAgICAvLyBmaWx0ZXIgb3B0aW9uc1xuICAgIGlmIChrZXkpIHtcbiAgICAgIG9wdGlvbnMgPSBPYmplY3Qua2V5cyhvcHRpb25zKS5yZWR1Y2UoKG9iajogT3B0aW9ucywgaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5pbmNsdWRlcyhrZXkpKSBvYmogPSB7IC4uLm9iaiwgW2l0ZW1dOiBvcHRpb25zW2l0ZW1dIH1cbiAgICAgICAgcmV0dXJuIG9ialxuICAgICAgfSwge30pXG4gICAgfVxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGVudEVsLmNyZWF0ZUVsKFwiZGl2XCIpXG4gICAgdGhpcy5jcmVhdGVMaXN0SXRlbShjb250YWluZXIsICdOYW1lJywgJ1VybCcsIGZhbHNlKVxuXG4gICAgY29uc3QgbGlzdENvbnRhaW5lciA9IGNvbnRhaW5lci5jcmVhdGVFbCgnZGl2JywgeyBjbHM6ICdsaXN0LWNvbnRhaW5lcid9KVxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKVxuICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHRoaXMuY3JlYXRlTGlzdEl0ZW0obGlzdENvbnRhaW5lciwga2V5LCBvcHRpb25zW2tleV0pXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0Q29udGFpbmVyLmNyZWF0ZUVsKCdkaXYnLCB7IHRleHQ6ICdObyByZXN1bHRzIScsIGNsczogJ2xpc3QtZW1wdHknIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRhaW5lclxuICB9XG5cbiAgb25PcGVuKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzXG5cbiAgICBjb250ZW50RWwuY3JlYXRlRWwoXCJoMVwiLCB7IHRleHQ6IFwiQWxsIExpbmtzXCIsIGNsczogXCJ0aXRsZVwiIH0pXG5cbiAgICBsZXQgY29udGVudEJveDogRWxlbWVudCA9IG51bGxcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRlbnRFbCkuc2V0TmFtZSgnU2VhcmNoJykuYWRkU2VhcmNoKGVsID0+IHtcbiAgICAgIGVsLnNldFBsYWNlaG9sZGVyKCdJbnB1dCB0aGUgbGluayBuYW1lLi4uJykub25DaGFuZ2UodmFsID0+IHtcbiAgICAgICAgY29udGVudEJveC5lbXB0eSgpXG4gICAgICAgIGNvbnRlbnRCb3ggPSB0aGlzLnJlbmRlckxpc3QodmFsKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgY29udGVudEJveCA9IHRoaXMucmVuZGVyTGlzdCgpXG4gIH1cblxuICBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY29udGVudEVsLmVtcHR5KClcbiAgfVxufSIsICJpbXBvcnQgeyBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbidcblxuZXhwb3J0IGNvbnN0IG5vdGljZUhhbmRsZXIgPSAobXNnOiBzdHJpbmcpID0+IG5ldyBOb3RpY2UobXNnKSBcbiIsICJpbXBvcnQgTGlua0tlZXBlciBmcm9tICcuL21haW4nXG5cbmltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJ1xuXG5leHBvcnQgY2xhc3MgTGlua0tlZXBlclNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcGx1Z2luOiBMaW5rS2VlcGVyXG5cbiAgY29uc3RydWN0b3IgKGFwcDogQXBwLCBwbHVnaW46IExpbmtLZWVwZXIpIHtcbiAgICBzdXBlciAoYXBwLCBwbHVnaW4pXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW5cbiAgfVxuXG4gIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpc1xuXG4gICAgY29udGFpbmVyRWwuZW1wdHkoKVxuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZShcIkxpbmsgRmlsZXBhdGhcIilcbiAgICAgIC5zZXREZXNjKFwiVGhlIGZpbGUgd2hlcmUgc2F2ZXMgdGhlIGxpbmtzLlwiKVxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgIHRleHRcbiAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJFbnRlciB0aGUgZnVsbCBmaWxlcGF0aFwiKVxuICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5maWxlcGF0aClcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5maWxlcGF0aCA9IHZhbHVlXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxuICAgICAgICAgIH0pXG4gICAgICApXG4gIH1cbn0iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7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