@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.
- package/package.json +6 -33
- package/cli/commands/build/helpers.d.ts +0 -21
- package/cli/commands/build/helpers.js +0 -50
- package/cli/commands/build/helpers.ts +0 -89
- package/cli/commands/build/index.d.ts +0 -19
- package/cli/commands/build/index.js +0 -69
- package/cli/commands/build/index.ts +0 -91
- package/cli/commands/init/index.d.ts +0 -17
- package/cli/commands/init/index.js +0 -53
- package/cli/commands/init/index.ts +0 -69
- package/cli/commands/init/repos.d.ts +0 -9
- package/cli/commands/init/repos.js +0 -12
- package/cli/commands/init/repos.ts +0 -17
- package/cli/commands/preview/bff.d.ts +0 -3
- package/cli/commands/preview/bff.js +0 -54
- package/cli/commands/preview/bff.ts +0 -63
- package/cli/commands/preview/catalyst.d.ts +0 -5
- package/cli/commands/preview/catalyst.js +0 -24
- package/cli/commands/preview/catalyst.ts +0 -31
- package/cli/commands/preview/coordinates.d.ts +0 -20
- package/cli/commands/preview/coordinates.js +0 -90
- package/cli/commands/preview/coordinates.ts +0 -146
- package/cli/commands/preview/endpoints.d.ts +0 -10
- package/cli/commands/preview/endpoints.js +0 -485
- package/cli/commands/preview/endpoints.ts +0 -578
- package/cli/commands/preview/eth.d.ts +0 -2
- package/cli/commands/preview/eth.js +0 -6
- package/cli/commands/preview/eth.ts +0 -3
- package/cli/commands/preview/index.d.ts +0 -20
- package/cli/commands/preview/index.js +0 -71
- package/cli/commands/preview/index.ts +0 -91
- package/cli/commands/preview/port.d.ts +0 -1
- package/cli/commands/preview/port.js +0 -21
- package/cli/commands/preview/port.ts +0 -15
- package/cli/commands/preview/project.d.ts +0 -14
- package/cli/commands/preview/project.js +0 -77
- package/cli/commands/preview/project.ts +0 -112
- package/cli/commands/preview/types.d.ts +0 -18
- package/cli/commands/preview/types.js +0 -3
- package/cli/commands/preview/types.ts +0 -26
- package/cli/commands/preview/wire.d.ts +0 -2
- package/cli/commands/preview/wire.js +0 -92
- package/cli/commands/preview/wire.ts +0 -107
- package/cli/commands/preview/ws.d.ts +0 -7
- package/cli/commands/preview/ws.js +0 -16
- package/cli/commands/preview/ws.ts +0 -24
- package/cli/commands/start/index.d.ts +0 -29
- package/cli/commands/start/index.js +0 -126
- package/cli/commands/start/index.ts +0 -145
- package/cli/components/fetch.d.ts +0 -5
- package/cli/components/fetch.js +0 -34
- package/cli/components/fetch.ts +0 -11
- package/cli/components/fs.d.ts +0 -11
- package/cli/components/fs.js +0 -60
- package/cli/components/fs.ts +0 -53
- package/cli/components/index.d.ts +0 -7
- package/cli/components/index.js +0 -13
- package/cli/components/index.ts +0 -14
- package/cli/index.d.ts +0 -7
- package/cli/index.js +0 -76
- package/cli/index.ts +0 -85
- package/cli/utils/args.d.ts +0 -10
- package/cli/utils/args.js +0 -16
- package/cli/utils/args.ts +0 -18
- package/cli/utils/commands.d.ts +0 -3
- package/cli/utils/commands.js +0 -24
- package/cli/utils/commands.ts +0 -28
- package/cli/utils/error.d.ts +0 -2
- package/cli/utils/error.js +0 -7
- package/cli/utils/error.ts +0 -1
- package/cli/utils/exec.d.ts +0 -8
- package/cli/utils/exec.js +0 -32
- package/cli/utils/exec.ts +0 -42
- package/cli/utils/fs.d.ts +0 -10
- package/cli/utils/fs.js +0 -26
- package/cli/utils/fs.ts +0 -41
- package/cli/utils/log.d.ts +0 -5
- package/cli/utils/log.js +0 -29
- package/cli/utils/log.ts +0 -39
- package/cli/utils/object.d.ts +0 -9
- package/cli/utils/object.js +0 -45
- package/cli/utils/object.ts +0 -62
- package/cli/utils/out-messages.d.ts +0 -1
- package/cli/utils/out-messages.js +0 -8
- package/cli/utils/out-messages.ts +0 -3
- package/cli/utils/prompt.d.ts +0 -1
- package/cli/utils/prompt.js +0 -17
- 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
|