@dcl/sdk 7.0.6-4197661608.commit-41efaad → 7.0.6-4217957637.commit-a393ef7

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.
Files changed (88) hide show
  1. package/package.json +6 -33
  2. package/cli/commands/build/helpers.d.ts +0 -21
  3. package/cli/commands/build/helpers.js +0 -50
  4. package/cli/commands/build/helpers.ts +0 -89
  5. package/cli/commands/build/index.d.ts +0 -19
  6. package/cli/commands/build/index.js +0 -69
  7. package/cli/commands/build/index.ts +0 -91
  8. package/cli/commands/init/index.d.ts +0 -17
  9. package/cli/commands/init/index.js +0 -53
  10. package/cli/commands/init/index.ts +0 -69
  11. package/cli/commands/init/repos.d.ts +0 -9
  12. package/cli/commands/init/repos.js +0 -12
  13. package/cli/commands/init/repos.ts +0 -17
  14. package/cli/commands/preview/bff.d.ts +0 -3
  15. package/cli/commands/preview/bff.js +0 -54
  16. package/cli/commands/preview/bff.ts +0 -63
  17. package/cli/commands/preview/catalyst.d.ts +0 -5
  18. package/cli/commands/preview/catalyst.js +0 -24
  19. package/cli/commands/preview/catalyst.ts +0 -31
  20. package/cli/commands/preview/coordinates.d.ts +0 -20
  21. package/cli/commands/preview/coordinates.js +0 -90
  22. package/cli/commands/preview/coordinates.ts +0 -146
  23. package/cli/commands/preview/endpoints.d.ts +0 -10
  24. package/cli/commands/preview/endpoints.js +0 -485
  25. package/cli/commands/preview/endpoints.ts +0 -578
  26. package/cli/commands/preview/eth.d.ts +0 -2
  27. package/cli/commands/preview/eth.js +0 -6
  28. package/cli/commands/preview/eth.ts +0 -3
  29. package/cli/commands/preview/index.d.ts +0 -20
  30. package/cli/commands/preview/index.js +0 -71
  31. package/cli/commands/preview/index.ts +0 -91
  32. package/cli/commands/preview/port.d.ts +0 -1
  33. package/cli/commands/preview/port.js +0 -21
  34. package/cli/commands/preview/port.ts +0 -15
  35. package/cli/commands/preview/project.d.ts +0 -14
  36. package/cli/commands/preview/project.js +0 -77
  37. package/cli/commands/preview/project.ts +0 -112
  38. package/cli/commands/preview/types.d.ts +0 -18
  39. package/cli/commands/preview/types.js +0 -3
  40. package/cli/commands/preview/types.ts +0 -26
  41. package/cli/commands/preview/wire.d.ts +0 -2
  42. package/cli/commands/preview/wire.js +0 -92
  43. package/cli/commands/preview/wire.ts +0 -107
  44. package/cli/commands/preview/ws.d.ts +0 -7
  45. package/cli/commands/preview/ws.js +0 -16
  46. package/cli/commands/preview/ws.ts +0 -24
  47. package/cli/commands/start/index.d.ts +0 -29
  48. package/cli/commands/start/index.js +0 -126
  49. package/cli/commands/start/index.ts +0 -145
  50. package/cli/components/fetch.d.ts +0 -5
  51. package/cli/components/fetch.js +0 -34
  52. package/cli/components/fetch.ts +0 -11
  53. package/cli/components/fs.d.ts +0 -11
  54. package/cli/components/fs.js +0 -60
  55. package/cli/components/fs.ts +0 -53
  56. package/cli/components/index.d.ts +0 -7
  57. package/cli/components/index.js +0 -13
  58. package/cli/components/index.ts +0 -14
  59. package/cli/index.d.ts +0 -7
  60. package/cli/index.js +0 -76
  61. package/cli/index.ts +0 -85
  62. package/cli/utils/args.d.ts +0 -10
  63. package/cli/utils/args.js +0 -16
  64. package/cli/utils/args.ts +0 -18
  65. package/cli/utils/commands.d.ts +0 -3
  66. package/cli/utils/commands.js +0 -24
  67. package/cli/utils/commands.ts +0 -28
  68. package/cli/utils/error.d.ts +0 -2
  69. package/cli/utils/error.js +0 -7
  70. package/cli/utils/error.ts +0 -1
  71. package/cli/utils/exec.d.ts +0 -8
  72. package/cli/utils/exec.js +0 -32
  73. package/cli/utils/exec.ts +0 -42
  74. package/cli/utils/fs.d.ts +0 -10
  75. package/cli/utils/fs.js +0 -26
  76. package/cli/utils/fs.ts +0 -41
  77. package/cli/utils/log.d.ts +0 -5
  78. package/cli/utils/log.js +0 -29
  79. package/cli/utils/log.ts +0 -39
  80. package/cli/utils/object.d.ts +0 -9
  81. package/cli/utils/object.js +0 -45
  82. package/cli/utils/object.ts +0 -62
  83. package/cli/utils/out-messages.d.ts +0 -1
  84. package/cli/utils/out-messages.js +0 -8
  85. package/cli/utils/out-messages.ts +0 -3
  86. package/cli/utils/prompt.d.ts +0 -1
  87. package/cli/utils/prompt.js +0 -17
  88. package/cli/utils/prompt.ts +0 -11
