@dcl/sdk 7.0.6-3999809037.commit-0a47a3c → 7.0.6-4009020955.commit-08722f5
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/cli/commands/build/helpers.d.ts +25 -0
- package/cli/commands/build/helpers.js +50 -0
- package/cli/commands/build/helpers.ts +95 -0
- package/cli/commands/build/index.d.ts +19 -0
- package/cli/commands/build/index.js +64 -0
- package/cli/commands/build/index.ts +91 -0
- package/cli/commands/init/index.d.ts +3 -1
- package/cli/commands/init/index.js +9 -15
- package/cli/commands/init/index.ts +12 -16
- package/cli/commands/init/repos.js +1 -1
- package/cli/commands/init/repos.ts +1 -2
- package/cli/commands/preview/bff.d.ts +3 -0
- package/cli/commands/preview/bff.js +50 -0
- package/cli/commands/preview/bff.ts +59 -0
- package/cli/commands/preview/catalyst.d.ts +5 -0
- package/cli/commands/preview/catalyst.js +24 -0
- package/cli/commands/preview/catalyst.ts +31 -0
- package/cli/commands/preview/coordinates.d.ts +20 -0
- package/cli/commands/preview/coordinates.js +90 -0
- package/cli/commands/preview/coordinates.ts +146 -0
- package/cli/commands/preview/endpoints.d.ts +10 -0
- package/cli/commands/preview/endpoints.js +500 -0
- package/cli/commands/preview/endpoints.ts +594 -0
- package/cli/commands/preview/eth.d.ts +2 -0
- package/cli/commands/preview/eth.js +6 -0
- package/cli/commands/preview/eth.ts +3 -0
- package/cli/commands/preview/index.d.ts +18 -0
- package/cli/commands/preview/index.js +75 -0
- package/cli/commands/preview/index.ts +88 -0
- package/cli/commands/preview/port.d.ts +1 -0
- package/cli/commands/preview/port.js +21 -0
- package/cli/commands/preview/port.ts +15 -0
- package/cli/commands/preview/project.d.ts +14 -0
- package/cli/commands/preview/project.js +77 -0
- package/cli/commands/preview/project.ts +112 -0
- package/cli/commands/preview/types.d.ts +13 -0
- package/cli/commands/preview/types.js +3 -0
- package/cli/commands/preview/types.ts +19 -0
- package/cli/commands/preview/wire.d.ts +14 -0
- package/cli/commands/preview/wire.js +28 -0
- package/cli/commands/preview/wire.ts +48 -0
- package/cli/commands/preview/ws.d.ts +7 -0
- package/cli/commands/preview/ws.js +16 -0
- package/cli/commands/preview/ws.ts +24 -0
- package/cli/commands/start/index.d.ts +29 -0
- package/cli/commands/start/index.js +121 -0
- package/cli/commands/start/index.ts +132 -0
- package/cli/components/fetch.d.ts +5 -0
- package/cli/components/fetch.js +34 -0
- package/cli/components/fetch.ts +11 -0
- package/cli/components/fs.d.ts +11 -0
- package/cli/components/fs.js +58 -0
- package/cli/components/fs.ts +48 -0
- package/cli/components/index.d.ts +7 -0
- package/cli/components/index.js +13 -0
- package/cli/components/index.ts +14 -0
- package/cli/index.d.ts +2 -0
- package/cli/index.js +8 -8
- package/cli/index.ts +15 -12
- package/cli/utils/args.js +2 -2
- package/cli/utils/args.ts +2 -8
- package/cli/utils/commands.d.ts +2 -1
- package/cli/utils/commands.js +8 -8
- package/cli/utils/commands.ts +11 -11
- package/cli/utils/exec.d.ts +8 -0
- package/cli/utils/exec.js +33 -0
- package/cli/utils/exec.ts +38 -0
- package/cli/utils/fs.d.ts +9 -8
- package/cli/utils/fs.js +7 -47
- package/cli/utils/fs.ts +11 -67
- package/cli/utils/handler.d.ts +6 -0
- package/cli/utils/handler.js +19 -0
- package/cli/utils/handler.ts +23 -0
- package/cli/utils/object.d.ts +9 -0
- package/cli/utils/object.js +45 -0
- package/cli/utils/object.ts +62 -0
- package/cli/utils/out-messages.d.ts +1 -0
- package/cli/utils/out-messages.js +8 -0
- package/cli/utils/out-messages.ts +3 -0
- package/internal/Observable.js +3 -7
- package/internal/provider.js +1 -1
- package/internal/transports/rendererTransport.js +2 -3
- package/messageBus.js +1 -1
- package/observables.js +1 -1
- package/package.json +18 -7
- package/src/internal/Observable.ts +9 -44
- package/src/internal/provider.ts +3 -11
- package/src/internal/transports/rendererTransport.ts +4 -12
- package/src/messageBus.ts +1 -4
- package/src/observables.ts +27 -63
- package/tsconfig.cli.json +10 -1
- package/cli/utils/spinner.d.ts +0 -15
- package/cli/utils/spinner.js +0 -41
- package/cli/utils/spinner.ts +0 -44
@@ -0,0 +1,500 @@
|
|
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 getEcsPath(workingDir) {
|
307
|
+
try {
|
308
|
+
return require.resolve('decentraland-ecs/package.json', {
|
309
|
+
paths: [workingDir]
|
310
|
+
});
|
311
|
+
}
|
312
|
+
catch (e) {
|
313
|
+
return require.resolve('@dcl/sdk/package.json', {
|
314
|
+
paths: [workingDir]
|
315
|
+
});
|
316
|
+
}
|
317
|
+
}
|
318
|
+
function serveStatic(dir, router) {
|
319
|
+
const ecsPath = path.dirname(getEcsPath(dir));
|
320
|
+
const dclKernelPath = path.dirname(require.resolve('@dcl/kernel/package.json', {
|
321
|
+
paths: [dir, ecsPath]
|
322
|
+
}));
|
323
|
+
const dclKernelDefaultProfilePath = path.resolve(dclKernelPath, 'default-profile');
|
324
|
+
const dclKernelImagesDecentralandConnect = path.resolve(dclKernelPath, 'images', 'decentraland-connect');
|
325
|
+
const dclKernelLoaderPath = path.resolve(dclKernelPath, 'loader');
|
326
|
+
const dclUnityRenderer = path.dirname(require.resolve('@dcl/unity-renderer/package.json', {
|
327
|
+
paths: [dir, ecsPath]
|
328
|
+
}));
|
329
|
+
const routes = [
|
330
|
+
{
|
331
|
+
route: '/',
|
332
|
+
path: path.resolve(dclKernelPath, 'preview.html'),
|
333
|
+
type: 'text/html'
|
334
|
+
},
|
335
|
+
{
|
336
|
+
route: '/favicon.ico',
|
337
|
+
path: path.resolve(dclKernelPath, 'favicon.ico'),
|
338
|
+
type: 'text/html'
|
339
|
+
},
|
340
|
+
{
|
341
|
+
route: '/@/artifacts/index.js',
|
342
|
+
path: path.resolve(dclKernelPath, 'index.js'),
|
343
|
+
type: 'text/javascript'
|
344
|
+
}
|
345
|
+
];
|
346
|
+
for (const route of routes) {
|
347
|
+
router.get(route.route, async (_ctx) => {
|
348
|
+
return {
|
349
|
+
headers: { 'Content-Type': route.type },
|
350
|
+
body: fs.createReadStream(route.path)
|
351
|
+
};
|
352
|
+
});
|
353
|
+
}
|
354
|
+
function createStaticRoutes(route, folder, transform = (str) => str) {
|
355
|
+
router.get(route, async (ctx, next) => {
|
356
|
+
const file = ctx.params.path;
|
357
|
+
const fullPath = path.resolve(folder, transform(file));
|
358
|
+
if (!fs.existsSync(fullPath)) {
|
359
|
+
return next();
|
360
|
+
}
|
361
|
+
const headers = {
|
362
|
+
'x-timestamp': Date.now(),
|
363
|
+
'x-sent': true,
|
364
|
+
'cache-control': 'no-cache,private,max-age=1'
|
365
|
+
};
|
366
|
+
if (fullPath.endsWith('.wasm')) {
|
367
|
+
headers['content-type'] = 'application/wasm';
|
368
|
+
}
|
369
|
+
return {
|
370
|
+
headers,
|
371
|
+
body: fs.createReadStream(fullPath)
|
372
|
+
};
|
373
|
+
});
|
374
|
+
}
|
375
|
+
createStaticRoutes('/images/decentraland-connect/:path+', dclKernelImagesDecentralandConnect);
|
376
|
+
createStaticRoutes('/@/artifacts/unity-renderer/:path+', dclUnityRenderer, (filePath) => filePath.replace(/.br+$/, ''));
|
377
|
+
createStaticRoutes('/@/artifacts/loader/:path+', dclKernelLoaderPath);
|
378
|
+
createStaticRoutes('/default-profile/:path+', dclKernelDefaultProfilePath);
|
379
|
+
router.get('/feature-flags/:file', async (ctx) => {
|
380
|
+
const res = await (0, node_fetch_1.default)(`https://feature-flags.decentraland.zone/${ctx.params.file}`, {
|
381
|
+
headers: {
|
382
|
+
connection: 'close'
|
383
|
+
}
|
384
|
+
});
|
385
|
+
return {
|
386
|
+
body: await res.arrayBuffer()
|
387
|
+
};
|
388
|
+
});
|
389
|
+
}
|
390
|
+
function entityV3FromFolder({ folder, addOriginalPath, ignorePattern, customHashMaker }) {
|
391
|
+
const sceneJsonPath = path.resolve(folder, './scene.json');
|
392
|
+
let isParcelScene = true;
|
393
|
+
const wearableJsonPath = path.resolve(folder, './wearable.json');
|
394
|
+
if (fs.existsSync(wearableJsonPath)) {
|
395
|
+
try {
|
396
|
+
const wearableJson = JSON.parse(fs.readFileSync(wearableJsonPath).toString());
|
397
|
+
if (!sdk_1.WearableJson.validate(wearableJson)) {
|
398
|
+
const errors = (sdk_1.WearableJson.validate.errors || []).map((a) => `${a.data} ${a.message}`).join('');
|
399
|
+
console.error(`Unable to validate wearable.json properly, please check it.`, errors);
|
400
|
+
console.error(`Invalid wearable.json (${wearableJsonPath})`);
|
401
|
+
}
|
402
|
+
else {
|
403
|
+
isParcelScene = false;
|
404
|
+
}
|
405
|
+
}
|
406
|
+
catch (err) {
|
407
|
+
console.error(`Unable to load wearable.json properly`, err);
|
408
|
+
}
|
409
|
+
}
|
410
|
+
const hashMaker = customHashMaker ? customHashMaker : defaultHashMaker;
|
411
|
+
if (fs.existsSync(sceneJsonPath) && isParcelScene) {
|
412
|
+
const sceneJson = JSON.parse(fs.readFileSync(sceneJsonPath).toString());
|
413
|
+
const { base, parcels } = sceneJson.scene;
|
414
|
+
const pointers = new Set();
|
415
|
+
pointers.add(base);
|
416
|
+
parcels.forEach(($) => pointers.add($));
|
417
|
+
const mappedFiles = getFilesFromFolder({
|
418
|
+
folder,
|
419
|
+
addOriginalPath,
|
420
|
+
ignorePattern,
|
421
|
+
customHashMaker
|
422
|
+
});
|
423
|
+
return {
|
424
|
+
version: 'v3',
|
425
|
+
type: schemas_1.EntityType.SCENE,
|
426
|
+
id: hashMaker(folder),
|
427
|
+
pointers: Array.from(pointers),
|
428
|
+
timestamp: Date.now(),
|
429
|
+
metadata: sceneJson,
|
430
|
+
content: mappedFiles
|
431
|
+
};
|
432
|
+
}
|
433
|
+
return null;
|
434
|
+
}
|
435
|
+
const defaultDclIgnore = () => [
|
436
|
+
'.*',
|
437
|
+
'package.json',
|
438
|
+
'package-lock.json',
|
439
|
+
'yarn-lock.json',
|
440
|
+
'build.json',
|
441
|
+
'export',
|
442
|
+
'tsconfig.json',
|
443
|
+
'tslint.json',
|
444
|
+
'node_modules',
|
445
|
+
'*.ts',
|
446
|
+
'*.tsx',
|
447
|
+
'Dockerfile',
|
448
|
+
'dist',
|
449
|
+
'README.md',
|
450
|
+
'*.blend',
|
451
|
+
'*.fbx',
|
452
|
+
'*.zip',
|
453
|
+
'*.rar'
|
454
|
+
].join('\n');
|
455
|
+
function getFilesFromFolder({ folder, addOriginalPath, ignorePattern, customHashMaker }) {
|
456
|
+
const hashMaker = customHashMaker ? customHashMaker : defaultHashMaker;
|
457
|
+
const allFiles = (0, glob_1.sync)('**/*', {
|
458
|
+
cwd: folder,
|
459
|
+
dot: false,
|
460
|
+
absolute: true
|
461
|
+
})
|
462
|
+
.map((file) => {
|
463
|
+
try {
|
464
|
+
if (!fs.statSync(file).isFile())
|
465
|
+
return;
|
466
|
+
}
|
467
|
+
catch (err) {
|
468
|
+
return;
|
469
|
+
}
|
470
|
+
const _folder = folder.replace(/\\/gi, '/');
|
471
|
+
const key = file.replace(_folder, '').replace(/^\/+/, '');
|
472
|
+
return key;
|
473
|
+
})
|
474
|
+
.filter(($) => !!$);
|
475
|
+
const ensureIgnorePattern = ignorePattern && ignorePattern !== '' ? ignorePattern : defaultDclIgnore();
|
476
|
+
const ig = (0, ignore_1.default)().add(ensureIgnorePattern);
|
477
|
+
const filteredFiles = ig.filter(allFiles);
|
478
|
+
const ret = [];
|
479
|
+
for (const file of filteredFiles) {
|
480
|
+
const absolutePath = path.resolve(folder, file);
|
481
|
+
try {
|
482
|
+
if (!fs.statSync(absolutePath).isFile())
|
483
|
+
continue;
|
484
|
+
}
|
485
|
+
catch (err) {
|
486
|
+
console.log(err);
|
487
|
+
continue;
|
488
|
+
}
|
489
|
+
const absoluteFolder = folder.replace(/\\/gi, '/');
|
490
|
+
const relativeFilePathToFolder = file.replace(absoluteFolder, '').replace(/^\/+/, '');
|
491
|
+
ret.push({
|
492
|
+
file: relativeFilePathToFolder.toLowerCase(),
|
493
|
+
original_path: addOriginalPath ? absolutePath : undefined,
|
494
|
+
hash: hashMaker(absolutePath)
|
495
|
+
});
|
496
|
+
}
|
497
|
+
return ret;
|
498
|
+
}
|
499
|
+
exports.getFilesFromFolder = getFilesFromFolder;
|
500
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZW5kcG9pbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsMkNBQTRCO0FBQzVCLHVDQUF3QjtBQUN4QiwrQkFBdUM7QUFDdkMsK0NBQW9EO0FBQ3BELDBDQUFpRTtBQUNqRSxvREFBMkI7QUFDM0IseURBQTJDO0FBQzNDLHlDQUFpRDtBQUVqRCxTQUFTLGNBQWM7SUFDckIsT0FBTyxJQUFJLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO0FBQ2pELENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLElBQVk7SUFDekMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQ3BELENBQUM7QUFFRCxTQUFnQixrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsTUFBaUM7SUFDL0UsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUV6QixNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuQyxPQUFPO1lBQ0wsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1lBQy9DLElBQUksRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDeEQsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbEQsT0FBTztZQUNMLElBQUksRUFBRTtnQkFDSjtvQkFDRSxVQUFVLEVBQUUsV0FBVztvQkFDdkIsR0FBRyxFQUFFLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7b0JBQzdCLEtBQUssRUFBRSxNQUFN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QWMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUVsRCxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFckYsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNQLElBQUksRUFBRSx3QkFBd0IsQ0FBQyxXQUFXLEVBQUU7WUFDNUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3pELElBQUksRUFBRSxTQUFTLENBQUMsWUFBWSxDQUFDO1NBQzlCLENBQUMsQ0FBQTtLQUNIO0lBRUQsT0FBTyxHQUFHLENBQUE7QUFDWixDQUFDO0FBekRELGdEQXlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0B3ZWxsLWtub3duLWNvbXBvbmVudHMvaHR0cC1zZXJ2ZXInXG5pbXBvcnQgeyBQcmV2aWV3Q29tcG9uZW50cyB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcydcbmltcG9ydCB7IHN5bmMgYXMgZ2xvYlN5bmMgfSBmcm9tICdnbG9iJ1xuaW1wb3J0IHsgV2VhcmFibGVKc29uIH0gZnJvbSAnQGRjbC9zY2hlbWFzL2Rpc3Qvc2RrJ1xuaW1wb3J0IHsgQ29udGVudE1hcHBpbmcsIEVudGl0eSwgRW50aXR5VHlwZSB9IGZyb20gJ0BkY2wvc2NoZW1hcydcbmltcG9ydCBpZ25vcmUgZnJvbSAnaWdub3JlJ1xuaW1wb3J0IGZldGNoLCB7IEhlYWRlcnMgfSBmcm9tICdub2RlLWZldGNoJ1xuaW1wb3J0IHsgZmV0Y2hFbnRpdHlCeVBvaW50ZXIgfSBmcm9tICcuL2NhdGFseXN0J1xuXG5mdW5jdGlvbiBnZXRDYXRhbHlzdFVybCgpOiBVUkwge1xuICByZXR1cm4gbmV3IFVSTCgnaHR0cHM6Ly9wZWVyLmRlY2VudHJhbGFuZC5vcmcnKVxufVxuXG5mdW5jdGlvbiBzbWFydFdlYXJhYmxlTmFtZVRvSWQobmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnLScpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cEVjczZFbmRwb2ludHMoZGlyOiBzdHJpbmcsIHJvdXRlcjogUm91dGVyPFByZXZpZXdDb21wb25lbnRzPikge1xuICBjb25zdCBiYXNlRm9sZGVycyA9IFtkaXJdXG4gIC8vIGhhbmRsZSBvbGQgcHJldmlldyBzY2VuZS5qc29uXG4gIHJvdXRlci5nZXQoJy9zY2VuZS5qc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IGZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aC5qb2luKGRpciwgJ3NjZW5lLmpzb24nKSlcbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL2xhbWJkYXMvZXhwbG9yZS9yZWFsbXMnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNlcnZlck5hbWU6ICdsb2NhbGhvc3QnLFxuICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2N0eC51cmwuaG9zdH1gLFxuICAgICAgICAgIGxheWVyOiAnc3R1YicsXG4gICAgICAgICAgdXNlcnNDb3VudDogMCxcbiAgICAgICAgICBtYXhVc2VyczogMTAwLFxuICAgICAgICAgIHVzZXJQYXJjZWxzOiBbXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9sYW1iZGFzL2NvbnRyYWN0cy9zZXJ2ZXJzJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBgaHR0cDovLyR7Y3R4LnVybC5ob3N0fWAsXG4gICAgICAgICAgb3duZXI6ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgIGlkOiAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9sYW1iZGFzL3Byb2ZpbGVzJywgYXN5bmMgKGN0eCwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtjdHgudXJsLnByb3RvY29sfS8vJHtjdHgudXJsLmhvc3R9L2NvbnRlbnQvY29udGVudHNgXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJldmlld1dlYXJhYmxlcyA9IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoe1xuICAgICAgICBiYXNlRm9sZGVycyxcbiAgICAgICAgYmFzZVVybFxuICAgICAgfSkubWFwKCh3ZWFyYWJsZSkgPT4gd2VhcmFibGUuaWQpXG5cbiAgICAgIGlmIChwcmV2aWV3V2VhcmFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBjYXRhbHlzdFVybCA9IGdldENhdGFseXN0VXJsKClcblxuICAgICAgICBjb25zdCB1ID0gbmV3IFVSTChjdHgudXJsLnRvU3RyaW5nKCkpXG4gICAgICAgIHUuaG9zdCA9IGNhdGFseXN0VXJsLmhvc3RcbiAgICAgICAgdS5wcm90b2NvbCA9IGNhdGFseXN0VXJsLnByb3RvY29sXG4gICAgICAgIHUucG9ydCA9IGNhdGFseXN0VXJsLnBvcnRcbiAgICAgICAgY29uc3QgcmVxID0gYXdhaXQgZmV0Y2godS50b1N0cmluZygpLCB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgY29ubmVjdGlvbjogJ2Nsb3NlJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbWV0aG9kOiBjdHgucmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgYm9keTogY3R4LnJlcXVlc3QubWV0aG9kID09PSAnZ2V0JyA/IHVuZGVmaW5lZCA6IGN0eC5yZXF1ZXN0LmJvZHlcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBkZXBsb3llZFByb2ZpbGUgPSAoYXdhaXQgcmVxLmpzb24oKSkgYXMgYW55W11cblxuICAgICAgICBpZiAoZGVwbG95ZWRQcm9maWxlPy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBkZXBsb3llZFByb2ZpbGVbMF0uYXZhdGFyc1swXS5hdmF0YXIud2VhcmFibGVzLnB1c2goLi4ucHJldmlld1dlYXJhYmxlcylcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogcmVxLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSB8fCAnYXBwbGljYXRpb24vYmluYXJ5J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IGRlcGxveWVkUHJvZmlsZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gY2F0Y2ggcHJvZmlsZSBhbmQgZmlsbCB3aXRoIHByZXZpZXcgd2VhcmFibGVzLmAsIGVycilcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dCgpXG4gIH0pXG5cbiAgcm91dGVyLmFsbCgnL2xhbWJkYXMvOnBhdGgrJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIGNvbnN0IGNhdGFseXN0VXJsID0gZ2V0Q2F0YWx5c3RVcmwoKVxuICAgIGNvbnN0IHUgPSBuZXcgVVJMKGN0eC51cmwudG9TdHJpbmcoKSlcbiAgICB1Lmhvc3QgPSBjYXRhbHlzdFVybC5ob3N0XG4gICAgdS5wcm90b2NvbCA9IGNhdGFseXN0VXJsLnByb3RvY29sXG4gICAgdS5wb3J0ID0gY2F0YWx5c3RVcmwucG9ydFxuICAgIGNvbnN0IHJlcSA9IGF3YWl0IGZldGNoKHUudG9TdHJpbmcoKSwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBjb25uZWN0aW9uOiAnY2xvc2UnXG4gICAgICB9LFxuICAgICAgbWV0aG9kOiBjdHgucmVxdWVzdC5tZXRob2QsXG4gICAgICBib2R5OiBjdHgucmVxdWVzdC5tZXRob2QgPT09ICdnZXQnID8gdW5kZWZpbmVkIDogY3R4LnJlcXVlc3QuYm9keVxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnY29udGVudC10eXBlJzogcmVxLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSB8fCAnYXBwbGljYXRpb24vYmluYXJ5J1xuICAgICAgfSxcbiAgICAgIGJvZHk6IHJlcS5ib2R5XG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5wb3N0KCcvY29udGVudC9lbnRpdGllcycsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBjYXRhbHlzdFVybCA9IGdldENhdGFseXN0VXJsKClcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAgIGNvbnNvbGUubG9nKGN0eC5yZXF1ZXN0LmhlYWRlcnMpXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7Y2F0YWx5c3RVcmwudG9TdHJpbmcoKX0vY29udGVudC9lbnRpdGllc2AsIHtcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHk6IGN0eC5yZXF1ZXN0LmJvZHlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlc1xuICB9KVxuXG4gIHNlcnZlU3RhdGljKGRpciwgcm91dGVyKVxuXG4gIC8vIFRPRE86IGdldCB3b3Jrc3BhY2Ugc2NlbmVzICYgd2VhcmFibGVzLi4uXG5cbiAgc2VydmVGb2xkZXJzKHJvdXRlciwgYmFzZUZvbGRlcnMpXG59XG5cbmZ1bmN0aW9uIHNlcnZlRm9sZGVycyhyb3V0ZXI6IFJvdXRlcjxQcmV2aWV3Q29tcG9uZW50cz4sIGJhc2VGb2xkZXJzOiBzdHJpbmdbXSkge1xuICByb3V0ZXIuZ2V0KCcvY29udGVudC9jb250ZW50cy86aGFzaCcsIGFzeW5jIChjdHg6IGFueSwgbmV4dDogYW55KSA9PiB7XG4gICAgaWYgKGN0eC5wYXJhbXMuaGFzaCAmJiBjdHgucGFyYW1zLmhhc2guc3RhcnRzV2l0aCgnYjY0LScpKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShCdWZmZXIuZnJvbShjdHgucGFyYW1zLmhhc2gucmVwbGFjZSgvXmI2NC0vLCAnJyksICdiYXNlNjQnKS50b1N0cmluZygndXRmOCcpKVxuXG4gICAgICAvLyBvbmx5IHJldHVybiBmaWxlcyBJRiB0aGUgZmlsZSBpcyB3aXRoaW4gYSBiYXNlRm9sZGVyXG4gICAgICBpZiAoIWJhc2VGb2xkZXJzLmZpbmQoKGZvbGRlcjogc3RyaW5nKSA9PiBmdWxsUGF0aC5zdGFydHNXaXRoKGZvbGRlcikpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICd4LXRpbWVzdGFtcCc6IERhdGUubm93KCksXG4gICAgICAgICAgJ3gtc2VudCc6IHRydWUsXG4gICAgICAgICAgJ2NhY2hlLWNvbnRyb2wnOiAnbm8tY2FjaGUscHJpdmF0ZSxtYXgtYWdlPTEnXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IGZzLmNyZWF0ZVJlYWRTdHJlYW0oZnVsbFBhdGgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQoKVxuICB9KVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHBvaW50ZXJSZXF1ZXN0SGFuZGxlcihwb2ludGVyczogc3RyaW5nW10pIHtcbiAgICBpZiAoIXBvaW50ZXJzIHx8IHBvaW50ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdGVkUG9pbnRlcnMgPSBuZXcgU2V0PHN0cmluZz4oXG4gICAgICBwb2ludGVycyAmJiB0eXBlb2YgcG9pbnRlcnMgPT09ICdzdHJpbmcnID8gW3BvaW50ZXJzIGFzIHN0cmluZ10gOiAocG9pbnRlcnMgYXMgc3RyaW5nW10pXG4gICAgKVxuXG4gICAgY29uc3QgcmVzdWx0RW50aXRpZXMgPSBnZXRTY2VuZUpzb24oe1xuICAgICAgYmFzZUZvbGRlcnMsXG4gICAgICBwb2ludGVyczogQXJyYXkuZnJvbShyZXF1ZXN0ZWRQb2ludGVycylcbiAgICB9KVxuICAgIGNvbnN0IGNhdGFseXN0VXJsID0gZ2V0Q2F0YWx5c3RVcmwoKVxuICAgIGNvbnN0IHJlbW90ZSA9IGZldGNoRW50aXR5QnlQb2ludGVyKFxuICAgICAgY2F0YWx5c3RVcmwudG9TdHJpbmcoKSxcbiAgICAgIHBvaW50ZXJzLmZpbHRlcigoJDogc3RyaW5nKSA9PiAhJC5tYXRjaCgvLT9cXGQrLC0/XFxkKy8pKVxuICAgIClcblxuICAgIGNvbnN0IHNlcnZlckVudGl0aWVzID0gQXJyYXkuaXNBcnJheShyZW1vdGUpID8gcmVtb3RlIDogW11cblxuICAgIHJldHVybiBbLi4ucmVzdWx0RW50aXRpZXMsIC4uLnNlcnZlckVudGl0aWVzXVxuICB9XG5cbiAgLy8gUkVWSUVXIFJFU1BPTlNFIEZPUk1BVFxuICByb3V0ZXIuZ2V0KCcvY29udGVudC9lbnRpdGllcy9zY2VuZScsIGFzeW5jIChjdHgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9keTogYXdhaXQgcG9pbnRlclJlcXVlc3RIYW5kbGVyKGN0eC51cmwuc2VhcmNoUGFyYW1zLmdldEFsbCgncG9pbnRlcicpKVxuICAgIH1cbiAgfSlcblxuICAvLyBSRVZJRVcgUkVTUE9OU0UgRk9STUFUXG4gIHJvdXRlci5wb3N0KCcvY29udGVudC9lbnRpdGllcy9hY3RpdmUnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IGN0eC5yZXF1ZXN0Lmpzb24oKVxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBhd2FpdCBwb2ludGVyUmVxdWVzdEhhbmRsZXIoYm9keS5wb2ludGVycylcbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL3ByZXZpZXctd2VhcmFibGVzLzppZCcsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBiYXNlVXJsID0gYCR7Y3R4LnVybC5wcm90b2NvbH0vLyR7Y3R4LnVybC5ob3N0fS9jb250ZW50L2NvbnRlbnRzYFxuICAgIGNvbnN0IHdlYXJhYmxlcyA9IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoe1xuICAgICAgYmFzZVVybCxcbiAgICAgIGJhc2VGb2xkZXJzXG4gICAgfSlcbiAgICBjb25zdCB3ZWFyYWJsZUlkID0gY3R4LnBhcmFtcy5pZFxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiB7XG4gICAgICAgIG9rOiB0cnVlLFxuICAgICAgICBkYXRhOiB3ZWFyYWJsZXMuZmlsdGVyKCh3ZWFyYWJsZSkgPT4gc21hcnRXZWFyYWJsZU5hbWVUb0lkKHdlYXJhYmxlPy5uYW1lKSA9PT0gd2VhcmFibGVJZClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL3ByZXZpZXctd2VhcmFibGVzJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtjdHgudXJsLnByb3RvY29sfS8vJHtjdHgudXJsLmhvc3R9L2NvbnRlbnQvY29udGVudHNgXG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIGRhdGE6IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoeyBiYXNlVXJsLCBiYXNlRm9sZGVycyB9KVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgZGVmYXVsdEhhc2hNYWtlciA9IChzdHI6IHN0cmluZykgPT4gJ2I2NC0nICsgQnVmZmVyLmZyb20oc3RyKS50b1N0cmluZygnYmFzZTY0JylcblxuZnVuY3Rpb24gZ2V0QWxsUHJldmlld1dlYXJhYmxlcyh7IGJhc2VGb2xkZXJzLCBiYXNlVXJsIH06IHsgYmFzZUZvbGRlcnM6IHN0cmluZ1tdOyBiYXNlVXJsOiBzdHJpbmcgfSkge1xuICBjb25zdCB3ZWFyYWJsZVBhdGhBcnJheTogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHdlYXJhYmxlRGlyIG9mIGJhc2VGb2xkZXJzKSB7XG4gICAgY29uc3Qgd2VhcmFibGVKc29uUGF0aCA9IHBhdGgucmVzb2x2ZSh3ZWFyYWJsZURpciwgJ3dlYXJhYmxlLmpzb24nKVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHdlYXJhYmxlSnNvblBhdGgpKSB7XG4gICAgICB3ZWFyYWJsZVBhdGhBcnJheS5wdXNoKHdlYXJhYmxlSnNvblBhdGgpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmV0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXJ2ZVdlYXJhYmxlPltdID0gW11cbiAgZm9yIChjb25zdCB3ZWFyYWJsZUpzb25QYXRoIG9mIHdlYXJhYmxlUGF0aEFycmF5KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldC5wdXNoKHNlcnZlV2VhcmFibGUoeyB3ZWFyYWJsZUpzb25QYXRoLCBiYXNlVXJsIH0pKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgQ291bGRuJ3QgbW9jayB0aGUgd2VhcmFibGUgJHt3ZWFyYWJsZUpzb25QYXRofS4gUGxlYXNlIHZlcmlmeSB0aGUgY29ycmVjdCBmb3JtYXQgYW5kIHNjaGVtZS5gLCBlcnIpXG4gICAgfVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gc2VydmVXZWFyYWJsZSh7IHdlYXJhYmxlSnNvblBhdGgsIGJhc2VVcmwgfTogeyB3ZWFyYWJsZUpzb25QYXRoOiBzdHJpbmc7IGJhc2VVcmw6IHN0cmluZyB9KSB7XG4gIGNvbnN0IHdlYXJhYmxlRGlyID0gcGF0aC5kaXJuYW1lKHdlYXJhYmxlSnNvblBhdGgpXG4gIGNvbnN0IHdlYXJhYmxlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHdlYXJhYmxlSnNvblBhdGgpLnRvU3RyaW5nKCkpXG5cbiAgaWYgKCFXZWFyYWJsZUpzb24udmFsaWRhdGUod2VhcmFibGVKc29uKSkge1xuICAgIGNvbnN0IGVycm9ycyA9IChXZWFyYWJsZUpzb24udmFsaWRhdGUuZXJyb3JzIHx8IFtdKS5tYXAoKGEpID0+IGAke2EuZGF0YX0gJHthLm1lc3NhZ2V9YCkuam9pbignJylcblxuICAgIGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byB2YWxpZGF0ZSB3ZWFyYWJsZS5qc29uIHByb3Blcmx5LCBwbGVhc2UgY2hlY2sgaXQuYCwgZXJyb3JzKVxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB3ZWFyYWJsZS5qc29uICgke3dlYXJhYmxlSnNvblBhdGh9KWApXG4gIH1cblxuICBjb25zdCBkY2xJZ25vcmVQYXRoID0gcGF0aC5yZXNvbHZlKHdlYXJhYmxlRGlyLCAnLmRjbGlnbm9yZScpXG4gIGxldCBpZ25vcmVGaWxlQ29udGVudCA9ICcnXG4gIGlmIChmcy5leGlzdHNTeW5jKGRjbElnbm9yZVBhdGgpKSB7XG4gICAgaWdub3JlRmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHdlYXJhYmxlRGlyLCAnLmRjbGlnbm9yZScpLCAndXRmLTgnKVxuICB9XG5cbiAgY29uc3QgaGFzaGVkRmlsZXMgPSBnZXRGaWxlc0Zyb21Gb2xkZXIoe1xuICAgIGZvbGRlcjogd2VhcmFibGVEaXIsXG4gICAgYWRkT3JpZ2luYWxQYXRoOiBmYWxzZSxcbiAgICBpZ25vcmVQYXR0ZXJuOiBpZ25vcmVGaWxlQ29udGVudFxuICB9KVxuXG4gIGNvbnN0IHRodW1ibmFpbEZpbHRlcmVkID0gaGFzaGVkRmlsZXMuZmlsdGVyKCgkKSA9PiAkPy5maWxlID09PSAndGh1bWJuYWlsLnBuZycpXG4gIGNvbnN0IHRodW1ibmFpbCA9XG4gICAgdGh1bWJuYWlsRmlsdGVyZWQubGVuZ3RoID4gMCAmJiB0aHVtYm5haWxGaWx0ZXJlZFswXT8uaGFzaCAmJiBgJHtiYXNlVXJsfS8ke3RodW1ibmFpbEZpbHRlcmVkWzBdLmhhc2h9YFxuXG4gIGNvbnN0IHdlYXJhYmxlSWQgPSAndXJuOjhkYzJkN2FkLTk3ZTMtNDRkMC1iYTg5LWU4MzA1ZDc5NWE2YSdcblxuICBjb25zdCByZXByZXNlbnRhdGlvbnMgPSB3ZWFyYWJsZUpzb24uZGF0YS5yZXByZXNlbnRhdGlvbnMubWFwKChyZXByZXNlbnRhdGlvbikgPT4gKHtcbiAgICAuLi5yZXByZXNlbnRhdGlvbixcbiAgICBtYWluRmlsZTogYG1hbGUvJHtyZXByZXNlbnRhdGlvbi5tYWluRmlsZX1gLFxuICAgIGNvbnRlbnRzOiBoYXNoZWRGaWxlcy5tYXAoKCQpID0+ICh7XG4gICAgICBrZXk6IGBtYWxlLyR7JD8uZmlsZX1gLFxuICAgICAgdXJsOiBgJHtiYXNlVXJsfS8keyQ/Lmhhc2h9YCxcbiAgICAgIGhhc2g6ICQ/Lmhhc2hcbiAgICB9KSlcbiAgfSkpXG5cbiAgcmV0dXJuIHtcbiAgICBpZDogd2VhcmFibGVJZCxcbiAgICByYXJpdHk6IHdlYXJhYmxlSnNvbi5yYXJpdHksXG4gICAgaTE4bjogW3sgY29kZTogJ2VuJywgdGV4dDogd2VhcmFibGVKc29uLm5hbWUgfV0sXG4gICAgZGVzY3JpcHRpb246IHdlYXJhYmxlSnNvbi5kZXNjcmlwdGlvbixcbiAgICB0aHVtYm5haWw6IHRodW1ibmFpbCB8fCAnJyxcbiAgICBiYXNlVXJsOiBgJHtiYXNlVXJsfS9gLFxuICAgIG5hbWU6IHdlYXJhYmxlSnNvbi5uYW1lIHx8ICcnLFxuICAgIGRhdGE6IHtcbiAgICAgIGNhdGVnb3J5OiB3ZWFyYWJsZUpzb24uZGF0YS5jYXRlZ29yeSxcbiAgICAgIHJlcGxhY2VzOiBbXSxcbiAgICAgIGhpZGVzOiBbXSxcbiAgICAgIHRhZ3M6IFtdLFxuICAgICAgc2NlbmU6IGhhc2hlZEZpbGVzLFxuICAgICAgcmVwcmVzZW50YXRpb25zOiByZXByZXNlbnRhdGlvbnMgYXMgYW55XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNjZW5lSnNvbih7XG4gIGJhc2VGb2xkZXJzLFxuICBwb2ludGVycyxcbiAgY3VzdG9tSGFzaE1ha2VyXG59OiB7XG4gIGJhc2VGb2xkZXJzOiBzdHJpbmdbXVxuICBwb2ludGVyczogc3RyaW5nW11cbiAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbn0pOiBFbnRpdHlbXSB7XG4gIGNvbnN0IHJlcXVlc3RlZFBvaW50ZXJzID0gbmV3IFNldDxzdHJpbmc+KHBvaW50ZXJzKVxuICBjb25zdCByZXN1bHRFbnRpdGllczogRW50aXR5W10gPSBbXVxuXG4gIGNvbnN0IGFsbERlcGxveW1lbnRzID0gYmFzZUZvbGRlcnMubWFwKChmb2xkZXIpID0+IHtcbiAgICBjb25zdCBkY2xJZ25vcmVQYXRoID0gcGF0aC5yZXNvbHZlKGZvbGRlciwgJy5kY2xpZ25vcmUnKVxuICAgIGxldCBpZ25vcmVGaWxlQ29udGVudCA9ICcnXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGNsSWdub3JlUGF0aCkpIHtcbiAgICAgIGlnbm9yZUZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShmb2xkZXIsICcuZGNsaWdub3JlJyksICd1dGYtOCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eVYzRnJvbUZvbGRlcih7XG4gICAgICBmb2xkZXIsXG4gICAgICBhZGRPcmlnaW5hbFBhdGg6IGZhbHNlLFxuICAgICAgaWdub3JlUGF0dGVybjogaWdub3JlRmlsZUNvbnRlbnQsXG4gICAgICBjdXN0b21IYXNoTWFrZXJcbiAgICB9KVxuICB9KVxuXG4gIGZvciAoY29uc3QgcG9pbnRlciBvZiBBcnJheS5mcm9tKHJlcXVlc3RlZFBvaW50ZXJzKSkge1xuICAgIC8vIGdldCBkZXBsb3ltZW50IGJ5IHBvaW50ZXJcbiAgICBjb25zdCB0aGVEZXBsb3ltZW50ID0gYWxsRGVwbG95bWVudHMuZmluZCgoJCkgPT4gJCAmJiAkLnBvaW50ZXJzLmluY2x1ZGVzKHBvaW50ZXIpKVxuICAgIGlmICh0aGVEZXBsb3ltZW50KSB7XG4gICAgICAvLyByZW1vdmUgYWxsIHRoZSByZXF1aXJlZCBwb2ludGVycyBmcm9tIHRoZSByZXF1ZXN0ZWRQb2ludGVycyBzZXRcbiAgICAgIC8vIHRvIHByZXZlbnQgc2VuZGluZyBkdXBsaWNhdGVkIGVudGl0aWVzXG4gICAgICB0aGVEZXBsb3ltZW50LnBvaW50ZXJzLmZvckVhY2goKCQpID0+IHJlcXVlc3RlZFBvaW50ZXJzLmRlbGV0ZSgkKSlcblxuICAgICAgLy8gYWRkIHRoZSBkZXBsb3ltZW50IHRvIHRoZSByZXN1bHRzXG4gICAgICByZXN1bHRFbnRpdGllcy5wdXNoKHRoZURlcGxveW1lbnQpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdEVudGl0aWVzXG59XG5cbmZ1bmN0aW9uIGdldEVjc1BhdGgod29ya2luZ0Rpcjogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUucmVzb2x2ZSgnZGVjZW50cmFsYW5kLWVjcy9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW3dvcmtpbmdEaXJdXG4gICAgfSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiByZXF1aXJlLnJlc29sdmUoJ0BkY2wvc2RrL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIHBhdGhzOiBbd29ya2luZ0Rpcl1cbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHNlcnZlU3RhdGljKGRpcjogc3RyaW5nLCByb3V0ZXI6IFJvdXRlcjxQcmV2aWV3Q29tcG9uZW50cz4pIHtcbiAgY29uc3QgZWNzUGF0aCA9IHBhdGguZGlybmFtZShnZXRFY3NQYXRoKGRpcikpXG4gIGNvbnN0IGRjbEtlcm5lbFBhdGggPSBwYXRoLmRpcm5hbWUoXG4gICAgcmVxdWlyZS5yZXNvbHZlKCdAZGNsL2tlcm5lbC9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW2RpciwgZWNzUGF0aF1cbiAgICB9KVxuICApXG4gIGNvbnN0IGRjbEtlcm5lbERlZmF1bHRQcm9maWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkY2xLZXJuZWxQYXRoLCAnZGVmYXVsdC1wcm9maWxlJylcbiAgY29uc3QgZGNsS2VybmVsSW1hZ2VzRGVjZW50cmFsYW5kQ29ubmVjdCA9IHBhdGgucmVzb2x2ZShkY2xLZXJuZWxQYXRoLCAnaW1hZ2VzJywgJ2RlY2VudHJhbGFuZC1jb25uZWN0JylcbiAgY29uc3QgZGNsS2VybmVsTG9hZGVyUGF0aCA9IHBhdGgucmVzb2x2ZShkY2xLZXJuZWxQYXRoLCAnbG9hZGVyJylcbiAgY29uc3QgZGNsVW5pdHlSZW5kZXJlciA9IHBhdGguZGlybmFtZShcbiAgICByZXF1aXJlLnJlc29sdmUoJ0BkY2wvdW5pdHktcmVuZGVyZXIvcGFja2FnZS5qc29uJywge1xuICAgICAgcGF0aHM6IFtkaXIsIGVjc1BhdGhdXG4gICAgfSlcbiAgKVxuXG4gIGNvbnN0IHJvdXRlcyA9IFtcbiAgICB7XG4gICAgICByb3V0ZTogJy8nLFxuICAgICAgcGF0aDogcGF0aC5yZXNvbHZlKGRjbEtlcm5lbFBhdGgsICdwcmV2aWV3Lmh0bWwnKSxcbiAgICAgIHR5cGU6ICd0ZXh0L2h0bWwnXG4gICAgfSxcbiAgICB7XG4gICAgICByb3V0ZTogJy9mYXZpY29uLmljbycsXG4gICAgICBwYXRoOiBwYXRoLnJlc29sdmUoZGNsS2VybmVsUGF0aCwgJ2Zhdmljb24uaWNvJyksXG4gICAgICB0eXBlOiAndGV4dC9odG1sJ1xuICAgIH0sXG4gICAge1xuICAgICAgcm91dGU6ICcvQC9hcnRpZmFjdHMvaW5kZXguanMnLFxuICAgICAgcGF0aDogcGF0aC5yZXNvbHZlKGRjbEtlcm5lbFBhdGgsICdpbmRleC5qcycpLFxuICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCdcbiAgICB9XG4gIF1cblxuICBmb3IgKGNvbnN0IHJvdXRlIG9mIHJvdXRlcykge1xuICAgIHJvdXRlci5nZXQocm91dGUucm91dGUsIGFzeW5jIChfY3R4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiByb3V0ZS50eXBlIH0sXG4gICAgICAgIGJvZHk6IGZzLmNyZWF0ZVJlYWRTdHJlYW0ocm91dGUucGF0aClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RhdGljUm91dGVzKHJvdXRlOiBzdHJpbmcsIGZvbGRlcjogc3RyaW5nLCB0cmFuc2Zvcm0gPSAoc3RyOiBzdHJpbmcpID0+IHN0cikge1xuICAgIHJvdXRlci5nZXQocm91dGUsIGFzeW5jIChjdHgsIG5leHQpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBjdHgucGFyYW1zLnBhdGhcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKGZvbGRlciwgdHJhbnNmb3JtKGZpbGUpKVxuXG4gICAgICAvLyBvbmx5IHJldHVybiBmaWxlcyBJRiB0aGUgZmlsZSBpcyB3aXRoaW4gYSBiYXNlRm9sZGVyXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZnVsbFBhdGgpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KClcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgICAgJ3gtdGltZXN0YW1wJzogRGF0ZS5ub3coKSxcbiAgICAgICAgJ3gtc2VudCc6IHRydWUsXG4gICAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlLHByaXZhdGUsbWF4LWFnZT0xJ1xuICAgICAgfVxuXG4gICAgICBpZiAoZnVsbFBhdGguZW5kc1dpdGgoJy53YXNtJykpIHtcbiAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSAnYXBwbGljYXRpb24vd2FzbSdcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgYm9keTogZnMuY3JlYXRlUmVhZFN0cmVhbShmdWxsUGF0aClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY3JlYXRlU3RhdGljUm91dGVzKCcvaW1hZ2VzL2RlY2VudHJhbGFuZC1jb25uZWN0LzpwYXRoKycsIGRjbEtlcm5lbEltYWdlc0RlY2VudHJhbGFuZENvbm5lY3QpXG4gIGNyZWF0ZVN0YXRpY1JvdXRlcygnL0AvYXJ0aWZhY3RzL3VuaXR5LXJlbmRlcmVyLzpwYXRoKycsIGRjbFVuaXR5UmVuZGVyZXIsIChmaWxlUGF0aCkgPT5cbiAgICBmaWxlUGF0aC5yZXBsYWNlKC8uYnIrJC8sICcnKVxuICApXG4gIGNyZWF0ZVN0YXRpY1JvdXRlcygnL0AvYXJ0aWZhY3RzL2xvYWRlci86cGF0aCsnLCBkY2xLZXJuZWxMb2FkZXJQYXRoKVxuICBjcmVhdGVTdGF0aWNSb3V0ZXMoJy9kZWZhdWx0LXByb2ZpbGUvOnBhdGgrJywgZGNsS2VybmVsRGVmYXVsdFByb2ZpbGVQYXRoKVxuXG4gIHJvdXRlci5nZXQoJy9mZWF0dXJlLWZsYWdzLzpmaWxlJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwczovL2ZlYXR1cmUtZmxhZ3MuZGVjZW50cmFsYW5kLnpvbmUvJHtjdHgucGFyYW1zLmZpbGV9YCwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBjb25uZWN0aW9uOiAnY2xvc2UnXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4ge1xuICAgICAgYm9keTogYXdhaXQgcmVzLmFycmF5QnVmZmVyKClcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIGVudGl0eVYzRnJvbUZvbGRlcih7XG4gIGZvbGRlcixcbiAgYWRkT3JpZ2luYWxQYXRoLFxuICBpZ25vcmVQYXR0ZXJuLFxuICBjdXN0b21IYXNoTWFrZXJcbn06IHtcbiAgZm9sZGVyOiBzdHJpbmdcbiAgYWRkT3JpZ2luYWxQYXRoPzogYm9vbGVhblxuICBpZ25vcmVQYXR0ZXJuPzogc3RyaW5nXG4gIGN1c3RvbUhhc2hNYWtlcj86IChzdHI6IHN0cmluZykgPT4gc3RyaW5nXG59KTogRW50aXR5IHwgbnVsbCB7XG4gIGNvbnN0IHNjZW5lSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZm9sZGVyLCAnLi9zY2VuZS5qc29uJylcbiAgbGV0IGlzUGFyY2VsU2NlbmUgPSB0cnVlXG5cbiAgY29uc3Qgd2VhcmFibGVKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShmb2xkZXIsICcuL3dlYXJhYmxlLmpzb24nKVxuICBpZiAoZnMuZXhpc3RzU3luYyh3ZWFyYWJsZUpzb25QYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWFyYWJsZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh3ZWFyYWJsZUpzb25QYXRoKS50b1N0cmluZygpKVxuICAgICAgaWYgKCFXZWFyYWJsZUpzb24udmFsaWRhdGUod2VhcmFibGVKc29uKSkge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSAoV2VhcmFibGVKc29uLnZhbGlkYXRlLmVycm9ycyB8fCBbXSkubWFwKChhKSA9PiBgJHthLmRhdGF9ICR7YS5tZXNzYWdlfWApLmpvaW4oJycpXG5cbiAgICAgICAgY29uc29sZS5lcnJvcihgVW5hYmxlIHRvIHZhbGlkYXRlIHdlYXJhYmxlLmpzb24gcHJvcGVybHksIHBsZWFzZSBjaGVjayBpdC5gLCBlcnJvcnMpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgd2VhcmFibGUuanNvbiAoJHt3ZWFyYWJsZUpzb25QYXRofSlgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNQYXJjZWxTY2VuZSA9IGZhbHNlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBVbmFibGUgdG8gbG9hZCB3ZWFyYWJsZS5qc29uIHByb3Blcmx5YCwgZXJyKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhc2hNYWtlciA9IGN1c3RvbUhhc2hNYWtlciA/IGN1c3RvbUhhc2hNYWtlciA6IGRlZmF1bHRIYXNoTWFrZXJcblxuICBpZiAoZnMuZXhpc3RzU3luYyhzY2VuZUpzb25QYXRoKSAmJiBpc1BhcmNlbFNjZW5lKSB7XG4gICAgY29uc3Qgc2NlbmVKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoc2NlbmVKc29uUGF0aCkudG9TdHJpbmcoKSlcbiAgICBjb25zdCB7IGJhc2UsIHBhcmNlbHMgfTogeyBiYXNlOiBzdHJpbmc7IHBhcmNlbHM6IHN0cmluZ1tdIH0gPSBzY2VuZUpzb24uc2NlbmVcbiAgICBjb25zdCBwb2ludGVycyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgcG9pbnRlcnMuYWRkKGJhc2UpXG4gICAgcGFyY2Vscy5mb3JFYWNoKCgkKSA9PiBwb2ludGVycy5hZGQoJCkpXG5cbiAgICBjb25zdCBtYXBwZWRGaWxlcyA9IGdldEZpbGVzRnJvbUZvbGRlcih7XG4gICAgICBmb2xkZXIsXG4gICAgICBhZGRPcmlnaW5hbFBhdGgsXG4gICAgICBpZ25vcmVQYXR0ZXJuLFxuICAgICAgY3VzdG9tSGFzaE1ha2VyXG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiAndjMnLFxuICAgICAgdHlwZTogRW50aXR5VHlwZS5TQ0VORSxcbiAgICAgIGlkOiBoYXNoTWFrZXIoZm9sZGVyKSxcbiAgICAgIHBvaW50ZXJzOiBBcnJheS5mcm9tKHBvaW50ZXJzKSxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1ldGFkYXRhOiBzY2VuZUpzb24sXG4gICAgICBjb250ZW50OiBtYXBwZWRGaWxlc1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IGRlZmF1bHREY2xJZ25vcmUgPSAoKSA9PlxuICBbXG4gICAgJy4qJyxcbiAgICAncGFja2FnZS5qc29uJyxcbiAgICAncGFja2FnZS1sb2NrLmpzb24nLFxuICAgICd5YXJuLWxvY2suanNvbicsXG4gICAgJ2J1aWxkLmpzb24nLFxuICAgICdleHBvcnQnLFxuICAgICd0c2NvbmZpZy5qc29uJyxcbiAgICAndHNsaW50Lmpzb24nLFxuICAgICdub2RlX21vZHVsZXMnLFxuICAgICcqLnRzJyxcbiAgICAnKi50c3gnLFxuICAgICdEb2NrZXJmaWxlJyxcbiAgICAnZGlzdCcsXG4gICAgJ1JFQURNRS5tZCcsXG4gICAgJyouYmxlbmQnLFxuICAgICcqLmZieCcsXG4gICAgJyouemlwJyxcbiAgICAnKi5yYXInXG4gIF0uam9pbignXFxuJylcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVzRnJvbUZvbGRlcih7XG4gIGZvbGRlcixcbiAgYWRkT3JpZ2luYWxQYXRoLFxuICBpZ25vcmVQYXR0ZXJuLFxuICBjdXN0b21IYXNoTWFrZXJcbn06IHtcbiAgZm9sZGVyOiBzdHJpbmdcbiAgYWRkT3JpZ2luYWxQYXRoPzogYm9vbGVhblxuICBpZ25vcmVQYXR0ZXJuPzogc3RyaW5nXG4gIGN1c3RvbUhhc2hNYWtlcj86IChzdHI6IHN0cmluZykgPT4gc3RyaW5nXG59KTogQ29udGVudE1hcHBpbmdbXSB7XG4gIGNvbnN0IGhhc2hNYWtlciA9IGN1c3RvbUhhc2hNYWtlciA/IGN1c3RvbUhhc2hNYWtlciA6IGRlZmF1bHRIYXNoTWFrZXJcblxuICBjb25zdCBhbGxGaWxlcyA9IGdsb2JTeW5jKCcqKi8qJywge1xuICAgIGN3ZDogZm9sZGVyLFxuICAgIGRvdDogZmFsc2UsXG4gICAgYWJzb2x1dGU6IHRydWVcbiAgfSlcbiAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKGZpbGUpLmlzRmlsZSgpKSByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IF9mb2xkZXIgPSBmb2xkZXIucmVwbGFjZSgvXFxcXC9naSwgJy8nKVxuICAgICAgY29uc3Qga2V5ID0gZmlsZS5yZXBsYWNlKF9mb2xkZXIsICcnKS5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgICAgcmV0dXJuIGtleVxuICAgIH0pXG4gICAgLmZpbHRlcigoJCkgPT4gISEkKSBhcyBzdHJpbmdbXVxuXG4gIGNvbnN0IGVuc3VyZUlnbm9yZVBhdHRlcm4gPSBpZ25vcmVQYXR0ZXJuICYmIGlnbm9yZVBhdHRlcm4gIT09ICcnID8gaWdub3JlUGF0dGVybiA6IGRlZmF1bHREY2xJZ25vcmUoKVxuICBjb25zdCBpZyA9IGlnbm9yZSgpLmFkZChlbnN1cmVJZ25vcmVQYXR0ZXJuKVxuICBjb25zdCBmaWx0ZXJlZEZpbGVzID0gaWcuZmlsdGVyKGFsbEZpbGVzKVxuXG4gIGNvbnN0IHJldDogKENvbnRlbnRNYXBwaW5nICYgeyBvcmlnaW5hbF9wYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgfSlbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbHRlcmVkRmlsZXMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZm9sZGVyLCBmaWxlKVxuICAgIHRyeSB7XG4gICAgICBpZiAoIWZzLnN0YXRTeW5jKGFic29sdXRlUGF0aCkuaXNGaWxlKCkpIGNvbnRpbnVlXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGFic29sdXRlRm9sZGVyID0gZm9sZGVyLnJlcGxhY2UoL1xcXFwvZ2ksICcvJylcblxuICAgIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGhUb0ZvbGRlciA9IGZpbGUucmVwbGFjZShhYnNvbHV0ZUZvbGRlciwgJycpLnJlcGxhY2UoL15cXC8rLywgJycpXG5cbiAgICByZXQucHVzaCh7XG4gICAgICBmaWxlOiByZWxhdGl2ZUZpbGVQYXRoVG9Gb2xkZXIudG9Mb3dlckNhc2UoKSxcbiAgICAgIG9yaWdpbmFsX3BhdGg6IGFkZE9yaWdpbmFsUGF0aCA/IGFic29sdXRlUGF0aCA6IHVuZGVmaW5lZCxcbiAgICAgIGhhc2g6IGhhc2hNYWtlcihhYnNvbHV0ZVBhdGgpXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiByZXRcbn1cbiJdfQ==
|