sliftutils 0.10.0 → 0.12.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/.gitignore +38 -0
- package/assets/icon128.png +0 -0
- package/assets/icon16.png +0 -0
- package/assets/icon48.png +0 -0
- package/build-electron/assets/icon128.png +0 -0
- package/build-electron/assets/icon16.png +0 -0
- package/build-electron/assets/icon48.png +0 -0
- package/build-electron/electron/electronIndex.html +12 -0
- package/build-electron/electronMain.js +5185 -0
- package/build-electron/electronRenderer.js +20852 -0
- package/build-extension/assets/icon128.png +0 -0
- package/build-extension/assets/icon16.png +0 -0
- package/build-extension/assets/icon48.png +0 -0
- package/build-extension/extBackground.js +5246 -0
- package/build-extension/extContentScript.js +5243 -0
- package/build-extension/manifest.json +29 -0
- package/build-nodejs/server.js +198610 -0
- package/build-web/assets/icon128.png +0 -0
- package/build-web/assets/icon16.png +0 -0
- package/build-web/assets/icon48.png +0 -0
- package/build-web/browser.js +199266 -0
- package/build-web/web/index.html +32 -0
- package/builders/dist/electronBuild.ts.cache +105 -0
- package/builders/dist/extensionBuild.ts.cache +146 -0
- package/builders/dist/generateIndexDts.ts.cache +74 -0
- package/builders/dist/hotReload.ts.cache +93 -0
- package/builders/dist/nodeJSBuild.ts.cache +29 -0
- package/builders/dist/watch.ts.cache +163 -0
- package/builders/dist/webBuild.ts.cache +81 -0
- package/builders/generateIndexDts.ts +1 -1
- package/bundler/dist/bundleEntry.ts.cache +48 -0
- package/bundler/dist/bundleEntryCaller.ts.cache +18 -0
- package/bundler/dist/bundleRequire.ts.cache +246 -0
- package/bundler/dist/bundleWrapper.ts.cache +101 -0
- package/bundler/dist/bundler.ts.cache +66 -0
- package/bundler/dist/sourceMaps.ts.cache +210 -0
- package/dist/electronMain.ts.cache +27 -0
- package/dist/electronRenderer.tsx.cache +62 -0
- package/electron/dist/electronMain.ts.cache +26 -0
- package/electron/dist/electronRenderer.tsx.cache +64 -0
- package/extension/dist/extBackground.ts.cache +20 -0
- package/extension/dist/extContentScript.ts.cache +17 -0
- package/index.d.ts +478 -0
- package/misc/dist/environment.ts.cache +50 -0
- package/misc/dist/fs.ts.cache +29 -0
- package/nodejs/dist/exampleFile.ts.cache +11 -0
- package/nodejs/dist/server.ts.cache +15 -0
- package/package.json +5 -1
- package/render-utils/dist/observer.tsx.cache +33 -0
- package/storage/CachedStorage.d.ts +2 -0
- package/storage/DelayedStorage.d.ts +14 -0
- package/storage/DiskCollection.d.ts +99 -0
- package/storage/FileFolderAPI.d.ts +71 -0
- package/storage/IStorage.d.ts +38 -0
- package/storage/IndexedDBFileFolderAPI.d.ts +6 -0
- package/storage/JSONStorage.d.ts +16 -0
- package/storage/PendingManager.d.ts +6 -0
- package/storage/PendingStorage.d.ts +18 -0
- package/storage/PrivateFileSystemStorage.d.ts +23 -0
- package/storage/StorageObservable.d.ts +32 -0
- package/storage/TransactionStorage.d.ts +46 -0
- package/storage/dist/CachedStorage.ts.cache +31 -0
- package/storage/dist/DelayedStorage.ts.cache +35 -0
- package/storage/dist/DiskCollection.ts.cache +241 -0
- package/storage/dist/FileFolderAPI.tsx.cache +345 -0
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +142 -0
- package/storage/dist/JSONStorage.ts.cache +38 -0
- package/storage/dist/PendingManager.tsx.cache +73 -0
- package/storage/dist/PendingStorage.ts.cache +49 -0
- package/storage/dist/PrivateFileSystemStorage.ts.cache +178 -0
- package/storage/dist/StorageObservable.ts.cache +120 -0
- package/storage/dist/TransactionStorage.ts.cache +421 -0
- package/storage/dist/fileSystemPointer.ts.cache +77 -0
- package/storage/fileSystemPointer.d.ts +11 -0
- package/tsconfig.declarations.json +3 -1
- package/web/dist/browser.tsx.cache +66 -0
- package/yarn.lock +1752 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
|
+
//exports.newFileStorageJSONSyncer = exports.newFileStorageBufferSyncer = exports.DiskCollectionRawBrowser = exports.DiskCollectionRaw = exports.DiskCollectionPromise = exports.DiskCollectionBrowser = exports.DiskCollection = void 0;
|
|
4
|
+
const typesafecss_1 = require("typesafecss");
|
|
5
|
+
const DelayedStorage_1 = require("./DelayedStorage");
|
|
6
|
+
const FileFolderAPI_1 = require("./FileFolderAPI");
|
|
7
|
+
const JSONStorage_1 = require("./JSONStorage");
|
|
8
|
+
const StorageObservable_1 = require("./StorageObservable");
|
|
9
|
+
const TransactionStorage_1 = require("./TransactionStorage");
|
|
10
|
+
const PendingStorage_1 = require("./PendingStorage");
|
|
11
|
+
const types_1 = require("../misc/types");
|
|
12
|
+
const PrivateFileSystemStorage_1 = require("./PrivateFileSystemStorage");
|
|
13
|
+
const context_1 = require("../../context");
|
|
14
|
+
class DiskCollection {
|
|
15
|
+
constructor(collectionName, writeDelay) {
|
|
16
|
+
this.collectionName = collectionName;
|
|
17
|
+
this.writeDelay = writeDelay;
|
|
18
|
+
this.baseStorage = this.initStorage();
|
|
19
|
+
this.synced = new StorageObservable_1.StorageSync(new PendingStorage_1.PendingStorage(`Collection (${this.collectionName})`, new DelayedStorage_1.DelayedStorage(this.baseStorage)));
|
|
20
|
+
}
|
|
21
|
+
async initStorage() {
|
|
22
|
+
// If a Chrome extension, just return null.
|
|
23
|
+
if ((0, context_1.isInChromeExtension)())
|
|
24
|
+
return null;
|
|
25
|
+
let fileStorage = await (0, FileFolderAPI_1.getFileStorage)();
|
|
26
|
+
let collections = await fileStorage.folder.getStorage("collections");
|
|
27
|
+
let curCollection = await collections.folder.getStorage(this.collectionName);
|
|
28
|
+
let baseStorage = new TransactionStorage_1.TransactionStorage(curCollection, this.collectionName, this.writeDelay);
|
|
29
|
+
this.transactionStorage = baseStorage;
|
|
30
|
+
return new JSONStorage_1.JSONStorage(baseStorage);
|
|
31
|
+
}
|
|
32
|
+
get(key) {
|
|
33
|
+
return this.synced.get(key);
|
|
34
|
+
}
|
|
35
|
+
async getPromise(key) {
|
|
36
|
+
let base = await this.baseStorage;
|
|
37
|
+
return base.get(key);
|
|
38
|
+
}
|
|
39
|
+
set(key, value) {
|
|
40
|
+
this.synced.set(key, value);
|
|
41
|
+
}
|
|
42
|
+
remove(key) {
|
|
43
|
+
this.synced.remove(key);
|
|
44
|
+
}
|
|
45
|
+
getKeys() {
|
|
46
|
+
return this.synced.getKeys();
|
|
47
|
+
}
|
|
48
|
+
getKeysPromise() {
|
|
49
|
+
return this.synced.getKeysPromise();
|
|
50
|
+
}
|
|
51
|
+
getEntries() {
|
|
52
|
+
let keys = this.getKeys();
|
|
53
|
+
return keys.map(key => [key, this.get(key)]).filter(([_, value]) => (0, types_1.isDefined)(value));
|
|
54
|
+
}
|
|
55
|
+
getValues() {
|
|
56
|
+
let keys = this.getKeys();
|
|
57
|
+
return keys.map(key => this.get(key)).filter(types_1.isDefined);
|
|
58
|
+
}
|
|
59
|
+
async getValuesPromise() {
|
|
60
|
+
let keys = await this.getKeysPromise();
|
|
61
|
+
let values = [];
|
|
62
|
+
for (let key of keys) {
|
|
63
|
+
let value = await this.getPromise(key);
|
|
64
|
+
if ((0, types_1.isDefined)(value)) {
|
|
65
|
+
values.push(value);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return values;
|
|
69
|
+
}
|
|
70
|
+
getInfo(key) {
|
|
71
|
+
return this.synced.getInfo(key);
|
|
72
|
+
}
|
|
73
|
+
async reset() {
|
|
74
|
+
await this.synced.reset();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.DiskCollection = DiskCollection;
|
|
78
|
+
class DiskCollectionBrowser {
|
|
79
|
+
constructor(collectionName, writeDelay) {
|
|
80
|
+
this.collectionName = collectionName;
|
|
81
|
+
this.writeDelay = writeDelay;
|
|
82
|
+
this.baseStorage = this.initStorage();
|
|
83
|
+
this.synced = new StorageObservable_1.StorageSync(new PendingStorage_1.PendingStorage(`Collection (${this.collectionName})`, new DelayedStorage_1.DelayedStorage(this.baseStorage)));
|
|
84
|
+
}
|
|
85
|
+
async initStorage() {
|
|
86
|
+
if ((0, typesafecss_1.isNode)())
|
|
87
|
+
return undefined;
|
|
88
|
+
let curCollection = await new PrivateFileSystemStorage_1.PrivateFileSystemStorage(`collections/${this.collectionName}`);
|
|
89
|
+
let baseStorage = new TransactionStorage_1.TransactionStorage(curCollection, this.collectionName);
|
|
90
|
+
return new JSONStorage_1.JSONStorage(baseStorage);
|
|
91
|
+
}
|
|
92
|
+
get(key) {
|
|
93
|
+
return this.synced.get(key);
|
|
94
|
+
}
|
|
95
|
+
async getPromise(key) {
|
|
96
|
+
let base = await this.baseStorage;
|
|
97
|
+
return base.get(key);
|
|
98
|
+
}
|
|
99
|
+
set(key, value) {
|
|
100
|
+
this.synced.set(key, value);
|
|
101
|
+
}
|
|
102
|
+
remove(key) {
|
|
103
|
+
this.synced.remove(key);
|
|
104
|
+
}
|
|
105
|
+
getKeys() {
|
|
106
|
+
return this.synced.getKeys();
|
|
107
|
+
}
|
|
108
|
+
getKeysPromise() {
|
|
109
|
+
return this.synced.getKeysPromise();
|
|
110
|
+
}
|
|
111
|
+
getEntries() {
|
|
112
|
+
let keys = this.getKeys();
|
|
113
|
+
return keys.map(key => [key, this.get(key)]).filter(([_, value]) => (0, types_1.isDefined)(value));
|
|
114
|
+
}
|
|
115
|
+
getValues() {
|
|
116
|
+
let keys = this.getKeys();
|
|
117
|
+
return keys.map(key => this.get(key)).filter(types_1.isDefined);
|
|
118
|
+
}
|
|
119
|
+
async getValuesPromise() {
|
|
120
|
+
let keys = await this.getKeysPromise();
|
|
121
|
+
let values = [];
|
|
122
|
+
for (let key of keys) {
|
|
123
|
+
let value = await this.getPromise(key);
|
|
124
|
+
if ((0, types_1.isDefined)(value)) {
|
|
125
|
+
values.push(value);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return values;
|
|
129
|
+
}
|
|
130
|
+
getInfo(key) {
|
|
131
|
+
return this.synced.getInfo(key);
|
|
132
|
+
}
|
|
133
|
+
async reset() {
|
|
134
|
+
await this.synced.reset();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.DiskCollectionBrowser = DiskCollectionBrowser;
|
|
138
|
+
class DiskCollectionPromise {
|
|
139
|
+
constructor(collectionName, writeDelay) {
|
|
140
|
+
this.collectionName = collectionName;
|
|
141
|
+
this.writeDelay = writeDelay;
|
|
142
|
+
this.synced = (new PendingStorage_1.PendingStorage(`Collection (${this.collectionName})`, new DelayedStorage_1.DelayedStorage(this.initStorage())));
|
|
143
|
+
}
|
|
144
|
+
async initStorage() {
|
|
145
|
+
let fileStorage = await (0, FileFolderAPI_1.getFileStorage)();
|
|
146
|
+
let collections = await fileStorage.folder.getStorage("collections");
|
|
147
|
+
let curCollection = await collections.folder.getStorage(this.collectionName);
|
|
148
|
+
let baseStorage = new TransactionStorage_1.TransactionStorage(curCollection, this.collectionName, this.writeDelay);
|
|
149
|
+
return new JSONStorage_1.JSONStorage(baseStorage);
|
|
150
|
+
}
|
|
151
|
+
async get(key) {
|
|
152
|
+
return await this.synced.get(key);
|
|
153
|
+
}
|
|
154
|
+
async set(key, value) {
|
|
155
|
+
await this.synced.set(key, value);
|
|
156
|
+
}
|
|
157
|
+
async remove(key) {
|
|
158
|
+
await this.synced.remove(key);
|
|
159
|
+
}
|
|
160
|
+
async getKeys() {
|
|
161
|
+
return await this.synced.getKeys();
|
|
162
|
+
}
|
|
163
|
+
async getInfo(key) {
|
|
164
|
+
return await this.synced.getInfo(key);
|
|
165
|
+
}
|
|
166
|
+
async reset() {
|
|
167
|
+
await this.synced.reset();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.DiskCollectionPromise = DiskCollectionPromise;
|
|
171
|
+
class DiskCollectionRaw {
|
|
172
|
+
constructor(collectionName) {
|
|
173
|
+
this.collectionName = collectionName;
|
|
174
|
+
this.synced = (new PendingStorage_1.PendingStorage(`Collection (${this.collectionName})`, new DelayedStorage_1.DelayedStorage(this.initStorage())));
|
|
175
|
+
}
|
|
176
|
+
async initStorage() {
|
|
177
|
+
let fileStorage = await (0, FileFolderAPI_1.getFileStorage)();
|
|
178
|
+
let collections = await fileStorage.folder.getStorage("collections");
|
|
179
|
+
let baseStorage = await collections.folder.getStorage(this.collectionName);
|
|
180
|
+
return baseStorage;
|
|
181
|
+
}
|
|
182
|
+
async get(key) {
|
|
183
|
+
return await this.synced.get(key);
|
|
184
|
+
}
|
|
185
|
+
async set(key, value) {
|
|
186
|
+
await this.synced.set(key, value);
|
|
187
|
+
}
|
|
188
|
+
async remove(key) {
|
|
189
|
+
await this.synced.remove(key);
|
|
190
|
+
}
|
|
191
|
+
async getKeys() {
|
|
192
|
+
return await this.synced.getKeys();
|
|
193
|
+
}
|
|
194
|
+
async getInfo(key) {
|
|
195
|
+
return await this.synced.getInfo(key);
|
|
196
|
+
}
|
|
197
|
+
async reset() {
|
|
198
|
+
await this.synced.reset();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.DiskCollectionRaw = DiskCollectionRaw;
|
|
202
|
+
class DiskCollectionRawBrowser {
|
|
203
|
+
constructor(collectionName) {
|
|
204
|
+
this.collectionName = collectionName;
|
|
205
|
+
this.synced = new StorageObservable_1.StorageSync(new PendingStorage_1.PendingStorage(`Collection (${this.collectionName})`, new DelayedStorage_1.DelayedStorage(this.initStorage())));
|
|
206
|
+
}
|
|
207
|
+
async initStorage() {
|
|
208
|
+
return await new PrivateFileSystemStorage_1.PrivateFileSystemStorage(`collections/${this.collectionName}`);
|
|
209
|
+
}
|
|
210
|
+
get(key) {
|
|
211
|
+
return this.synced.get(key);
|
|
212
|
+
}
|
|
213
|
+
async getPromise(key) {
|
|
214
|
+
return await this.synced.get(key);
|
|
215
|
+
}
|
|
216
|
+
set(key, value) {
|
|
217
|
+
this.synced.set(key, value);
|
|
218
|
+
}
|
|
219
|
+
async getKeys() {
|
|
220
|
+
return await this.synced.getKeys();
|
|
221
|
+
}
|
|
222
|
+
async getInfo(key) {
|
|
223
|
+
return await this.synced.getInfo(key);
|
|
224
|
+
}
|
|
225
|
+
async reset() {
|
|
226
|
+
await this.synced.reset();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
exports.DiskCollectionRawBrowser = DiskCollectionRawBrowser;
|
|
230
|
+
function newFileStorageBufferSyncer(folder = "") {
|
|
231
|
+
let base = new PendingStorage_1.PendingStorage(`FileStorageBufferSyncer`, new DelayedStorage_1.DelayedStorage((0, FileFolderAPI_1.getFileStorageNested)(folder)));
|
|
232
|
+
return new StorageObservable_1.StorageSync(base);
|
|
233
|
+
}
|
|
234
|
+
exports.newFileStorageBufferSyncer = newFileStorageBufferSyncer;
|
|
235
|
+
function newFileStorageJSONSyncer(folder = "") {
|
|
236
|
+
let base = new PendingStorage_1.PendingStorage(`FileStorageJSONSyncer`, new DelayedStorage_1.DelayedStorage((0, FileFolderAPI_1.getFileStorageNested)(folder)));
|
|
237
|
+
return new StorageObservable_1.StorageSync(new JSONStorage_1.JSONStorage(base));
|
|
238
|
+
}
|
|
239
|
+
exports.newFileStorageJSONSyncer = newFileStorageJSONSyncer;
|
|
240
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlza0NvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJEaXNrQ29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBcUM7QUFDckMscURBQWtEO0FBQ2xELG1EQUFvRjtBQUVwRiwrQ0FBNEM7QUFDNUMsMkRBQWtEO0FBQ2xELDZEQUEwRDtBQUMxRCxxREFBa0Q7QUFFbEQseUNBQTBDO0FBQzFDLHlFQUFzRTtBQUN0RSwyQ0FBb0Q7QUFFcEQsTUFBYSxjQUFjO0lBQ3ZCLFlBQ1ksY0FBc0IsRUFDdEIsVUFBbUI7UUFEbkIsbUJBQWMsR0FBZCxjQUFjLENBQVE7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBUztRQWN4QixnQkFBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxXQUFNLEdBQUcsSUFBSSwrQkFBVyxDQUM1QixJQUFJLCtCQUFjLENBQUMsZUFBZSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQ3BELElBQUksK0JBQWMsQ0FBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQzFDLENBQ0osQ0FBQztJQWpCRixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDYiw0Q0FBNEM7UUFDNUMsSUFBSSxJQUFBLDZCQUFtQixHQUFFO1lBQUUsT0FBTyxJQUFXLENBQUM7UUFDOUMsSUFBSSxXQUFXLEdBQUcsTUFBTSxJQUFBLDhCQUFjLEdBQUUsQ0FBQztRQUN6QyxJQUFJLFdBQVcsR0FBRyxNQUFNLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JFLElBQUksYUFBYSxHQUFHLE1BQU0sV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzdFLElBQUksV0FBVyxHQUFHLElBQUksdUNBQWtCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FB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QUFDLENBQUM7QUFDckQsQ0FBQztBQUxELDREQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSBcInR5cGVzYWZlY3NzXCI7XG5pbXBvcnQgeyBEZWxheWVkU3RvcmFnZSB9IGZyb20gXCIuL0RlbGF5ZWRTdG9yYWdlXCI7XG5pbXBvcnQgeyBGaWxlU3RvcmFnZSwgZ2V0RmlsZVN0b3JhZ2UsIGdldEZpbGVTdG9yYWdlTmVzdGVkIH0gZnJvbSBcIi4vRmlsZUZvbGRlckFQSVwiO1xuaW1wb3J0IHsgSVN0b3JhZ2UsIElTdG9yYWdlU3luYyB9IGZyb20gXCIuL0lTdG9yYWdlXCI7XG5pbXBvcnQgeyBKU09OU3RvcmFnZSB9IGZyb20gXCIuL0pTT05TdG9yYWdlXCI7XG5pbXBvcnQgeyBTdG9yYWdlU3luYyB9IGZyb20gXCIuL1N0b3JhZ2VPYnNlcnZhYmxlXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0b3JhZ2UgfSBmcm9tIFwiLi9UcmFuc2FjdGlvblN0b3JhZ2VcIjtcbmltcG9ydCB7IFBlbmRpbmdTdG9yYWdlIH0gZnJvbSBcIi4vUGVuZGluZ1N0b3JhZ2VcIjtcbmltcG9ydCB7IG9ic2VydmFibGUgfSBmcm9tIFwiLi4vbWlzYy9tb2J4VHlwZWRcIjtcbmltcG9ydCB7IGlzRGVmaW5lZCB9IGZyb20gXCIuLi9taXNjL3R5cGVzXCI7XG5pbXBvcnQgeyBQcml2YXRlRmlsZVN5c3RlbVN0b3JhZ2UgfSBmcm9tIFwiLi9Qcml2YXRlRmlsZVN5c3RlbVN0b3JhZ2VcIjtcbmltcG9ydCB7IGlzSW5DaHJvbWVFeHRlbnNpb24gfSBmcm9tIFwiLi4vLi4vY29udGV4dFwiO1xuXG5leHBvcnQgY2xhc3MgRGlza0NvbGxlY3Rpb248VD4gaW1wbGVtZW50cyBJU3RvcmFnZVN5bmM8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgd3JpdGVEZWxheT86IG51bWJlcixcbiAgICApIHtcbiAgICB9XG4gICAgcHVibGljIHRyYW5zYWN0aW9uU3RvcmFnZTogVHJhbnNhY3Rpb25TdG9yYWdlIHwgdW5kZWZpbmVkO1xuICAgIGFzeW5jIGluaXRTdG9yYWdlKCk6IFByb21pc2U8SVN0b3JhZ2U8VD4+IHtcbiAgICAgICAgLy8gSWYgYSBDaHJvbWUgZXh0ZW5zaW9uLCBqdXN0IHJldHVybiBudWxsLiBcbiAgICAgICAgaWYgKGlzSW5DaHJvbWVFeHRlbnNpb24oKSkgcmV0dXJuIG51bGwgYXMgYW55O1xuICAgICAgICBsZXQgZmlsZVN0b3JhZ2UgPSBhd2FpdCBnZXRGaWxlU3RvcmFnZSgpO1xuICAgICAgICBsZXQgY29sbGVjdGlvbnMgPSBhd2FpdCBmaWxlU3RvcmFnZS5mb2xkZXIuZ2V0U3RvcmFnZShcImNvbGxlY3Rpb25zXCIpO1xuICAgICAgICBsZXQgY3VyQ29sbGVjdGlvbiA9IGF3YWl0IGNvbGxlY3Rpb25zLmZvbGRlci5nZXRTdG9yYWdlKHRoaXMuY29sbGVjdGlvbk5hbWUpO1xuICAgICAgICBsZXQgYmFzZVN0b3JhZ2UgPSBuZXcgVHJhbnNhY3Rpb25TdG9yYWdlKGN1ckNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbk5hbWUsIHRoaXMud3JpdGVEZWxheSk7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25TdG9yYWdlID0gYmFzZVN0b3JhZ2U7XG4gICAgICAgIHJldHVybiBuZXcgSlNPTlN0b3JhZ2U8VD4oYmFzZVN0b3JhZ2UpO1xuICAgIH1cbiAgICBwdWJsaWMgYmFzZVN0b3JhZ2UgPSB0aGlzLmluaXRTdG9yYWdlKCk7XG4gICAgcHJpdmF0ZSBzeW5jZWQgPSBuZXcgU3RvcmFnZVN5bmMoXG4gICAgICAgIG5ldyBQZW5kaW5nU3RvcmFnZShgQ29sbGVjdGlvbiAoJHt0aGlzLmNvbGxlY3Rpb25OYW1lfSlgLFxuICAgICAgICAgICAgbmV3IERlbGF5ZWRTdG9yYWdlPFQ+KHRoaXMuYmFzZVN0b3JhZ2UpXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZWQuZ2V0KGtleSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRQcm9taXNlKGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBiYXNlID0gYXdhaXQgdGhpcy5iYXNlU3RvcmFnZTtcbiAgICAgICAgcmV0dXJuIGJhc2UuZ2V0KGtleSk7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3luY2VkLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgcHVibGljIHJlbW92ZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnN5bmNlZC5yZW1vdmUoa2V5KTtcbiAgICB9XG4gICAgcHVibGljIGdldEtleXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZWQuZ2V0S2V5cygpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0S2V5c1Byb21pc2UoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZWQuZ2V0S2V5c1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW50cmllcygpOiBbc3RyaW5nLCBUXVtdIHtcbiAgICAgICAgbGV0IGtleXMgPSB0aGlzLmdldEtleXMoKTtcbiAgICAgICAgcmV0dXJuIGtleXMubWFwKGtleSA9PiBba2V5LCB0aGlzLmdldChrZXkpXSkuZmlsdGVyKChbXywgdmFsdWVdKSA9PiBpc0RlZmluZWQodmFsdWUpKSBhcyBbc3RyaW5nLCBUXVtdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VmFsdWVzKCk6IFRbXSB7XG4gICAgICAgIGxldCBrZXlzID0gdGhpcy5nZXRLZXlzKCk7XG4gICAgICAgIHJldHVybiBrZXlzLm1hcChrZXkgPT4gdGhpcy5nZXQoa2V5KSkuZmlsdGVyKGlzRGVmaW5lZCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRWYWx1ZXNQcm9taXNlKCk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBrZXlzID0gYXdhaXQgdGhpcy5nZXRLZXlzUHJvbWlzZSgpO1xuICAgICAgICBsZXQgdmFsdWVzOiBUW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGF3YWl0IHRoaXMuZ2V0UHJvbWlzZShrZXkpO1xuICAgICAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG4gICAgcHVibGljIGdldEluZm8oa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY2VkLmdldEluZm8oa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVzZXQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luY2VkLnJlc2V0KCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlza0NvbGxlY3Rpb25Ccm93c2VyPFQ+IGltcGxlbWVudHMgSVN0b3JhZ2VTeW5jPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjb2xsZWN0aW9uTmFtZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIHdyaXRlRGVsYXk/OiBudW1iZXIsXG4gICAgKSB7XG4gICAgfVxuICAgIHB1YmxpYyB0cmFuc2FjdGlvblN0b3JhZ2U6IFRyYW5zYWN0aW9uU3RvcmFnZSB8IHVuZGVmaW5lZDtcbiAgICBhc3luYyBpbml0U3RvcmFnZSgpOiBQcm9taXNlPElTdG9yYWdlPFQ+PiB7XG4gICAgICAgIGlmIChpc05vZGUoKSkgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgICAgIGxldCBjdXJDb2xsZWN0aW9uID0gYXdhaXQgbmV3IFByaXZhdGVGaWxlU3lzdGVtU3RvcmFnZShgY29sbGVjdGlvbnMvJHt0aGlzLmNvbGxlY3Rpb25OYW1lfWApO1xuICAgICAgICBsZXQgYmFzZVN0b3JhZ2UgPSBuZXcgVHJhbnNhY3Rpb25TdG9yYWdlKGN1ckNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbk5hbWUpO1xuICAgICAgICByZXR1cm4gbmV3IEpTT05TdG9yYWdlPFQ+KGJhc2VTdG9yYWdlKTtcbiAgICB9XG4gICAgcHVibGljIGJhc2VTdG9yYWdlID0gdGhpcy5pbml0U3RvcmFnZSgpO1xuICAgIHByaXZhdGUgc3luY2VkID0gbmV3IFN0b3JhZ2VTeW5jKFxuICAgICAgICBuZXcgUGVuZGluZ1N0b3JhZ2UoYENvbGxlY3Rpb24gKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0pYCxcbiAgICAgICAgICAgIG5ldyBEZWxheWVkU3RvcmFnZTxUPih0aGlzLmJhc2VTdG9yYWdlKVxuICAgICAgICApXG4gICAgKTtcblxuICAgIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY2VkLmdldChrZXkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0UHJvbWlzZShrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgYmFzZSA9IGF3YWl0IHRoaXMuYmFzZVN0b3JhZ2U7XG4gICAgICAgIHJldHVybiBiYXNlLmdldChrZXkpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN5bmNlZC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyByZW1vdmUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zeW5jZWQucmVtb3ZlKGtleSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY2VkLmdldEtleXMoKTtcbiAgICB9XG4gICAgcHVibGljIGdldEtleXNQcm9taXNlKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY2VkLmdldEtleXNQcm9taXNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEVudHJpZXMoKTogW3N0cmluZywgVF1bXSB7XG4gICAgICAgIGxldCBrZXlzID0gdGhpcy5nZXRLZXlzKCk7XG4gICAgICAgIHJldHVybiBrZXlzLm1hcChrZXkgPT4gW2tleSwgdGhpcy5nZXQoa2V5KV0pLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gaXNEZWZpbmVkKHZhbHVlKSkgYXMgW3N0cmluZywgVF1bXTtcbiAgICB9XG4gICAgcHVibGljIGdldFZhbHVlcygpOiBUW10ge1xuICAgICAgICBsZXQga2V5cyA9IHRoaXMuZ2V0S2V5cygpO1xuICAgICAgICByZXR1cm4ga2V5cy5tYXAoa2V5ID0+IHRoaXMuZ2V0KGtleSkpLmZpbHRlcihpc0RlZmluZWQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VmFsdWVzUHJvbWlzZSgpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQga2V5cyA9IGF3YWl0IHRoaXMuZ2V0S2V5c1Byb21pc2UoKTtcbiAgICAgICAgbGV0IHZhbHVlczogVFtdID0gW107XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhd2FpdCB0aGlzLmdldFByb21pc2Uoa2V5KTtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRJbmZvKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlZC5nZXRJbmZvKGtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlc2V0KCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmNlZC5yZXNldCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc2tDb2xsZWN0aW9uUHJvbWlzZTxUPiBpbXBsZW1lbnRzIElTdG9yYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjb2xsZWN0aW9uTmFtZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIHdyaXRlRGVsYXk/OiBudW1iZXIsXG4gICAgKSB7IH1cbiAgICBhc3luYyBpbml0U3RvcmFnZSgpOiBQcm9taXNlPElTdG9yYWdlPFQ+PiB7XG4gICAgICAgIGxldCBmaWxlU3RvcmFnZSA9IGF3YWl0IGdldEZpbGVTdG9yYWdlKCk7XG4gICAgICAgIGxldCBjb2xsZWN0aW9ucyA9IGF3YWl0IGZpbGVTdG9yYWdlLmZvbGRlci5nZXRTdG9yYWdlKFwiY29sbGVjdGlvbnNcIik7XG4gICAgICAgIGxldCBjdXJDb2xsZWN0aW9uID0gYXdhaXQgY29sbGVjdGlvbnMuZm9sZGVyLmdldFN0b3JhZ2UodGhpcy5jb2xsZWN0aW9uTmFtZSk7XG4gICAgICAgIGxldCBiYXNlU3RvcmFnZSA9IG5ldyBUcmFuc2FjdGlvblN0b3JhZ2UoY3VyQ29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uTmFtZSwgdGhpcy53cml0ZURlbGF5KTtcbiAgICAgICAgcmV0dXJuIG5ldyBKU09OU3RvcmFnZTxUPihiYXNlU3RvcmFnZSk7XG4gICAgfVxuICAgIHByaXZhdGUgc3luY2VkID0gKFxuICAgICAgICBuZXcgUGVuZGluZ1N0b3JhZ2UoYENvbGxlY3Rpb24gKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0pYCxcbiAgICAgICAgICAgIG5ldyBEZWxheWVkU3RvcmFnZTxUPih0aGlzLmluaXRTdG9yYWdlKCkpXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zeW5jZWQuZ2V0KGtleSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luY2VkLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbW92ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmNlZC5yZW1vdmUoa2V5KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zeW5jZWQuZ2V0S2V5cygpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zeW5jZWQuZ2V0SW5mbyhrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXNldCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jZWQucmVzZXQoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNrQ29sbGVjdGlvblJhdyBpbXBsZW1lbnRzIElTdG9yYWdlPEJ1ZmZlcj4ge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29sbGVjdGlvbk5hbWU6IHN0cmluZykgeyB9XG4gICAgYXN5bmMgaW5pdFN0b3JhZ2UoKTogUHJvbWlzZTxJU3RvcmFnZTxCdWZmZXI+PiB7XG4gICAgICAgIGxldCBmaWxlU3RvcmFnZSA9IGF3YWl0IGdldEZpbGVTdG9yYWdlKCk7XG4gICAgICAgIGxldCBjb2xsZWN0aW9ucyA9IGF3YWl0IGZpbGVTdG9yYWdlLmZvbGRlci5nZXRTdG9yYWdlKFwiY29sbGVjdGlvbnNcIik7XG4gICAgICAgIGxldCBiYXNlU3RvcmFnZSA9IGF3YWl0IGNvbGxlY3Rpb25zLmZvbGRlci5nZXRTdG9yYWdlKHRoaXMuY29sbGVjdGlvbk5hbWUpO1xuICAgICAgICByZXR1cm4gYmFzZVN0b3JhZ2U7XG4gICAgfVxuICAgIHByaXZhdGUgc3luY2VkID0gKFxuICAgICAgICBuZXcgUGVuZGluZ1N0b3JhZ2UoYENvbGxlY3Rpb24gKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0pYCxcbiAgICAgICAgICAgIG5ldyBEZWxheWVkU3RvcmFnZSh0aGlzLmluaXRTdG9yYWdlKCkpXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN5bmNlZC5nZXQoa2V5KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmNlZC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jZWQucmVtb3ZlKGtleSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3luY2VkLmdldEtleXMoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3luY2VkLmdldEluZm8oa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVzZXQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luY2VkLnJlc2V0KCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlza0NvbGxlY3Rpb25SYXdCcm93c2VyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcpIHsgfVxuICAgIGFzeW5jIGluaXRTdG9yYWdlKCk6IFByb21pc2U8SVN0b3JhZ2U8QnVmZmVyPj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByaXZhdGVGaWxlU3lzdGVtU3RvcmFnZShgY29sbGVjdGlvbnMvJHt0aGlzLmNvbGxlY3Rpb25OYW1lfWApO1xuICAgIH1cbiAgICBwcml2YXRlIHN5bmNlZCA9IG5ldyBTdG9yYWdlU3luYyhcbiAgICAgICAgbmV3IFBlbmRpbmdTdG9yYWdlKGBDb2xsZWN0aW9uICgke3RoaXMuY29sbGVjdGlvbk5hbWV9KWAsXG4gICAgICAgICAgICBuZXcgRGVsYXllZFN0b3JhZ2UodGhpcy5pbml0U3RvcmFnZSgpKVxuICAgICAgICApXG4gICAgKTtcblxuICAgIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBCdWZmZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZWQuZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFByb21pc2Uoa2V5OiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zeW5jZWQuZ2V0KGtleSk7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpIHtcbiAgICAgICAgdGhpcy5zeW5jZWQuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0S2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN5bmNlZC5nZXRLZXlzKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN5bmNlZC5nZXRJbmZvKGtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlc2V0KCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmNlZC5yZXNldCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0ZpbGVTdG9yYWdlQnVmZmVyU3luY2VyKGZvbGRlciA9IFwiXCIpIHtcbiAgICBsZXQgYmFzZSA9IG5ldyBQZW5kaW5nU3RvcmFnZShgRmlsZVN0b3JhZ2VCdWZmZXJTeW5jZXJgLFxuICAgICAgICBuZXcgRGVsYXllZFN0b3JhZ2UoZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQoZm9sZGVyKSlcbiAgICApO1xuICAgIHJldHVybiBuZXcgU3RvcmFnZVN5bmMoYmFzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdGaWxlU3RvcmFnZUpTT05TeW5jZXI8VD4oZm9sZGVyID0gXCJcIikge1xuICAgIGxldCBiYXNlID0gbmV3IFBlbmRpbmdTdG9yYWdlKGBGaWxlU3RvcmFnZUpTT05TeW5jZXJgLFxuICAgICAgICBuZXcgRGVsYXllZFN0b3JhZ2UoZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQoZm9sZGVyKSlcbiAgICApO1xuICAgIHJldHVybiBuZXcgU3RvcmFnZVN5bmMobmV3IEpTT05TdG9yYWdlPFQ+KGJhc2UpKTtcbn0iXX0=
|
|
241
|
+
/* _JS_SOURCE_HASH = "9040948c89cb52116d4a857fc8dc90924b8e12c2aeb4e436d3dfd0091470df55"; */
|