@@ -1,485 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.getFilesFromFolder = exports.setupEcs6Endpoints = void 0;
30
- const path = __importStar(require("path"));
31
- const fs = __importStar(require("fs"));
32
- const glob_1 = require("glob");
33
- const sdk_1 = require("@dcl/schemas/dist/sdk");
34
- const schemas_1 = require("@dcl/schemas");
35
- const ignore_1 = __importDefault(require("ignore"));
36
- const node_fetch_1 = __importStar(require("node-fetch"));
37
- const catalyst_1 = require("./catalyst");
38
- function getCatalystUrl() {
39
- return new URL('https://peer.decentraland.org');
40
- }
41
- function smartWearableNameToId(name) {
42
- return name.toLocaleLowerCase().replace(/ /g, '-');
43
- }
44
- function setupEcs6Endpoints(dir, router) {
45
- const baseFolders = [dir];
46
- router.get('/scene.json', async () => {
47
- return {
48
- headers: { 'content-type': 'application/json' },
49
- body: fs.createReadStream(path.join(dir, 'scene.json'))
50
- };
51
- });
52
- router.get('/lambdas/explore/realms', async (ctx) => {
53
- return {
54
- body: [
55
- {
56
- serverName: 'localhost',
57
- url: `http://${ctx.url.host}`,
58
- layer: 'stub',
59
- usersCount: 0,
60
- maxUsers: 100,
61
- userParcels: []
62
- }
63
- ]
64
- };
65
- });
66
- router.get('/lambdas/contracts/servers', async (ctx) => {
67
- return {
68
- body: [
69
- {
70
- address: `http://${ctx.url.host}`,
71
- owner: '0x0000000000000000000000000000000000000000',
72
- id: '0x0000000000000000000000000000000000000000000000000000000000000000'
73
- }
74
- ]
75
- };
76
- });
77
- router.get('/lambdas/profiles', async (ctx, next) => {
78
- const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
79
- try {
80
- const previewWearables = getAllPreviewWearables({
81
- baseFolders,
82
- baseUrl
83
- }).map((wearable) => wearable.id);
84
- if (previewWearables.length === 1) {
85
- const catalystUrl = getCatalystUrl();
86
- const u = new URL(ctx.url.toString());
87
- u.host = catalystUrl.host;
88
- u.protocol = catalystUrl.protocol;
89
- u.port = catalystUrl.port;
90
- const req = await (0, node_fetch_1.default)(u.toString(), {
91
- headers: {
92
- connection: 'close'
93
- },
94
- method: ctx.request.method,
95
- body: ctx.request.method === 'get' ? undefined : ctx.request.body
96
- });
97
- const deployedProfile = (await req.json());
98
- if ((deployedProfile === null || deployedProfile === void 0 ? void 0 : deployedProfile.length) === 1) {
99
- deployedProfile[0].avatars[0].avatar.wearables.push(...previewWearables);
100
- return {
101
- headers: {
102
- 'content-type': req.headers.get('content-type') || 'application/binary'
103
- },
104
- body: deployedProfile
105
- };
106
- }
107
- }
108
- }
109
- catch (err) {
110
- console.warn(`Failed to catch profile and fill with preview wearables.`, err);
111
- }
112
- return next();
113
- });
114
- router.all('/lambdas/:path+', async (ctx) => {
115
- const catalystUrl = getCatalystUrl();
116
- const u = new URL(ctx.url.toString());
117
- u.host = catalystUrl.host;
118
- u.protocol = catalystUrl.protocol;
119
- u.port = catalystUrl.port;
120
- const req = await (0, node_fetch_1.default)(u.toString(), {
121
- headers: {
122
- connection: 'close'
123
- },
124
- method: ctx.request.method,
125
- body: ctx.request.method === 'get' ? undefined : ctx.request.body
126
- });
127
- return {
128
- headers: {
129
- 'content-type': req.headers.get('content-type') || 'application/binary'
130
- },
131
- body: req.body
132
- };
133
- });
134
- router.post('/content/entities', async (ctx) => {
135
- const catalystUrl = getCatalystUrl();
136
- const headers = new node_fetch_1.Headers();
137
- console.log(ctx.request.headers);
138
- const res = await (0, node_fetch_1.default)(`${catalystUrl.toString()}/content/entities`, {
139
- method: 'post',
140
- headers,
141
- body: ctx.request.body
142
- });
143
- return res;
144
- });
145
- serveStatic(dir, router);
146
- serveFolders(router, baseFolders);
147
- }
148
- exports.setupEcs6Endpoints = setupEcs6Endpoints;
149
- function serveFolders(router, baseFolders) {
150
- router.get('/content/contents/:hash', async (ctx, next) => {
151
- if (ctx.params.hash && ctx.params.hash.startsWith('b64-')) {
152
- const fullPath = path.resolve(Buffer.from(ctx.params.hash.replace(/^b64-/, ''), 'base64').toString('utf8'));
153
- if (!baseFolders.find((folder) => fullPath.startsWith(folder))) {
154
- return next();
155
- }
156
- return {
157
- headers: {
158
- 'x-timestamp': Date.now(),
159
- 'x-sent': true,
160
- 'cache-control': 'no-cache,private,max-age=1'
161
- },
162
- body: fs.createReadStream(fullPath)
163
- };
164
- }
165
- return next();
166
- });
167
- async function pointerRequestHandler(pointers) {
168
- if (!pointers || pointers.length === 0) {
169
- return [];
170
- }
171
- const requestedPointers = new Set(pointers && typeof pointers === 'string' ? [pointers] : pointers);
172
- const resultEntities = getSceneJson({
173
- baseFolders,
174
- pointers: Array.from(requestedPointers)
175
- });
176
- const catalystUrl = getCatalystUrl();
177
- const remote = (0, catalyst_1.fetchEntityByPointer)(catalystUrl.toString(), pointers.filter(($) => !$.match(/-?\d+,-?\d+/)));
178
- const serverEntities = Array.isArray(remote) ? remote : [];
179
- return [...resultEntities, ...serverEntities];
180
- }
181
- router.get('/content/entities/scene', async (ctx) => {
182
- return {
183
- body: await pointerRequestHandler(ctx.url.searchParams.getAll('pointer'))
184
- };
185
- });
186
- router.post('/content/entities/active', async (ctx) => {
187
- const body = await ctx.request.json();
188
- return {
189
- body: await pointerRequestHandler(body.pointers)
190
- };
191
- });
192
- router.get('/preview-wearables/:id', async (ctx) => {
193
- const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
194
- const wearables = getAllPreviewWearables({
195
- baseUrl,
196
- baseFolders
197
- });
198
- const wearableId = ctx.params.id;
199
- return {
200
- body: {
201
- ok: true,
202
- data: wearables.filter((wearable) => smartWearableNameToId(wearable === null || wearable === void 0 ? void 0 : wearable.name) === wearableId)
203
- }
204
- };
205
- });
206
- router.get('/preview-wearables', async (ctx) => {
207
- const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
208
- return {
209
- body: {
210
- ok: true,
211
- data: getAllPreviewWearables({ baseUrl, baseFolders })
212
- }
213
- };
214
- });
215
- }
216
- const defaultHashMaker = (str) => 'b64-' + Buffer.from(str).toString('base64');
217
- function getAllPreviewWearables({ baseFolders, baseUrl }) {
218
- const wearablePathArray = [];
219
- for (const wearableDir of baseFolders) {
220
- const wearableJsonPath = path.resolve(wearableDir, 'wearable.json');
221
- if (fs.existsSync(wearableJsonPath)) {
222
- wearablePathArray.push(wearableJsonPath);
223
- }
224
- }
225
- const ret = [];
226
- for (const wearableJsonPath of wearablePathArray) {
227
- try {
228
- ret.push(serveWearable({ wearableJsonPath, baseUrl }));
229
- }
230
- catch (err) {
231
- console.error(`Couldn't mock the wearable ${wearableJsonPath}. Please verify the correct format and scheme.`, err);
232
- }
233
- }
234
- return ret;
235
- }
236
- function serveWearable({ wearableJsonPath, baseUrl }) {
237
- var _a;
238
- const wearableDir = path.dirname(wearableJsonPath);
239
- const wearableJson = JSON.parse(fs.readFileSync(wearableJsonPath).toString());
240
- if (!sdk_1.WearableJson.validate(wearableJson)) {
241
- const errors = (sdk_1.WearableJson.validate.errors || []).map((a) => `${a.data} ${a.message}`).join('');
242
- console.error(`Unable to validate wearable.json properly, please check it.`, errors);
243
- throw new Error(`Invalid wearable.json (${wearableJsonPath})`);
244
- }
245
- const dclIgnorePath = path.resolve(wearableDir, '.dclignore');
246
- let ignoreFileContent = '';
247
- if (fs.existsSync(dclIgnorePath)) {
248
- ignoreFileContent = fs.readFileSync(path.resolve(wearableDir, '.dclignore'), 'utf-8');
249
- }
250
- const hashedFiles = getFilesFromFolder({
251
- folder: wearableDir,
252
- addOriginalPath: false,
253
- ignorePattern: ignoreFileContent
254
- });
255
- const thumbnailFiltered = hashedFiles.filter(($) => ($ === null || $ === void 0 ? void 0 : $.file) === 'thumbnail.png');
256
- const thumbnail = thumbnailFiltered.length > 0 && ((_a = thumbnailFiltered[0]) === null || _a === void 0 ? void 0 : _a.hash) && `${baseUrl}/${thumbnailFiltered[0].hash}`;
257
- const wearableId = 'urn:8dc2d7ad-97e3-44d0-ba89-e8305d795a6a';
258
- const representations = wearableJson.data.representations.map((representation) => (Object.assign(Object.assign({}, representation), { mainFile: `male/${representation.mainFile}`, contents: hashedFiles.map(($) => ({
259
- key: `male/${$ === null || $ === void 0 ? void 0 : $.file}`,
260
- url: `${baseUrl}/${$ === null || $ === void 0 ? void 0 : $.hash}`,
261
- hash: $ === null || $ === void 0 ? void 0 : $.hash
262
- })) })));
263
- return {
264
- id: wearableId,
265
- rarity: wearableJson.rarity,
266
- i18n: [{ code: 'en', text: wearableJson.name }],
267
- description: wearableJson.description,
268
- thumbnail: thumbnail || '',
269
- baseUrl: `${baseUrl}/`,
270
- name: wearableJson.name || '',
271
- data: {
272
- category: wearableJson.data.category,
273
- replaces: [],
274
- hides: [],
275
- tags: [],
276
- scene: hashedFiles,
277
- representations: representations
278
- }
279
- };
280
- }
281
- function getSceneJson({ baseFolders, pointers, customHashMaker }) {
282
- const requestedPointers = new Set(pointers);
283
- const resultEntities = [];
284
- const allDeployments = baseFolders.map((folder) => {
285
- const dclIgnorePath = path.resolve(folder, '.dclignore');
286
- let ignoreFileContent = '';
287
- if (fs.existsSync(dclIgnorePath)) {
288
- ignoreFileContent = fs.readFileSync(path.resolve(folder, '.dclignore'), 'utf-8');
289
- }
290
- return entityV3FromFolder({
291
- folder,
292
- addOriginalPath: false,
293
- ignorePattern: ignoreFileContent,
294
- customHashMaker
295
- });
296
- });
297
- for (const pointer of Array.from(requestedPointers)) {
298
- const theDeployment = allDeployments.find(($) => $ && $.pointers.includes(pointer));
299
- if (theDeployment) {
300
- theDeployment.pointers.forEach(($) => requestedPointers.delete($));
301
- resultEntities.push(theDeployment);
302
- }
303
- }
304
- return resultEntities;
305
- }
306
- function serveStatic(dir, router) {
307
- const sdkPath = path.dirname(require.resolve('@dcl/sdk/package.json', {
308
- paths: [dir]
309
- }));
310
- const dclExplorerJsonPath = path.dirname(require.resolve('@dcl/explorer/package.json', {
311
- paths: [dir, sdkPath]
312
- }));
313
- const dclKernelDefaultProfilePath = path.resolve(dclExplorerJsonPath, 'default-profile');
314
- const dclKernelImagesDecentralandConnect = path.resolve(dclExplorerJsonPath, 'images', 'decentraland-connect');
315
- const routes = [
316
- {
317
- route: '/',
318
- path: path.resolve(dclExplorerJsonPath, 'preview.html'),
319
- type: 'text/html'
320
- },
321
- {
322
- route: '/favicon.ico',
323
- path: path.resolve(dclExplorerJsonPath, 'favicon.ico'),
324
- type: 'text/html'
325
- },
326
- {
327
- route: '/@/explorer/index.js',
328
- path: path.resolve(dclExplorerJsonPath, 'index.js'),
329
- type: 'text/javascript'
330
- }
331
- ];
332
- for (const route of routes) {
333
- router.get(route.route, async (_ctx) => {
334
- return {
335
- headers: { 'Content-Type': route.type },
336
- body: fs.createReadStream(route.path)
337
- };
338
- });
339
- }
340
- function createStaticRoutes(route, folder, transform = (str) => str) {
341
- router.get(route, async (ctx, next) => {
342
- const file = ctx.params.path;
343
- const fullPath = path.resolve(folder, transform(file));
344
- if (!fs.existsSync(fullPath)) {
345
- return next();
346
- }
347
- const headers = {
348
- 'x-timestamp': Date.now(),
349
- 'x-sent': true,
350
- 'cache-control': 'no-cache,private,max-age=1'
351
- };
352
- if (fullPath.endsWith('.wasm')) {
353
- headers['content-type'] = 'application/wasm';
354
- }
355
- return {
356
- headers,
357
- body: fs.createReadStream(fullPath)
358
- };
359
- });
360
- }
361
- createStaticRoutes('/images/decentraland-connect/:path+', dclKernelImagesDecentralandConnect);
362
- createStaticRoutes('/default-profile/:path+', dclKernelDefaultProfilePath);
363
- createStaticRoutes('/@/explorer/:path+', dclExplorerJsonPath, (filePath) => filePath.replace(/.br+$/, ''));
364
- router.get('/feature-flags/:file', async (ctx) => {
365
- const res = await (0, node_fetch_1.default)(`https://feature-flags.decentraland.zone/${ctx.params.file}`, {
366
- headers: {
367
- connection: 'close'
368
- }
369
- });
370
- return {
371
- body: await res.arrayBuffer()
372
- };
373
- });
374
- }
375
- function entityV3FromFolder({ folder, addOriginalPath, ignorePattern, customHashMaker }) {
376
- const sceneJsonPath = path.resolve(folder, './scene.json');
377
- let isParcelScene = true;
378
- const wearableJsonPath = path.resolve(folder, './wearable.json');
379
- if (fs.existsSync(wearableJsonPath)) {
380
- try {
381
- const wearableJson = JSON.parse(fs.readFileSync(wearableJsonPath).toString());
382
- if (!sdk_1.WearableJson.validate(wearableJson)) {
383
- const errors = (sdk_1.WearableJson.validate.errors || []).map((a) => `${a.data} ${a.message}`).join('');
384
- console.error(`Unable to validate wearable.json properly, please check it.`, errors);
385
- console.error(`Invalid wearable.json (${wearableJsonPath})`);
386
- }
387
- else {
388
- isParcelScene = false;
389
- }
390
- }
391
- catch (err) {
392
- console.error(`Unable to load wearable.json properly`, err);
393
- }
394
- }
395
- const hashMaker = customHashMaker ? customHashMaker : defaultHashMaker;
396
- if (fs.existsSync(sceneJsonPath) && isParcelScene) {
397
- const sceneJson = JSON.parse(fs.readFileSync(sceneJsonPath).toString());
398
- const { base, parcels } = sceneJson.scene;
399
- const pointers = new Set();
400
- pointers.add(base);
401
- parcels.forEach(($) => pointers.add($));
402
- const mappedFiles = getFilesFromFolder({
403
- folder,
404
- addOriginalPath,
405
- ignorePattern,
406
- customHashMaker
407
- });
408
- return {
409
- version: 'v3',
410
- type: schemas_1.EntityType.SCENE,
411
- id: hashMaker(folder),
412
- pointers: Array.from(pointers),
413
- timestamp: Date.now(),
414
- metadata: sceneJson,
415
- content: mappedFiles
416
- };
417
- }
418
- return null;
419
- }
420
- const defaultDclIgnore = () => [
421
- '.*',
422
- 'package.json',
423
- 'package-lock.json',
424
- 'yarn-lock.json',
425
- 'build.json',
426
- 'export',
427
- 'tsconfig.json',
428
- 'tslint.json',
429
- 'node_modules',
430
- '*.ts',
431
- '*.tsx',
432
- 'Dockerfile',
433
- 'dist',
434
- 'README.md',
435
- '*.blend',
436
- '*.fbx',
437
- '*.zip',
438
- '*.rar'
439
- ].join('\n');
440
- function getFilesFromFolder({ folder, addOriginalPath, ignorePattern, customHashMaker }) {
441
- const hashMaker = customHashMaker ? customHashMaker : defaultHashMaker;
442
- const allFiles = (0, glob_1.sync)('**/*', {
443
- cwd: folder,
444
- dot: false,
445
- absolute: true
446
- })
447
- .map((file) => {
448
- try {
449
- if (!fs.statSync(file).isFile())
450
- return;
451
- }
452
- catch (err) {
453
- return;
454
- }
455
- const _folder = folder.replace(/\\/gi, '/');
456
- const key = file.replace(_folder, '').replace(/^\/+/, '');
457
- return key;
458
- })
459
- .filter(($) => !!$);
460
- const ensureIgnorePattern = ignorePattern && ignorePattern !== '' ? ignorePattern : defaultDclIgnore();
461
- const ig = (0, ignore_1.default)().add(ensureIgnorePattern);
462
- const filteredFiles = ig.filter(allFiles);
463
- const ret = [];
464
- for (const file of filteredFiles) {
465
- const absolutePath = path.resolve(folder, file);
466
- try {
467
- if (!fs.statSync(absolutePath).isFile())
468
- continue;
469
- }
470
- catch (err) {
471
- console.log(err);
472
- continue;
473
- }
474
- const absoluteFolder = folder.replace(/\\/gi, '/');
475
- const relativeFilePathToFolder = file.replace(absoluteFolder, '').replace(/^\/+/, '');
476
- ret.push({
477
- file: relativeFilePathToFolder.toLowerCase(),
478
- original_path: addOriginalPath ? absolutePath : undefined,
479
- hash: hashMaker(absolutePath)
480
- });
481
- }
482
- return ret;
483
- }
484
- exports.getFilesFromFolder = getFilesFromFolder;
485
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZW5kcG9pbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsMkNBQTRCO0FBQzVCLHVDQUF3QjtBQUN4QiwrQkFBdUM7QUFDdkMsK0NBQW9EO0FBQ3BELDBDQUFpRTtBQUNqRSxvREFBMkI7QUFDM0IseURBQTJDO0FBQzNDLHlDQUFpRDtBQUVqRCxTQUFTLGNBQWM7SUFDckIsT0FBTyxJQUFJLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO0FBQ2pELENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLElBQVk7SUFDekMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQ3BELENBQUM7QUFFRCxTQUFnQixrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsTUFBaUM7SUFDL0UsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUV6QixNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuQyxPQUFPO1lBQ0wsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1lBQy9DLElBQUksRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDeEQsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbEQsT0FBTztZQUNMLElBQUksRUFBRTtnQkFDSjtvQkFDRSxVQUFVLEVBQUUsV0FBVztvQkFDdkIsR0FBRyxFQUFFLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7b0JBQzdCLEtBQUssRUFBRSxNQUFN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bnRzL2h0dHAtc2VydmVyJ1xuaW1wb3J0IHsgUHJldmlld0NvbXBvbmVudHMgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnXG5pbXBvcnQgeyBzeW5jIGFzIGdsb2JTeW5jIH0gZnJvbSAnZ2xvYidcbmltcG9ydCB7IFdlYXJhYmxlSnNvbiB9IGZyb20gJ0BkY2wvc2NoZW1hcy9kaXN0L3NkaydcbmltcG9ydCB7IENvbnRlbnRNYXBwaW5nLCBFbnRpdHksIEVudGl0eVR5cGUgfSBmcm9tICdAZGNsL3NjaGVtYXMnXG5pbXBvcnQgaWdub3JlIGZyb20gJ2lnbm9yZSdcbmltcG9ydCBmZXRjaCwgeyBIZWFkZXJzIH0gZnJvbSAnbm9kZS1mZXRjaCdcbmltcG9ydCB7IGZldGNoRW50aXR5QnlQb2ludGVyIH0gZnJvbSAnLi9jYXRhbHlzdCdcblxuZnVuY3Rpb24gZ2V0Q2F0YWx5c3RVcmwoKTogVVJMIHtcbiAgcmV0dXJuIG5ldyBVUkwoJ2h0dHBzOi8vcGVlci5kZWNlbnRyYWxhbmQub3JnJylcbn1cblxuZnVuY3Rpb24gc21hcnRXZWFyYWJsZU5hbWVUb0lkKG5hbWU6IHN0cmluZykge1xuICByZXR1cm4gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpLnJlcGxhY2UoLyAvZywgJy0nKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBFY3M2RW5kcG9pbnRzKGRpcjogc3RyaW5nLCByb3V0ZXI6IFJvdXRlcjxQcmV2aWV3Q29tcG9uZW50cz4pIHtcbiAgY29uc3QgYmFzZUZvbGRlcnMgPSBbZGlyXVxuICAvLyBoYW5kbGUgb2xkIHByZXZpZXcgc2NlbmUuanNvblxuICByb3V0ZXIuZ2V0KCcvc2NlbmUuanNvbicsIGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGguam9pbihkaXIsICdzY2VuZS5qc29uJykpXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9sYW1iZGFzL2V4cGxvcmUvcmVhbG1zJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzZXJ2ZXJOYW1lOiAnbG9jYWxob3N0JyxcbiAgICAgICAgICB1cmw6IGBodHRwOi8vJHtjdHgudXJsLmhvc3R9YCxcbiAgICAgICAgICBsYXllcjogJ3N0dWInLFxuICAgICAgICAgIHVzZXJzQ291bnQ6IDAsXG4gICAgICAgICAgbWF4VXNlcnM6IDEwMCxcbiAgICAgICAgICB1c2VyUGFyY2VsczogW11cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cbiAgfSlcblxuICByb3V0ZXIuZ2V0KCcvbGFtYmRhcy9jb250cmFjdHMvc2VydmVycycsIGFzeW5jIChjdHgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9keTogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogYGh0dHA6Ly8ke2N0eC51cmwuaG9zdH1gLFxuICAgICAgICAgIG93bmVyOiAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICBpZDogJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCdcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cbiAgfSlcblxuICByb3V0ZXIuZ2V0KCcvbGFtYmRhcy9wcm9maWxlcycsIGFzeW5jIChjdHgsIG5leHQpID0+IHtcbiAgICBjb25zdCBiYXNlVXJsID0gYCR7Y3R4LnVybC5wcm90b2NvbH0vLyR7Y3R4LnVybC5ob3N0fS9jb250ZW50L2NvbnRlbnRzYFxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByZXZpZXdXZWFyYWJsZXMgPSBnZXRBbGxQcmV2aWV3V2VhcmFibGVzKHtcbiAgICAgICAgYmFzZUZvbGRlcnMsXG4gICAgICAgIGJhc2VVcmxcbiAgICAgIH0pLm1hcCgod2VhcmFibGUpID0+IHdlYXJhYmxlLmlkKVxuXG4gICAgICBpZiAocHJldmlld1dlYXJhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgY2F0YWx5c3RVcmwgPSBnZXRDYXRhbHlzdFVybCgpXG5cbiAgICAgICAgY29uc3QgdSA9IG5ldyBVUkwoY3R4LnVybC50b1N0cmluZygpKVxuICAgICAgICB1Lmhvc3QgPSBjYXRhbHlzdFVybC5ob3N0XG4gICAgICAgIHUucHJvdG9jb2wgPSBjYXRhbHlzdFVybC5wcm90b2NvbFxuICAgICAgICB1LnBvcnQgPSBjYXRhbHlzdFVybC5wb3J0XG4gICAgICAgIGNvbnN0IHJlcSA9IGF3YWl0IGZldGNoKHUudG9TdHJpbmcoKSwge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb246ICdjbG9zZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1ldGhvZDogY3R4LnJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIGJvZHk6IGN0eC5yZXF1ZXN0Lm1ldGhvZCA9PT0gJ2dldCcgPyB1bmRlZmluZWQgOiBjdHgucmVxdWVzdC5ib2R5XG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZGVwbG95ZWRQcm9maWxlID0gKGF3YWl0IHJlcS5qc29uKCkpIGFzIGFueVtdXG5cbiAgICAgICAgaWYgKGRlcGxveWVkUHJvZmlsZT8ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgZGVwbG95ZWRQcm9maWxlWzBdLmF2YXRhcnNbMF0uYXZhdGFyLndlYXJhYmxlcy5wdXNoKC4uLnByZXZpZXdXZWFyYWJsZXMpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6IHJlcS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJ2FwcGxpY2F0aW9uL2JpbmFyeSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBkZXBsb3llZFByb2ZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGNhdGNoIHByb2ZpbGUgYW5kIGZpbGwgd2l0aCBwcmV2aWV3IHdlYXJhYmxlcy5gLCBlcnIpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQoKVxuICB9KVxuXG4gIHJvdXRlci5hbGwoJy9sYW1iZGFzLzpwYXRoKycsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBjYXRhbHlzdFVybCA9IGdldENhdGFseXN0VXJsKClcbiAgICBjb25zdCB1ID0gbmV3IFVSTChjdHgudXJsLnRvU3RyaW5nKCkpXG4gICAgdS5ob3N0ID0gY2F0YWx5c3RVcmwuaG9zdFxuICAgIHUucHJvdG9jb2wgPSBjYXRhbHlzdFVybC5wcm90b2NvbFxuICAgIHUucG9ydCA9IGNhdGFseXN0VXJsLnBvcnRcbiAgICBjb25zdCByZXEgPSBhd2FpdCBmZXRjaCh1LnRvU3RyaW5nKCksIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgY29ubmVjdGlvbjogJ2Nsb3NlJ1xuICAgICAgfSxcbiAgICAgIG1ldGhvZDogY3R4LnJlcXVlc3QubWV0aG9kLFxuICAgICAgYm9keTogY3R4LnJlcXVlc3QubWV0aG9kID09PSAnZ2V0JyA/IHVuZGVmaW5lZCA6IGN0eC5yZXF1ZXN0LmJvZHlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2NvbnRlbnQtdHlwZSc6IHJlcS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJ2FwcGxpY2F0aW9uL2JpbmFyeSdcbiAgICAgIH0sXG4gICAgICBib2R5OiByZXEuYm9keVxuICAgIH1cbiAgfSlcblxuICByb3V0ZXIucG9zdCgnL2NvbnRlbnQvZW50aXRpZXMnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgY2F0YWx5c3RVcmwgPSBnZXRDYXRhbHlzdFVybCgpXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgICBjb25zb2xlLmxvZyhjdHgucmVxdWVzdC5oZWFkZXJzKVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2NhdGFseXN0VXJsLnRvU3RyaW5nKCl9L2NvbnRlbnQvZW50aXRpZXNgLCB7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBib2R5OiBjdHgucmVxdWVzdC5ib2R5XG4gICAgfSlcblxuICAgIHJldHVybiByZXNcbiAgfSlcblxuICBzZXJ2ZVN0YXRpYyhkaXIsIHJvdXRlcilcblxuICAvLyBUT0RPOiBnZXQgd29ya3NwYWNlIHNjZW5lcyAmIHdlYXJhYmxlcy4uLlxuXG4gIHNlcnZlRm9sZGVycyhyb3V0ZXIsIGJhc2VGb2xkZXJzKVxufVxuXG5mdW5jdGlvbiBzZXJ2ZUZvbGRlcnMocm91dGVyOiBSb3V0ZXI8UHJldmlld0NvbXBvbmVudHM+LCBiYXNlRm9sZGVyczogc3RyaW5nW10pIHtcbiAgcm91dGVyLmdldCgnL2NvbnRlbnQvY29udGVudHMvOmhhc2gnLCBhc3luYyAoY3R4OiBhbnksIG5leHQ6IGFueSkgPT4ge1xuICAgIGlmIChjdHgucGFyYW1zLmhhc2ggJiYgY3R4LnBhcmFtcy5oYXNoLnN0YXJ0c1dpdGgoJ2I2NC0nKSkge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUoQnVmZmVyLmZyb20oY3R4LnBhcmFtcy5oYXNoLnJlcGxhY2UoL15iNjQtLywgJycpLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKSlcblxuICAgICAgLy8gb25seSByZXR1cm4gZmlsZXMgSUYgdGhlIGZpbGUgaXMgd2l0aGluIGEgYmFzZUZvbGRlclxuICAgICAgaWYgKCFiYXNlRm9sZGVycy5maW5kKChmb2xkZXI6IHN0cmluZykgPT4gZnVsbFBhdGguc3RhcnRzV2l0aChmb2xkZXIpKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAneC10aW1lc3RhbXAnOiBEYXRlLm5vdygpLFxuICAgICAgICAgICd4LXNlbnQnOiB0cnVlLFxuICAgICAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlLHByaXZhdGUsbWF4LWFnZT0xJ1xuICAgICAgICB9LFxuICAgICAgICBib2R5OiBmcy5jcmVhdGVSZWFkU3RyZWFtKGZ1bGxQYXRoKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXh0KClcbiAgfSlcblxuICBhc3luYyBmdW5jdGlvbiBwb2ludGVyUmVxdWVzdEhhbmRsZXIocG9pbnRlcnM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCFwb2ludGVycyB8fCBwb2ludGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RlZFBvaW50ZXJzID0gbmV3IFNldDxzdHJpbmc+KFxuICAgICAgcG9pbnRlcnMgJiYgdHlwZW9mIHBvaW50ZXJzID09PSAnc3RyaW5nJyA/IFtwb2ludGVycyBhcyBzdHJpbmddIDogKHBvaW50ZXJzIGFzIHN0cmluZ1tdKVxuICAgIClcblxuICAgIGNvbnN0IHJlc3VsdEVudGl0aWVzID0gZ2V0U2NlbmVKc29uKHtcbiAgICAgIGJhc2VGb2xkZXJzLFxuICAgICAgcG9pbnRlcnM6IEFycmF5LmZyb20ocmVxdWVzdGVkUG9pbnRlcnMpXG4gICAgfSlcbiAgICBjb25zdCBjYXRhbHlzdFVybCA9IGdldENhdGFseXN0VXJsKClcbiAgICBjb25zdCByZW1vdGUgPSBmZXRjaEVudGl0eUJ5UG9pbnRlcihcbiAgICAgIGNhdGFseXN0VXJsLnRvU3RyaW5nKCksXG4gICAgICBwb2ludGVycy5maWx0ZXIoKCQ6IHN0cmluZykgPT4gISQubWF0Y2goLy0/XFxkKywtP1xcZCsvKSlcbiAgICApXG5cbiAgICBjb25zdCBzZXJ2ZXJFbnRpdGllcyA9IEFycmF5LmlzQXJyYXkocmVtb3RlKSA/IHJlbW90ZSA6IFtdXG5cbiAgICByZXR1cm4gWy4uLnJlc3VsdEVudGl0aWVzLCAuLi5zZXJ2ZXJFbnRpdGllc11cbiAgfVxuXG4gIC8vIFJFVklFVyBSRVNQT05TRSBGT1JNQVRcbiAgcm91dGVyLmdldCgnL2NvbnRlbnQvZW50aXRpZXMvc2NlbmUnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IGF3YWl0IHBvaW50ZXJSZXF1ZXN0SGFuZGxlcihjdHgudXJsLnNlYXJjaFBhcmFtcy5nZXRBbGwoJ3BvaW50ZXInKSlcbiAgICB9XG4gIH0pXG5cbiAgLy8gUkVWSUVXIFJFU1BPTlNFIEZPUk1BVFxuICByb3V0ZXIucG9zdCgnL2NvbnRlbnQvZW50aXRpZXMvYWN0aXZlJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjdHgucmVxdWVzdC5qc29uKClcbiAgICByZXR1cm4ge1xuICAgICAgYm9keTogYXdhaXQgcG9pbnRlclJlcXVlc3RIYW5kbGVyKGJvZHkucG9pbnRlcnMpXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9wcmV2aWV3LXdlYXJhYmxlcy86aWQnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgYmFzZVVybCA9IGAke2N0eC51cmwucHJvdG9jb2x9Ly8ke2N0eC51cmwuaG9zdH0vY29udGVudC9jb250ZW50c2BcbiAgICBjb25zdCB3ZWFyYWJsZXMgPSBnZXRBbGxQcmV2aWV3V2VhcmFibGVzKHtcbiAgICAgIGJhc2VVcmwsXG4gICAgICBiYXNlRm9sZGVyc1xuICAgIH0pXG4gICAgY29uc3Qgd2VhcmFibGVJZCA9IGN0eC5wYXJhbXMuaWRcbiAgICByZXR1cm4ge1xuICAgICAgYm9keToge1xuICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgZGF0YTogd2VhcmFibGVzLmZpbHRlcigod2VhcmFibGUpID0+IHNtYXJ0V2VhcmFibGVOYW1lVG9JZCh3ZWFyYWJsZT8ubmFtZSkgPT09IHdlYXJhYmxlSWQpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9wcmV2aWV3LXdlYXJhYmxlcycsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBiYXNlVXJsID0gYCR7Y3R4LnVybC5wcm90b2NvbH0vLyR7Y3R4LnVybC5ob3N0fS9jb250ZW50L2NvbnRlbnRzYFxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiB7XG4gICAgICAgIG9rOiB0cnVlLFxuICAgICAgICBkYXRhOiBnZXRBbGxQcmV2aWV3V2VhcmFibGVzKHsgYmFzZVVybCwgYmFzZUZvbGRlcnMgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IGRlZmF1bHRIYXNoTWFrZXIgPSAoc3RyOiBzdHJpbmcpID0+ICdiNjQtJyArIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpXG5cbmZ1bmN0aW9uIGdldEFsbFByZXZpZXdXZWFyYWJsZXMoeyBiYXNlRm9sZGVycywgYmFzZVVybCB9OiB7IGJhc2VGb2xkZXJzOiBzdHJpbmdbXTsgYmFzZVVybDogc3RyaW5nIH0pIHtcbiAgY29uc3Qgd2VhcmFibGVQYXRoQXJyYXk6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCB3ZWFyYWJsZURpciBvZiBiYXNlRm9sZGVycykge1xuICAgIGNvbnN0IHdlYXJhYmxlSnNvblBhdGggPSBwYXRoLnJlc29sdmUod2VhcmFibGVEaXIsICd3ZWFyYWJsZS5qc29uJylcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh3ZWFyYWJsZUpzb25QYXRoKSkge1xuICAgICAgd2VhcmFibGVQYXRoQXJyYXkucHVzaCh3ZWFyYWJsZUpzb25QYXRoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJldDogUmV0dXJuVHlwZTx0eXBlb2Ygc2VydmVXZWFyYWJsZT5bXSA9IFtdXG4gIGZvciAoY29uc3Qgd2VhcmFibGVKc29uUGF0aCBvZiB3ZWFyYWJsZVBhdGhBcnJheSkge1xuICAgIHRyeSB7XG4gICAgICByZXQucHVzaChzZXJ2ZVdlYXJhYmxlKHsgd2VhcmFibGVKc29uUGF0aCwgYmFzZVVybCB9KSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkbid0IG1vY2sgdGhlIHdlYXJhYmxlICR7d2VhcmFibGVKc29uUGF0aH0uIFBsZWFzZSB2ZXJpZnkgdGhlIGNvcnJlY3QgZm9ybWF0IGFuZCBzY2hlbWUuYCwgZXJyKVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIHNlcnZlV2VhcmFibGUoeyB3ZWFyYWJsZUpzb25QYXRoLCBiYXNlVXJsIH06IHsgd2VhcmFibGVKc29uUGF0aDogc3RyaW5nOyBiYXNlVXJsOiBzdHJpbmcgfSkge1xuICBjb25zdCB3ZWFyYWJsZURpciA9IHBhdGguZGlybmFtZSh3ZWFyYWJsZUpzb25QYXRoKVxuICBjb25zdCB3ZWFyYWJsZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh3ZWFyYWJsZUpzb25QYXRoKS50b1N0cmluZygpKVxuXG4gIGlmICghV2VhcmFibGVKc29uLnZhbGlkYXRlKHdlYXJhYmxlSnNvbikpIHtcbiAgICBjb25zdCBlcnJvcnMgPSAoV2VhcmFibGVKc29uLnZhbGlkYXRlLmVycm9ycyB8fCBbXSkubWFwKChhKSA9PiBgJHthLmRhdGF9ICR7YS5tZXNzYWdlfWApLmpvaW4oJycpXG5cbiAgICBjb25zb2xlLmVycm9yKGBVbmFibGUgdG8gdmFsaWRhdGUgd2VhcmFibGUuanNvbiBwcm9wZXJseSwgcGxlYXNlIGNoZWNrIGl0LmAsIGVycm9ycylcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgd2VhcmFibGUuanNvbiAoJHt3ZWFyYWJsZUpzb25QYXRofSlgKVxuICB9XG5cbiAgY29uc3QgZGNsSWdub3JlUGF0aCA9IHBhdGgucmVzb2x2ZSh3ZWFyYWJsZURpciwgJy5kY2xpZ25vcmUnKVxuICBsZXQgaWdub3JlRmlsZUNvbnRlbnQgPSAnJ1xuICBpZiAoZnMuZXhpc3RzU3luYyhkY2xJZ25vcmVQYXRoKSkge1xuICAgIGlnbm9yZUZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZSh3ZWFyYWJsZURpciwgJy5kY2xpZ25vcmUnKSwgJ3V0Zi04JylcbiAgfVxuXG4gIGNvbnN0IGhhc2hlZEZpbGVzID0gZ2V0RmlsZXNGcm9tRm9sZGVyKHtcbiAgICBmb2xkZXI6IHdlYXJhYmxlRGlyLFxuICAgIGFkZE9yaWdpbmFsUGF0aDogZmFsc2UsXG4gICAgaWdub3JlUGF0dGVybjogaWdub3JlRmlsZUNvbnRlbnRcbiAgfSlcblxuICBjb25zdCB0aHVtYm5haWxGaWx0ZXJlZCA9IGhhc2hlZEZpbGVzLmZpbHRlcigoJCkgPT4gJD8uZmlsZSA9PT0gJ3RodW1ibmFpbC5wbmcnKVxuICBjb25zdCB0aHVtYm5haWwgPVxuICAgIHRodW1ibmFpbEZpbHRlcmVkLmxlbmd0aCA+IDAgJiYgdGh1bWJuYWlsRmlsdGVyZWRbMF0/Lmhhc2ggJiYgYCR7YmFzZVVybH0vJHt0aHVtYm5haWxGaWx0ZXJlZFswXS5oYXNofWBcblxuICBjb25zdCB3ZWFyYWJsZUlkID0gJ3Vybjo4ZGMyZDdhZC05N2UzLTQ0ZDAtYmE4OS1lODMwNWQ3OTVhNmEnXG5cbiAgY29uc3QgcmVwcmVzZW50YXRpb25zID0gd2VhcmFibGVKc29uLmRhdGEucmVwcmVzZW50YXRpb25zLm1hcCgocmVwcmVzZW50YXRpb24pID0+ICh7XG4gICAgLi4ucmVwcmVzZW50YXRpb24sXG4gICAgbWFpbkZpbGU6IGBtYWxlLyR7cmVwcmVzZW50YXRpb24ubWFpbkZpbGV9YCxcbiAgICBjb250ZW50czogaGFzaGVkRmlsZXMubWFwKCgkKSA9PiAoe1xuICAgICAga2V5OiBgbWFsZS8keyQ/LmZpbGV9YCxcbiAgICAgIHVybDogYCR7YmFzZVVybH0vJHskPy5oYXNofWAsXG4gICAgICBoYXNoOiAkPy5oYXNoXG4gICAgfSkpXG4gIH0pKVxuXG4gIHJldHVybiB7XG4gICAgaWQ6IHdlYXJhYmxlSWQsXG4gICAgcmFyaXR5OiB3ZWFyYWJsZUpzb24ucmFyaXR5LFxuICAgIGkxOG46IFt7IGNvZGU6ICdlbicsIHRleHQ6IHdlYXJhYmxlSnNvbi5uYW1lIH1dLFxuICAgIGRlc2NyaXB0aW9uOiB3ZWFyYWJsZUpzb24uZGVzY3JpcHRpb24sXG4gICAgdGh1bWJuYWlsOiB0aHVtYm5haWwgfHwgJycsXG4gICAgYmFzZVVybDogYCR7YmFzZVVybH0vYCxcbiAgICBuYW1lOiB3ZWFyYWJsZUpzb24ubmFtZSB8fCAnJyxcbiAgICBkYXRhOiB7XG4gICAgICBjYXRlZ29yeTogd2VhcmFibGVKc29uLmRhdGEuY2F0ZWdvcnksXG4gICAgICByZXBsYWNlczogW10sXG4gICAgICBoaWRlczogW10sXG4gICAgICB0YWdzOiBbXSxcbiAgICAgIHNjZW5lOiBoYXNoZWRGaWxlcyxcbiAgICAgIHJlcHJlc2VudGF0aW9uczogcmVwcmVzZW50YXRpb25zIGFzIGFueVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTY2VuZUpzb24oe1xuICBiYXNlRm9sZGVycyxcbiAgcG9pbnRlcnMsXG4gIGN1c3RvbUhhc2hNYWtlclxufToge1xuICBiYXNlRm9sZGVyczogc3RyaW5nW11cbiAgcG9pbnRlcnM6IHN0cmluZ1tdXG4gIGN1c3RvbUhhc2hNYWtlcj86IChzdHI6IHN0cmluZykgPT4gc3RyaW5nXG59KTogRW50aXR5W10ge1xuICBjb25zdCByZXF1ZXN0ZWRQb2ludGVycyA9IG5ldyBTZXQ8c3RyaW5nPihwb2ludGVycylcbiAgY29uc3QgcmVzdWx0RW50aXRpZXM6IEVudGl0eVtdID0gW11cblxuICBjb25zdCBhbGxEZXBsb3ltZW50cyA9IGJhc2VGb2xkZXJzLm1hcCgoZm9sZGVyKSA9PiB7XG4gICAgY29uc3QgZGNsSWdub3JlUGF0aCA9IHBhdGgucmVzb2x2ZShmb2xkZXIsICcuZGNsaWdub3JlJylcbiAgICBsZXQgaWdub3JlRmlsZUNvbnRlbnQgPSAnJ1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRjbElnbm9yZVBhdGgpKSB7XG4gICAgICBpZ25vcmVGaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZm9sZGVyLCAnLmRjbGlnbm9yZScpLCAndXRmLTgnKVxuICAgIH1cblxuICAgIHJldHVybiBlbnRpdHlWM0Zyb21Gb2xkZXIoe1xuICAgICAgZm9sZGVyLFxuICAgICAgYWRkT3JpZ2luYWxQYXRoOiBmYWxzZSxcbiAgICAgIGlnbm9yZVBhdHRlcm46IGlnbm9yZUZpbGVDb250ZW50LFxuICAgICAgY3VzdG9tSGFzaE1ha2VyXG4gICAgfSlcbiAgfSlcblxuICBmb3IgKGNvbnN0IHBvaW50ZXIgb2YgQXJyYXkuZnJvbShyZXF1ZXN0ZWRQb2ludGVycykpIHtcbiAgICAvLyBnZXQgZGVwbG95bWVudCBieSBwb2ludGVyXG4gICAgY29uc3QgdGhlRGVwbG95bWVudCA9IGFsbERlcGxveW1lbnRzLmZpbmQoKCQpID0+ICQgJiYgJC5wb2ludGVycy5pbmNsdWRlcyhwb2ludGVyKSlcbiAgICBpZiAodGhlRGVwbG95bWVudCkge1xuICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgcmVxdWlyZWQgcG9pbnRlcnMgZnJvbSB0aGUgcmVxdWVzdGVkUG9pbnRlcnMgc2V0XG4gICAgICAvLyB0byBwcmV2ZW50IHNlbmRpbmcgZHVwbGljYXRlZCBlbnRpdGllc1xuICAgICAgdGhlRGVwbG95bWVudC5wb2ludGVycy5mb3JFYWNoKCgkKSA9PiByZXF1ZXN0ZWRQb2ludGVycy5kZWxldGUoJCkpXG5cbiAgICAgIC8vIGFkZCB0aGUgZGVwbG95bWVudCB0byB0aGUgcmVzdWx0c1xuICAgICAgcmVzdWx0RW50aXRpZXMucHVzaCh0aGVEZXBsb3ltZW50KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRFbnRpdGllc1xufVxuXG5mdW5jdGlvbiBzZXJ2ZVN0YXRpYyhkaXI6IHN0cmluZywgcm91dGVyOiBSb3V0ZXI8UHJldmlld0NvbXBvbmVudHM+KSB7XG4gIGNvbnN0IHNka1BhdGggPSBwYXRoLmRpcm5hbWUoXG4gICAgcmVxdWlyZS5yZXNvbHZlKCdAZGNsL3Nkay9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW2Rpcl1cbiAgICB9KVxuICApXG4gIGNvbnN0IGRjbEV4cGxvcmVySnNvblBhdGggPSBwYXRoLmRpcm5hbWUoXG4gICAgcmVxdWlyZS5yZXNvbHZlKCdAZGNsL2V4cGxvcmVyL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIHBhdGhzOiBbZGlyLCBzZGtQYXRoXVxuICAgIH0pXG4gIClcblxuICBjb25zdCBkY2xLZXJuZWxEZWZhdWx0UHJvZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGNsRXhwbG9yZXJKc29uUGF0aCwgJ2RlZmF1bHQtcHJvZmlsZScpXG4gIGNvbnN0IGRjbEtlcm5lbEltYWdlc0RlY2VudHJhbGFuZENvbm5lY3QgPSBwYXRoLnJlc29sdmUoZGNsRXhwbG9yZXJKc29uUGF0aCwgJ2ltYWdlcycsICdkZWNlbnRyYWxhbmQtY29ubmVjdCcpXG5cbiAgY29uc3Qgcm91dGVzID0gW1xuICAgIHtcbiAgICAgIHJvdXRlOiAnLycsXG4gICAgICBwYXRoOiBwYXRoLnJlc29sdmUoZGNsRXhwbG9yZXJKc29uUGF0aCwgJ3ByZXZpZXcuaHRtbCcpLFxuICAgICAgdHlwZTogJ3RleHQvaHRtbCdcbiAgICB9LFxuICAgIHtcbiAgICAgIHJvdXRlOiAnL2Zhdmljb24uaWNvJyxcbiAgICAgIHBhdGg6IHBhdGgucmVzb2x2ZShkY2xFeHBsb3Jlckpzb25QYXRoLCAnZmF2aWNvbi5pY28nKSxcbiAgICAgIHR5cGU6ICd0ZXh0L2h0bWwnXG4gICAgfSxcbiAgICB7XG4gICAgICByb3V0ZTogJy9AL2V4cGxvcmVyL2luZGV4LmpzJyxcbiAgICAgIHBhdGg6IHBhdGgucmVzb2x2ZShkY2xFeHBsb3Jlckpzb25QYXRoLCAnaW5kZXguanMnKSxcbiAgICAgIHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnXG4gICAgfVxuICBdXG5cbiAgZm9yIChjb25zdCByb3V0ZSBvZiByb3V0ZXMpIHtcbiAgICByb3V0ZXIuZ2V0KHJvdXRlLnJvdXRlLCBhc3luYyAoX2N0eCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogcm91dGUudHlwZSB9LFxuICAgICAgICBib2R5OiBmcy5jcmVhdGVSZWFkU3RyZWFtKHJvdXRlLnBhdGgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0YXRpY1JvdXRlcyhyb3V0ZTogc3RyaW5nLCBmb2xkZXI6IHN0cmluZywgdHJhbnNmb3JtID0gKHN0cjogc3RyaW5nKSA9PiBzdHIpIHtcbiAgICByb3V0ZXIuZ2V0KHJvdXRlLCBhc3luYyAoY3R4LCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCBmaWxlID0gY3R4LnBhcmFtcy5wYXRoXG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShmb2xkZXIsIHRyYW5zZm9ybShmaWxlKSlcblxuICAgICAgLy8gb25seSByZXR1cm4gZmlsZXMgSUYgdGhlIGZpbGUgaXMgd2l0aGluIGEgYmFzZUZvbGRlclxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAgICd4LXRpbWVzdGFtcCc6IERhdGUubm93KCksXG4gICAgICAgICd4LXNlbnQnOiB0cnVlLFxuICAgICAgICAnY2FjaGUtY29udHJvbCc6ICduby1jYWNoZSxwcml2YXRlLG1heC1hZ2U9MSdcbiAgICAgIH1cblxuICAgICAgaWYgKGZ1bGxQYXRoLmVuZHNXaXRoKCcud2FzbScpKSB7XG4gICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2FwcGxpY2F0aW9uL3dhc20nXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHk6IGZzLmNyZWF0ZVJlYWRTdHJlYW0oZnVsbFBhdGgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNyZWF0ZVN0YXRpY1JvdXRlcygnL2ltYWdlcy9kZWNlbnRyYWxhbmQtY29ubmVjdC86cGF0aCsnLCBkY2xLZXJuZWxJbWFnZXNEZWNlbnRyYWxhbmRDb25uZWN0KVxuICBjcmVhdGVTdGF0aWNSb3V0ZXMoJy9kZWZhdWx0LXByb2ZpbGUvOnBhdGgrJywgZGNsS2VybmVsRGVmYXVsdFByb2ZpbGVQYXRoKVxuICBjcmVhdGVTdGF0aWNSb3V0ZXMoJy9AL2V4cGxvcmVyLzpwYXRoKycsIGRjbEV4cGxvcmVySnNvblBhdGgsIChmaWxlUGF0aCkgPT4gZmlsZVBhdGgucmVwbGFjZSgvLmJyKyQvLCAnJykpXG5cbiAgcm91dGVyLmdldCgnL2ZlYXR1cmUtZmxhZ3MvOmZpbGUnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vZmVhdHVyZS1mbGFncy5kZWNlbnRyYWxhbmQuem9uZS8ke2N0eC5wYXJhbXMuZmlsZX1gLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIGNvbm5lY3Rpb246ICdjbG9zZSdcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gZW50aXR5VjNGcm9tRm9sZGVyKHtcbiAgZm9sZGVyLFxuICBhZGRPcmlnaW5hbFBhdGgsXG4gIGlnbm9yZVBhdHRlcm4sXG4gIGN1c3RvbUhhc2hNYWtlclxufToge1xuICBmb2xkZXI6IHN0cmluZ1xuICBhZGRPcmlnaW5hbFBhdGg/OiBib29sZWFuXG4gIGlnbm9yZVBhdHRlcm4/OiBzdHJpbmdcbiAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbn0pOiBFbnRpdHkgfCBudWxsIHtcbiAgY29uc3Qgc2NlbmVKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShmb2xkZXIsICcuL3NjZW5lLmpzb24nKVxuICBsZXQgaXNQYXJjZWxTY2VuZSA9IHRydWVcblxuICBjb25zdCB3ZWFyYWJsZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGZvbGRlciwgJy4vd2VhcmFibGUuanNvbicpXG4gIGlmIChmcy5leGlzdHNTeW5jKHdlYXJhYmxlSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlYXJhYmxlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHdlYXJhYmxlSnNvblBhdGgpLnRvU3RyaW5nKCkpXG4gICAgICBpZiAoIVdlYXJhYmxlSnNvbi52YWxpZGF0ZSh3ZWFyYWJsZUpzb24pKSB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IChXZWFyYWJsZUpzb24udmFsaWRhdGUuZXJyb3JzIHx8IFtdKS5tYXAoKGEpID0+IGAke2EuZGF0YX0gJHthLm1lc3NhZ2V9YCkuam9pbignJylcblxuICAgICAgICBjb25zb2xlLmVycm9yKGBVbmFibGUgdG8gdmFsaWRhdGUgd2VhcmFibGUuanNvbiBwcm9wZXJseSwgcGxlYXNlIGNoZWNrIGl0LmAsIGVycm9ycylcbiAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCB3ZWFyYWJsZS5qc29uICgke3dlYXJhYmxlSnNvblBhdGh9KWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc1BhcmNlbFNjZW5lID0gZmFsc2VcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byBsb2FkIHdlYXJhYmxlLmpzb24gcHJvcGVybHlgLCBlcnIpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFzaE1ha2VyID0gY3VzdG9tSGFzaE1ha2VyID8gY3VzdG9tSGFzaE1ha2VyIDogZGVmYXVsdEhhc2hNYWtlclxuXG4gIGlmIChmcy5leGlzdHNTeW5jKHNjZW5lSnNvblBhdGgpICYmIGlzUGFyY2VsU2NlbmUpIHtcbiAgICBjb25zdCBzY2VuZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhzY2VuZUpzb25QYXRoKS50b1N0cmluZygpKVxuICAgIGNvbnN0IHsgYmFzZSwgcGFyY2VscyB9OiB7IGJhc2U6IHN0cmluZzsgcGFyY2Vsczogc3RyaW5nW10gfSA9IHNjZW5lSnNvbi5zY2VuZVxuICAgIGNvbnN0IHBvaW50ZXJzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICBwb2ludGVycy5hZGQoYmFzZSlcbiAgICBwYXJjZWxzLmZvckVhY2goKCQpID0+IHBvaW50ZXJzLmFkZCgkKSlcblxuICAgIGNvbnN0IG1hcHBlZEZpbGVzID0gZ2V0RmlsZXNGcm9tRm9sZGVyKHtcbiAgICAgIGZvbGRlcixcbiAgICAgIGFkZE9yaWdpbmFsUGF0aCxcbiAgICAgIGlnbm9yZVBhdHRlcm4sXG4gICAgICBjdXN0b21IYXNoTWFrZXJcbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcnNpb246ICd2MycsXG4gICAgICB0eXBlOiBFbnRpdHlUeXBlLlNDRU5FLFxuICAgICAgaWQ6IGhhc2hNYWtlcihmb2xkZXIpLFxuICAgICAgcG9pbnRlcnM6IEFycmF5LmZyb20ocG9pbnRlcnMpLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbWV0YWRhdGE6IHNjZW5lSnNvbixcbiAgICAgIGNvbnRlbnQ6IG1hcHBlZEZpbGVzXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgZGVmYXVsdERjbElnbm9yZSA9ICgpID0+XG4gIFtcbiAgICAnLionLFxuICAgICdwYWNrYWdlLmpzb24nLFxuICAgICdwYWNrYWdlLWxvY2suanNvbicsXG4gICAgJ3lhcm4tbG9jay5qc29uJyxcbiAgICAnYnVpbGQuanNvbicsXG4gICAgJ2V4cG9ydCcsXG4gICAgJ3RzY29uZmlnLmpzb24nLFxuICAgICd0c2xpbnQuanNvbicsXG4gICAgJ25vZGVfbW9kdWxlcycsXG4gICAgJyoudHMnLFxuICAgICcqLnRzeCcsXG4gICAgJ0RvY2tlcmZpbGUnLFxuICAgICdkaXN0JyxcbiAgICAnUkVBRE1FLm1kJyxcbiAgICAnKi5ibGVuZCcsXG4gICAgJyouZmJ4JyxcbiAgICAnKi56aXAnLFxuICAgICcqLnJhcidcbiAgXS5qb2luKCdcXG4nKVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZXNGcm9tRm9sZGVyKHtcbiAgZm9sZGVyLFxuICBhZGRPcmlnaW5hbFBhdGgsXG4gIGlnbm9yZVBhdHRlcm4sXG4gIGN1c3RvbUhhc2hNYWtlclxufToge1xuICBmb2xkZXI6IHN0cmluZ1xuICBhZGRPcmlnaW5hbFBhdGg/OiBib29sZWFuXG4gIGlnbm9yZVBhdHRlcm4/OiBzdHJpbmdcbiAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbn0pOiBDb250ZW50TWFwcGluZ1tdIHtcbiAgY29uc3QgaGFzaE1ha2VyID0gY3VzdG9tSGFzaE1ha2VyID8gY3VzdG9tSGFzaE1ha2VyIDogZGVmYXVsdEhhc2hNYWtlclxuXG4gIGNvbnN0IGFsbEZpbGVzID0gZ2xvYlN5bmMoJyoqLyonLCB7XG4gICAgY3dkOiBmb2xkZXIsXG4gICAgZG90OiBmYWxzZSxcbiAgICBhYnNvbHV0ZTogdHJ1ZVxuICB9KVxuICAgIC5tYXAoKGZpbGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZnMuc3RhdFN5bmMoZmlsZSkuaXNGaWxlKCkpIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgX2ZvbGRlciA9IGZvbGRlci5yZXBsYWNlKC9cXFxcL2dpLCAnLycpXG4gICAgICBjb25zdCBrZXkgPSBmaWxlLnJlcGxhY2UoX2ZvbGRlciwgJycpLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgICByZXR1cm4ga2V5XG4gICAgfSlcbiAgICAuZmlsdGVyKCgkKSA9PiAhISQpIGFzIHN0cmluZ1tdXG5cbiAgY29uc3QgZW5zdXJlSWdub3JlUGF0dGVybiA9IGlnbm9yZVBhdHRlcm4gJiYgaWdub3JlUGF0dGVybiAhPT0gJycgPyBpZ25vcmVQYXR0ZXJuIDogZGVmYXVsdERjbElnbm9yZSgpXG4gIGNvbnN0IGlnID0gaWdub3JlKCkuYWRkKGVuc3VyZUlnbm9yZVBhdHRlcm4pXG4gIGNvbnN0IGZpbHRlcmVkRmlsZXMgPSBpZy5maWx0ZXIoYWxsRmlsZXMpXG5cbiAgY29uc3QgcmV0OiAoQ29udGVudE1hcHBpbmcgJiB7IG9yaWdpbmFsX3BhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCB9KVtdID0gW11cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsdGVyZWRGaWxlcykge1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShmb2xkZXIsIGZpbGUpXG4gICAgdHJ5IHtcbiAgICAgIGlmICghZnMuc3RhdFN5bmMoYWJzb2x1dGVQYXRoKS5pc0ZpbGUoKSkgY29udGludWVcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycilcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgYWJzb2x1dGVGb2xkZXIgPSBmb2xkZXIucmVwbGFjZSgvXFxcXC9naSwgJy8nKVxuXG4gICAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aFRvRm9sZGVyID0gZmlsZS5yZXBsYWNlKGFic29sdXRlRm9sZGVyLCAnJykucmVwbGFjZSgvXlxcLysvLCAnJylcblxuICAgIHJldC5wdXNoKHtcbiAgICAgIGZpbGU6IHJlbGF0aXZlRmlsZVBhdGhUb0ZvbGRlci50b0xvd2VyQ2FzZSgpLFxuICAgICAgb3JpZ2luYWxfcGF0aDogYWRkT3JpZ2luYWxQYXRoID8gYWJzb2x1dGVQYXRoIDogdW5kZWZpbmVkLFxuICAgICAgaGFzaDogaGFzaE1ha2VyKGFic29sdXRlUGF0aClcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHJldFxufVxuIl19