@coralogix/rum-cli 1.1.1 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +50 -17
  2. package/api/rum-api.ts +50 -51
  3. package/cli/rum-cli.ts +41 -72
  4. package/cli/theme/index.ts +5 -0
  5. package/cli/validators/index.ts +14 -0
  6. package/dist/api/rum-api.d.ts +5 -2
  7. package/dist/api/rum-api.js +41 -36
  8. package/dist/cli/rum-cli.d.ts +1 -2
  9. package/dist/cli/rum-cli.js +24 -45
  10. package/dist/cli/theme/index.d.ts +3 -0
  11. package/dist/cli/theme/index.js +7 -0
  12. package/dist/cli/validators/index.d.ts +1 -0
  13. package/dist/cli/validators/index.js +16 -0
  14. package/dist/model/cli.model.js +1 -3
  15. package/dist/proto-models/com/coralogix/rum/v2/audit_log.js +62 -0
  16. package/dist/proto-models/com/coralogix/rum/v2/chunk.js +330 -0
  17. package/dist/proto-models/com/coralogix/rum/v2/file.js +140 -0
  18. package/dist/proto-models/com/coralogix/rum/v2/rum_service.js +233 -0
  19. package/dist/proto-models/com/coralogix/rum/v2/rum_source_map_service.js +181 -0
  20. package/dist/proto-models/com/coralogix/rum/v2/source_code_file_mapping.js +277 -0
  21. package/dist/proto-models/google/protobuf/descriptor.js +3612 -0
  22. package/dist/services/source-maps/source-maps.service.d.ts +3 -0
  23. package/dist/services/source-maps/source-maps.service.js +42 -0
  24. package/dist/services/source-maps/utils/traverse-folder.util.d.ts +2 -0
  25. package/dist/services/source-maps/utils/traverse-folder.util.js +42 -0
  26. package/generate-protos.sh +3 -3
  27. package/model/cli.model.ts +0 -2
  28. package/package.json +4 -4
  29. package/services/source-maps/source-maps.service.ts +31 -0
  30. package/{cli → services/source-maps}/utils/traverse-folder.util.ts +2 -2
  31. package/dist/cli/utils/traverse-folder.util.d.ts +0 -2
  32. package/dist/cli/utils/traverse-folder.util.js +0 -42
  33. package/dist/src/app/proto-models/com/coralogix/rum/v2/audit_log.js +0 -62
  34. package/dist/src/app/proto-models/com/coralogix/rum/v2/chunk.js +0 -330
  35. package/dist/src/app/proto-models/com/coralogix/rum/v2/file.js +0 -140
  36. package/dist/src/app/proto-models/com/coralogix/rum/v2/rum_service.js +0 -233
  37. package/dist/src/app/proto-models/com/coralogix/rum/v2/rum_source_map_service.js +0 -181
  38. package/dist/src/app/proto-models/com/coralogix/rum/v2/source_code_file_mapping.js +0 -277
  39. package/dist/src/app/proto-models/google/protobuf/descriptor.js +0 -3612
  40. /package/dist/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/audit_log.d.ts +0 -0
  41. /package/dist/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/chunk.d.ts +0 -0
  42. /package/dist/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/file.d.ts +0 -0
  43. /package/dist/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/rum_service.d.ts +0 -0
  44. /package/dist/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/rum_source_map_service.d.ts +0 -0
  45. /package/dist/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/source_code_file_mapping.d.ts +0 -0
  46. /package/dist/{src/app/proto-models → proto-models}/google/protobuf/descriptor.d.ts +0 -0
  47. /package/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/audit_log.ts +0 -0
  48. /package/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/chunk.ts +0 -0
  49. /package/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/file.ts +0 -0
  50. /package/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/rum_service.ts +0 -0
  51. /package/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/rum_source_map_service.ts +0 -0
  52. /package/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/source_code_file_mapping.ts +0 -0
  53. /package/{src/app/proto-models → proto-models}/google/protobuf/descriptor.ts +0 -0
@@ -0,0 +1,277 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SourceCodeLineMapping = exports.FileSourceCodeMap_FileNameToCodeEntry = exports.FileSourceCodeMap = exports.protobufPackage = void 0;
7
+ /* eslint-disable */
8
+ const minimal_1 = __importDefault(require("protobufjs/minimal"));
9
+ exports.protobufPackage = "com.coralogix.rum.v2";
10
+ function createBaseFileSourceCodeMap() {
11
+ return { fileNameToCode: {} };
12
+ }
13
+ exports.FileSourceCodeMap = {
14
+ encode(message, writer = minimal_1.default.Writer.create()) {
15
+ Object.entries(message.fileNameToCode).forEach(([key, value]) => {
16
+ exports.FileSourceCodeMap_FileNameToCodeEntry.encode({ key: key, value }, writer.uint32(10).fork()).ldelim();
17
+ });
18
+ return writer;
19
+ },
20
+ decode(input, length) {
21
+ const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
22
+ let end = length === undefined ? reader.len : reader.pos + length;
23
+ const message = createBaseFileSourceCodeMap();
24
+ while (reader.pos < end) {
25
+ const tag = reader.uint32();
26
+ switch (tag >>> 3) {
27
+ case 1:
28
+ if (tag !== 10) {
29
+ break;
30
+ }
31
+ const entry1 = exports.FileSourceCodeMap_FileNameToCodeEntry.decode(reader, reader.uint32());
32
+ if (entry1.value !== undefined) {
33
+ message.fileNameToCode[entry1.key] = entry1.value;
34
+ }
35
+ continue;
36
+ }
37
+ if ((tag & 7) === 4 || tag === 0) {
38
+ break;
39
+ }
40
+ reader.skipType(tag & 7);
41
+ }
42
+ return message;
43
+ },
44
+ fromJSON(object) {
45
+ return {
46
+ fileNameToCode: isObject(object.fileNameToCode)
47
+ ? Object.entries(object.fileNameToCode).reduce((acc, [key, value]) => {
48
+ acc[key] = String(value);
49
+ return acc;
50
+ }, {})
51
+ : {},
52
+ };
53
+ },
54
+ toJSON(message) {
55
+ const obj = {};
56
+ obj.fileNameToCode = {};
57
+ if (message.fileNameToCode) {
58
+ Object.entries(message.fileNameToCode).forEach(([k, v]) => {
59
+ obj.fileNameToCode[k] = v;
60
+ });
61
+ }
62
+ return obj;
63
+ },
64
+ create(base) {
65
+ return exports.FileSourceCodeMap.fromPartial(base !== null && base !== void 0 ? base : {});
66
+ },
67
+ fromPartial(object) {
68
+ var _a;
69
+ const message = createBaseFileSourceCodeMap();
70
+ message.fileNameToCode = Object.entries((_a = object.fileNameToCode) !== null && _a !== void 0 ? _a : {}).reduce((acc, [key, value]) => {
71
+ if (value !== undefined) {
72
+ acc[key] = String(value);
73
+ }
74
+ return acc;
75
+ }, {});
76
+ return message;
77
+ },
78
+ };
79
+ function createBaseFileSourceCodeMap_FileNameToCodeEntry() {
80
+ return { key: "", value: "" };
81
+ }
82
+ exports.FileSourceCodeMap_FileNameToCodeEntry = {
83
+ encode(message, writer = minimal_1.default.Writer.create()) {
84
+ if (message.key !== "") {
85
+ writer.uint32(10).string(message.key);
86
+ }
87
+ if (message.value !== "") {
88
+ writer.uint32(18).string(message.value);
89
+ }
90
+ return writer;
91
+ },
92
+ decode(input, length) {
93
+ const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
94
+ let end = length === undefined ? reader.len : reader.pos + length;
95
+ const message = createBaseFileSourceCodeMap_FileNameToCodeEntry();
96
+ while (reader.pos < end) {
97
+ const tag = reader.uint32();
98
+ switch (tag >>> 3) {
99
+ case 1:
100
+ if (tag !== 10) {
101
+ break;
102
+ }
103
+ message.key = reader.string();
104
+ continue;
105
+ case 2:
106
+ if (tag !== 18) {
107
+ break;
108
+ }
109
+ message.value = reader.string();
110
+ continue;
111
+ }
112
+ if ((tag & 7) === 4 || tag === 0) {
113
+ break;
114
+ }
115
+ reader.skipType(tag & 7);
116
+ }
117
+ return message;
118
+ },
119
+ fromJSON(object) {
120
+ return { key: isSet(object.key) ? String(object.key) : "", value: isSet(object.value) ? String(object.value) : "" };
121
+ },
122
+ toJSON(message) {
123
+ const obj = {};
124
+ message.key !== undefined && (obj.key = message.key);
125
+ message.value !== undefined && (obj.value = message.value);
126
+ return obj;
127
+ },
128
+ create(base) {
129
+ return exports.FileSourceCodeMap_FileNameToCodeEntry.fromPartial(base !== null && base !== void 0 ? base : {});
130
+ },
131
+ fromPartial(object) {
132
+ var _a, _b;
133
+ const message = createBaseFileSourceCodeMap_FileNameToCodeEntry();
134
+ message.key = (_a = object.key) !== null && _a !== void 0 ? _a : "";
135
+ message.value = (_b = object.value) !== null && _b !== void 0 ? _b : "";
136
+ return message;
137
+ },
138
+ };
139
+ function createBaseSourceCodeLineMapping() {
140
+ return {
141
+ chunkName: "",
142
+ sourceFileName: "",
143
+ originalLineNumber: 0,
144
+ generatedLineNumber: 0,
145
+ originalColumnNumber: 0,
146
+ generatedColumnNumber: 0,
147
+ sourceFunctionName: "",
148
+ };
149
+ }
150
+ exports.SourceCodeLineMapping = {
151
+ encode(message, writer = minimal_1.default.Writer.create()) {
152
+ if (message.chunkName !== "") {
153
+ writer.uint32(10).string(message.chunkName);
154
+ }
155
+ if (message.sourceFileName !== "") {
156
+ writer.uint32(18).string(message.sourceFileName);
157
+ }
158
+ if (message.originalLineNumber !== 0) {
159
+ writer.uint32(24).int32(message.originalLineNumber);
160
+ }
161
+ if (message.generatedLineNumber !== 0) {
162
+ writer.uint32(32).int32(message.generatedLineNumber);
163
+ }
164
+ if (message.originalColumnNumber !== 0) {
165
+ writer.uint32(40).int32(message.originalColumnNumber);
166
+ }
167
+ if (message.generatedColumnNumber !== 0) {
168
+ writer.uint32(48).int32(message.generatedColumnNumber);
169
+ }
170
+ if (message.sourceFunctionName !== "") {
171
+ writer.uint32(58).string(message.sourceFunctionName);
172
+ }
173
+ return writer;
174
+ },
175
+ decode(input, length) {
176
+ const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
177
+ let end = length === undefined ? reader.len : reader.pos + length;
178
+ const message = createBaseSourceCodeLineMapping();
179
+ while (reader.pos < end) {
180
+ const tag = reader.uint32();
181
+ switch (tag >>> 3) {
182
+ case 1:
183
+ if (tag !== 10) {
184
+ break;
185
+ }
186
+ message.chunkName = reader.string();
187
+ continue;
188
+ case 2:
189
+ if (tag !== 18) {
190
+ break;
191
+ }
192
+ message.sourceFileName = reader.string();
193
+ continue;
194
+ case 3:
195
+ if (tag !== 24) {
196
+ break;
197
+ }
198
+ message.originalLineNumber = reader.int32();
199
+ continue;
200
+ case 4:
201
+ if (tag !== 32) {
202
+ break;
203
+ }
204
+ message.generatedLineNumber = reader.int32();
205
+ continue;
206
+ case 5:
207
+ if (tag !== 40) {
208
+ break;
209
+ }
210
+ message.originalColumnNumber = reader.int32();
211
+ continue;
212
+ case 6:
213
+ if (tag !== 48) {
214
+ break;
215
+ }
216
+ message.generatedColumnNumber = reader.int32();
217
+ continue;
218
+ case 7:
219
+ if (tag !== 58) {
220
+ break;
221
+ }
222
+ message.sourceFunctionName = reader.string();
223
+ continue;
224
+ }
225
+ if ((tag & 7) === 4 || tag === 0) {
226
+ break;
227
+ }
228
+ reader.skipType(tag & 7);
229
+ }
230
+ return message;
231
+ },
232
+ fromJSON(object) {
233
+ return {
234
+ chunkName: isSet(object.chunkName) ? String(object.chunkName) : "",
235
+ sourceFileName: isSet(object.sourceFileName) ? String(object.sourceFileName) : "",
236
+ originalLineNumber: isSet(object.originalLineNumber) ? Number(object.originalLineNumber) : 0,
237
+ generatedLineNumber: isSet(object.generatedLineNumber) ? Number(object.generatedLineNumber) : 0,
238
+ originalColumnNumber: isSet(object.originalColumnNumber) ? Number(object.originalColumnNumber) : 0,
239
+ generatedColumnNumber: isSet(object.generatedColumnNumber) ? Number(object.generatedColumnNumber) : 0,
240
+ sourceFunctionName: isSet(object.sourceFunctionName) ? String(object.sourceFunctionName) : "",
241
+ };
242
+ },
243
+ toJSON(message) {
244
+ const obj = {};
245
+ message.chunkName !== undefined && (obj.chunkName = message.chunkName);
246
+ message.sourceFileName !== undefined && (obj.sourceFileName = message.sourceFileName);
247
+ message.originalLineNumber !== undefined && (obj.originalLineNumber = Math.round(message.originalLineNumber));
248
+ message.generatedLineNumber !== undefined && (obj.generatedLineNumber = Math.round(message.generatedLineNumber));
249
+ message.originalColumnNumber !== undefined && (obj.originalColumnNumber = Math.round(message.originalColumnNumber));
250
+ message.generatedColumnNumber !== undefined &&
251
+ (obj.generatedColumnNumber = Math.round(message.generatedColumnNumber));
252
+ message.sourceFunctionName !== undefined && (obj.sourceFunctionName = message.sourceFunctionName);
253
+ return obj;
254
+ },
255
+ create(base) {
256
+ return exports.SourceCodeLineMapping.fromPartial(base !== null && base !== void 0 ? base : {});
257
+ },
258
+ fromPartial(object) {
259
+ var _a, _b, _c, _d, _e, _f, _g;
260
+ const message = createBaseSourceCodeLineMapping();
261
+ message.chunkName = (_a = object.chunkName) !== null && _a !== void 0 ? _a : "";
262
+ message.sourceFileName = (_b = object.sourceFileName) !== null && _b !== void 0 ? _b : "";
263
+ message.originalLineNumber = (_c = object.originalLineNumber) !== null && _c !== void 0 ? _c : 0;
264
+ message.generatedLineNumber = (_d = object.generatedLineNumber) !== null && _d !== void 0 ? _d : 0;
265
+ message.originalColumnNumber = (_e = object.originalColumnNumber) !== null && _e !== void 0 ? _e : 0;
266
+ message.generatedColumnNumber = (_f = object.generatedColumnNumber) !== null && _f !== void 0 ? _f : 0;
267
+ message.sourceFunctionName = (_g = object.sourceFunctionName) !== null && _g !== void 0 ? _g : "";
268
+ return message;
269
+ },
270
+ };
271
+ function isObject(value) {
272
+ return typeof value === "object" && value !== null;
273
+ }
274
+ function isSet(value) {
275
+ return value !== null && value !== undefined;
276
+ }
277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlX2NvZGVfZmlsZV9tYXBwaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvdG8tbW9kZWxzL2NvbS9jb3JhbG9naXgvcnVtL3YyL3NvdXJjZV9jb2RlX2ZpbGVfbWFwcGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvQkFBb0I7QUFDcEIsaUVBQXFDO0FBRXhCLFFBQUEsZUFBZSxHQUFHLHNCQUFzQixDQUFDO0FBcUJ0RCxTQUFTLDJCQUEyQjtJQUNsQyxPQUFPLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ2hDLENBQUM7QUFFWSxRQUFBLGlCQUFpQixHQUFHO0lBQy9CLE1BQU0sQ0FBQyxPQUEwQixFQUFFLFNBQXFCLGlCQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtRQUN6RSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQzlELDZDQUFxQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzlHLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUE4QixFQUFFLE1BQWU7UUFDcEQsTUFBTSxNQUFNLEdBQUcsS0FBSyxZQUFZLGlCQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGlCQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RSxJQUFJLEdBQUcsR0FBRyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMs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LENBQUMsa0JBQWtCLG1DQUFJLEVBQUUsQ0FBQztRQUM3RCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YsQ0FBQztBQVVGLFNBQVMsUUFBUSxDQUFDLEtBQVU7SUFDMUIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQztBQUNyRCxDQUFDO0FBRUQsU0FBUyxLQUFLLENBQUMsS0FBVTtJQUN2QixPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQztBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuXG5leHBvcnQgY29uc3QgcHJvdG9idWZQYWNrYWdlID0gXCJjb20uY29yYWxvZ2l4LnJ1bS52MlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTb3VyY2VDb2RlTWFwIHtcbiAgZmlsZU5hbWVUb0NvZGU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVNvdXJjZUNvZGVNYXBfRmlsZU5hbWVUb0NvZGVFbnRyeSB7XG4gIGtleTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZUNvZGVMaW5lTWFwcGluZyB7XG4gIGNodW5rTmFtZTogc3RyaW5nO1xuICBzb3VyY2VGaWxlTmFtZTogc3RyaW5nO1xuICBvcmlnaW5hbExpbmVOdW1iZXI6IG51bWJlcjtcbiAgZ2VuZXJhdGVkTGluZU51bWJlcjogbnVtYmVyO1xuICBvcmlnaW5hbENvbHVtbk51bWJlcjogbnVtYmVyO1xuICBnZW5lcmF0ZWRDb2x1bW5OdW1iZXI6IG51bWJlcjtcbiAgc291cmNlRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGaWxlU291cmNlQ29kZU1hcCgpOiBGaWxlU291cmNlQ29kZU1hcCB7XG4gIHJldHVybiB7IGZpbGVOYW1lVG9Db2RlOiB7fSB9O1xufVxuXG5leHBvcnQgY29uc3QgRmlsZVNvdXJjZUNvZGVNYXAgPSB7XG4gIGVuY29kZShtZXNzYWdlOiBGaWxlU291cmNlQ29kZU1hcCwgd3JpdGVyOiBfbTAuV3JpdGVyID0gX20wLldyaXRlci5jcmVhdGUoKSk6IF9tMC5Xcml0ZXIge1xuICAgIE9iamVjdC5lbnRyaWVzKG1lc3NhZ2UuZmlsZU5hbWVUb0NvZGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgRmlsZVNvdXJjZUNvZGVNYXBfRmlsZU5hbWVUb0NvZGVFbnRyeS5lbmNvZGUoeyBrZXk6IGtleSBhcyBhbnksIHZhbHVlIH0sIHdyaXRlci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHdyaXRlcjtcbiAgfSxcblxuICBkZWNvZGUoaW5wdXQ6IF9tMC5SZWFkZXIgfCBVaW50OEFycmF5LCBsZW5ndGg/OiBudW1iZXIpOiBGaWxlU291cmNlQ29kZU1hcCB7XG4gICAgY29uc3QgcmVhZGVyID0gaW5wdXQgaW5zdGFuY2VvZiBfbTAuUmVhZGVyID8gaW5wdXQgOiBfbTAuUmVhZGVyLmNyZWF0ZShpbnB1dCk7XG4gICAgbGV0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgY29uc3QgbWVzc2FnZSA9IGNyZWF0ZUJhc2VGaWxlU291cmNlQ29kZU1hcCgpO1xuICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVudHJ5MSA9IEZpbGVTb3VyY2VDb2RlTWFwX0ZpbGVOYW1lVG9Db2RlRW50cnkuZGVjb2RlKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpKTtcbiAgICAgICAgICBpZiAoZW50cnkxLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UuZmlsZU5hbWVUb0NvZGVbZW50cnkxLmtleV0gPSBlbnRyeTEudmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCh0YWcgJiA3KSA9PT0gNCB8fCB0YWcgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZWFkZXIuc2tpcFR5cGUodGFnICYgNyk7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9LFxuXG4gIGZyb21KU09OKG9iamVjdDogYW55KTogRmlsZVNvdXJjZUNvZGVNYXAge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlTmFtZVRvQ29kZTogaXNPYmplY3Qob2JqZWN0LmZpbGVOYW1lVG9Db2RlKVxuICAgICAgICA/IE9iamVjdC5lbnRyaWVzKG9iamVjdC5maWxlTmFtZVRvQ29kZSkucmVkdWNlPHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0+KChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGFjY1trZXldID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSlcbiAgICAgICAgOiB7fSxcbiAgICB9O1xuICB9LFxuXG4gIHRvSlNPTihtZXNzYWdlOiBGaWxlU291cmNlQ29kZU1hcCk6IHVua25vd24ge1xuICAgIGNvbnN0IG9iajogYW55ID0ge307XG4gICAgb2JqLmZpbGVOYW1lVG9Db2RlID0ge307XG4gICAgaWYgKG1lc3NhZ2UuZmlsZU5hbWVUb0NvZGUpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKG1lc3NhZ2UuZmlsZU5hbWVUb0NvZGUpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBvYmouZmlsZU5hbWVUb0NvZGVba10gPSB2O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH0sXG5cbiAgY3JlYXRlKGJhc2U/OiBEZWVwUGFydGlhbDxGaWxlU291cmNlQ29kZU1hcD4pOiBGaWxlU291cmNlQ29kZU1hcCB7XG4gICAgcmV0dXJuIEZpbGVTb3VyY2VDb2RlTWFwLmZyb21QYXJ0aWFsKGJhc2UgPz8ge30pO1xuICB9LFxuXG4gIGZyb21QYXJ0aWFsKG9iamVjdDogRGVlcFBhcnRpYWw8RmlsZVNvdXJjZUNvZGVNYXA+KTogRmlsZVNvdXJjZUNvZGVNYXAge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlRmlsZVNvdXJjZUNvZGVNYXAoKTtcbiAgICBtZXNzYWdlLmZpbGVOYW1lVG9Db2RlID0gT2JqZWN0LmVudHJpZXMob2JqZWN0LmZpbGVOYW1lVG9Db2RlID8/IHt9KS5yZWR1Y2U8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4oXG4gICAgICAoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY2Nba2V5XSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICB7fSxcbiAgICApO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9LFxufTtcblxuZnVuY3Rpb24gY3JlYXRlQmFzZUZpbGVTb3VyY2VDb2RlTWFwX0ZpbGVOYW1lVG9Db2RlRW50cnkoKTogRmlsZVNvdXJjZUNvZGVNYXBfRmlsZU5hbWVUb0NvZGVFbnRyeSB7XG4gIHJldHVybiB7IGtleTogXCJcIiwgdmFsdWU6IFwiXCIgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEZpbGVTb3VyY2VDb2RlTWFwX0ZpbGVOYW1lVG9Db2RlRW50cnkgPSB7XG4gIGVuY29kZShtZXNzYWdlOiBGaWxlU291cmNlQ29kZU1hcF9GaWxlTmFtZVRvQ29kZUVudHJ5LCB3cml0ZXI6IF9tMC5Xcml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKTogX20wLldyaXRlciB7XG4gICAgaWYgKG1lc3NhZ2Uua2V5ICE9PSBcIlwiKSB7XG4gICAgICB3cml0ZXIudWludDMyKDEwKS5zdHJpbmcobWVzc2FnZS5rZXkpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gXCJcIikge1xuICAgICAgd3JpdGVyLnVpbnQzMigxOCkuc3RyaW5nKG1lc3NhZ2UudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gd3JpdGVyO1xuICB9LFxuXG4gIGRlY29kZShpbnB1dDogX20wLlJlYWRlciB8IFVpbnQ4QXJyYXksIGxlbmd0aD86IG51bWJlcik6IEZpbGVTb3VyY2VDb2RlTWFwX0ZpbGVOYW1lVG9Db2RlRW50cnkge1xuICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlRmlsZVNvdXJjZUNvZGVNYXBfRmlsZU5hbWVUb0NvZGVFbnRyeSgpO1xuICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2Uua2V5ID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMTgpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH0sXG5cbiAgZnJvbUpTT04ob2JqZWN0OiBhbnkpOiBGaWxlU291cmNlQ29kZU1hcF9GaWxlTmFtZVRvQ29kZUVudHJ5IHtcbiAgICByZXR1cm4geyBrZXk6IGlzU2V0KG9iamVjdC5rZXkpID8gU3RyaW5nKG9iamVjdC5rZXkpIDogXCJcIiwgdmFsdWU6IGlzU2V0KG9iamVjdC52YWx1ZSkgPyBTdHJpbmcob2JqZWN0LnZhbHVlKSA6IFwiXCIgfTtcbiAgfSxcblxuICB0b0pTT04obWVzc2FnZTogRmlsZVNvdXJjZUNvZGVNYXBfRmlsZU5hbWVUb0NvZGVFbnRyeSk6IHVua25vd24ge1xuICAgIGNvbnN0IG9iajogYW55ID0ge307XG4gICAgbWVzc2FnZS5rZXkgIT09IHVuZGVmaW5lZCAmJiAob2JqLmtleSA9IG1lc3NhZ2Uua2V5KTtcbiAgICBtZXNzYWdlLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgKG9iai52YWx1ZSA9IG1lc3NhZ2UudmFsdWUpO1xuICAgIHJldHVybiBvYmo7XG4gIH0sXG5cbiAgY3JlYXRlKGJhc2U/OiBEZWVwUGFydGlhbDxGaWxlU291cmNlQ29kZU1hcF9GaWxlTmFtZVRvQ29kZUVudHJ5Pik6IEZpbGVTb3VyY2VDb2RlTWFwX0ZpbGVOYW1lVG9Db2RlRW50cnkge1xuICAgIHJldHVybiBGaWxlU291cmNlQ29kZU1hcF9GaWxlTmFtZVRvQ29kZUVudHJ5LmZyb21QYXJ0aWFsKGJhc2UgPz8ge30pO1xuICB9LFxuXG4gIGZyb21QYXJ0aWFsKG9iamVjdDogRGVlcFBhcnRpYWw8RmlsZVNvdXJjZUNvZGVNYXBfRmlsZU5hbWVUb0NvZGVFbnRyeT4pOiBGaWxlU291cmNlQ29kZU1hcF9GaWxlTmFtZVRvQ29kZUVudHJ5IHtcbiAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZUZpbGVTb3VyY2VDb2RlTWFwX0ZpbGVOYW1lVG9Db2RlRW50cnkoKTtcbiAgICBtZXNzYWdlLmtleSA9IG9iamVjdC5rZXkgPz8gXCJcIjtcbiAgICBtZXNzYWdlLnZhbHVlID0gb2JqZWN0LnZhbHVlID8/IFwiXCI7XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVCYXNlU291cmNlQ29kZUxpbmVNYXBwaW5nKCk6IFNvdXJjZUNvZGVMaW5lTWFwcGluZyB7XG4gIHJldHVybiB7XG4gICAgY2h1bmtOYW1lOiBcIlwiLFxuICAgIHNvdXJjZUZpbGVOYW1lOiBcIlwiLFxuICAgIG9yaWdpbmFsTGluZU51bWJlcjogMCxcbiAgICBnZW5lcmF0ZWRMaW5lTnVtYmVyOiAwLFxuICAgIG9yaWdpbmFsQ29sdW1uTnVtYmVyOiAwLFxuICAgIGdlbmVyYXRlZENvbHVtbk51bWJlcjogMCxcbiAgICBzb3VyY2VGdW5jdGlvbk5hbWU6IFwiXCIsXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBTb3VyY2VDb2RlTGluZU1hcHBpbmcgPSB7XG4gIGVuY29kZShtZXNzYWdlOiBTb3VyY2VDb2RlTGluZU1hcHBpbmcsIHdyaXRlcjogX20wLldyaXRlciA9IF9tMC5Xcml0ZXIuY3JlYXRlKCkpOiBfbTAuV3JpdGVyIHtcbiAgICBpZiAobWVzc2FnZS5jaHVua05hbWUgIT09IFwiXCIpIHtcbiAgICAgIHdyaXRlci51aW50MzIoMTApLnN0cmluZyhtZXNzYWdlLmNodW5rTmFtZSk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLnNvdXJjZUZpbGVOYW1lICE9PSBcIlwiKSB7XG4gICAgICB3cml0ZXIudWludDMyKDE4KS5zdHJpbmcobWVzc2FnZS5zb3VyY2VGaWxlTmFtZSk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLm9yaWdpbmFsTGluZU51bWJlciAhPT0gMCkge1xuICAgICAgd3JpdGVyLnVpbnQzMigyNCkuaW50MzIobWVzc2FnZS5vcmlnaW5hbExpbmVOdW1iZXIpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5nZW5lcmF0ZWRMaW5lTnVtYmVyICE9PSAwKSB7XG4gICAgICB3cml0ZXIudWludDMyKDMyKS5pbnQzMihtZXNzYWdlLmdlbmVyYXRlZExpbmVOdW1iZXIpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5vcmlnaW5hbENvbHVtbk51bWJlciAhPT0gMCkge1xuICAgICAgd3JpdGVyLnVpbnQzMig0MCkuaW50MzIobWVzc2FnZS5vcmlnaW5hbENvbHVtbk51bWJlcik7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLmdlbmVyYXRlZENvbHVtbk51bWJlciAhPT0gMCkge1xuICAgICAgd3JpdGVyLnVpbnQzMig0OCkuaW50MzIobWVzc2FnZS5nZW5lcmF0ZWRDb2x1bW5OdW1iZXIpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5zb3VyY2VGdW5jdGlvbk5hbWUgIT09IFwiXCIpIHtcbiAgICAgIHdyaXRlci51aW50MzIoNTgpLnN0cmluZyhtZXNzYWdlLnNvdXJjZUZ1bmN0aW9uTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB3cml0ZXI7XG4gIH0sXG5cbiAgZGVjb2RlKGlucHV0OiBfbTAuUmVhZGVyIHwgVWludDhBcnJheSwgbGVuZ3RoPzogbnVtYmVyKTogU291cmNlQ29kZUxpbmVNYXBwaW5nIHtcbiAgICBjb25zdCByZWFkZXIgPSBpbnB1dCBpbnN0YW5jZW9mIF9tMC5SZWFkZXIgPyBpbnB1dCA6IF9tMC5SZWFkZXIuY3JlYXRlKGlucHV0KTtcbiAgICBsZXQgZW5kID0gbGVuZ3RoID09PSB1bmRlZmluZWQgPyByZWFkZXIubGVuIDogcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVNvdXJjZUNvZGVMaW5lTWFwcGluZygpO1xuICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2UuY2h1bmtOYW1lID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMTgpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2Uuc291cmNlRmlsZU5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpZiAodGFnICE9PSAyNCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbWVzc2FnZS5vcmlnaW5hbExpbmVOdW1iZXIgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGlmICh0YWcgIT09IDMyKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLmdlbmVyYXRlZExpbmVOdW1iZXIgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGlmICh0YWcgIT09IDQwKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLm9yaWdpbmFsQ29sdW1uTnVtYmVyID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBpZiAodGFnICE9PSA0OCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbWVzc2FnZS5nZW5lcmF0ZWRDb2x1bW5OdW1iZXIgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIGlmICh0YWcgIT09IDU4KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtZXNzYWdlLnNvdXJjZUZ1bmN0aW9uTmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICgodGFnICYgNykgPT09IDQgfHwgdGFnID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmVhZGVyLnNraXBUeXBlKHRhZyAmIDcpO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfSxcblxuICBmcm9tSlNPTihvYmplY3Q6IGFueSk6IFNvdXJjZUNvZGVMaW5lTWFwcGluZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNodW5rTmFtZTogaXNTZXQob2JqZWN0LmNodW5rTmFtZSkgPyBTdHJpbmcob2JqZWN0LmNodW5rTmFtZSkgOiBcIlwiLFxuICAgICAgc291cmNlRmlsZU5hbWU6IGlzU2V0KG9iamVjdC5zb3VyY2VGaWxlTmFtZSkgPyBTdHJpbmcob2JqZWN0LnNvdXJjZUZpbGVOYW1lKSA6IFwiXCIsXG4gICAgICBvcmlnaW5hbExpbmVOdW1iZXI6IGlzU2V0KG9iamVjdC5vcmlnaW5hbExpbmVOdW1iZXIpID8gTnVtYmVyKG9iamVjdC5vcmlnaW5hbExpbmVOdW1iZXIpIDogMCxcbiAgICAgIGdlbmVyYXRlZExpbmVOdW1iZXI6IGlzU2V0KG9iamVjdC5nZW5lcmF0ZWRMaW5lTnVtYmVyKSA/IE51bWJlcihvYmplY3QuZ2VuZXJhdGVkTGluZU51bWJlcikgOiAwLFxuICAgICAgb3JpZ2luYWxDb2x1bW5OdW1iZXI6IGlzU2V0KG9iamVjdC5vcmlnaW5hbENvbHVtbk51bWJlcikgPyBOdW1iZXIob2JqZWN0Lm9yaWdpbmFsQ29sdW1uTnVtYmVyKSA6IDAsXG4gICAgICBnZW5lcmF0ZWRDb2x1bW5OdW1iZXI6IGlzU2V0KG9iamVjdC5nZW5lcmF0ZWRDb2x1bW5OdW1iZXIpID8gTnVtYmVyKG9iamVjdC5nZW5lcmF0ZWRDb2x1bW5OdW1iZXIpIDogMCxcbiAgICAgIHNvdXJjZUZ1bmN0aW9uTmFtZTogaXNTZXQob2JqZWN0LnNvdXJjZUZ1bmN0aW9uTmFtZSkgPyBTdHJpbmcob2JqZWN0LnNvdXJjZUZ1bmN0aW9uTmFtZSkgOiBcIlwiLFxuICAgIH07XG4gIH0sXG5cbiAgdG9KU09OKG1lc3NhZ2U6IFNvdXJjZUNvZGVMaW5lTWFwcGluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IG9iajogYW55ID0ge307XG4gICAgbWVzc2FnZS5jaHVua05hbWUgIT09IHVuZGVmaW5lZCAmJiAob2JqLmNodW5rTmFtZSA9IG1lc3NhZ2UuY2h1bmtOYW1lKTtcbiAgICBtZXNzYWdlLnNvdXJjZUZpbGVOYW1lICE9PSB1bmRlZmluZWQgJiYgKG9iai5zb3VyY2VGaWxlTmFtZSA9IG1lc3NhZ2Uuc291cmNlRmlsZU5hbWUpO1xuICAgIG1lc3NhZ2Uub3JpZ2luYWxMaW5lTnVtYmVyICE9PSB1bmRlZmluZWQgJiYgKG9iai5vcmlnaW5hbExpbmVOdW1iZXIgPSBNYXRoLnJvdW5kKG1lc3NhZ2Uub3JpZ2luYWxMaW5lTnVtYmVyKSk7XG4gICAgbWVzc2FnZS5nZW5lcmF0ZWRMaW5lTnVtYmVyICE9PSB1bmRlZmluZWQgJiYgKG9iai5nZW5lcmF0ZWRMaW5lTnVtYmVyID0gTWF0aC5yb3VuZChtZXNzYWdlLmdlbmVyYXRlZExpbmVOdW1iZXIpKTtcbiAgICBtZXNzYWdlLm9yaWdpbmFsQ29sdW1uTnVtYmVyICE9PSB1bmRlZmluZWQgJiYgKG9iai5vcmlnaW5hbENvbHVtbk51bWJlciA9IE1hdGgucm91bmQobWVzc2FnZS5vcmlnaW5hbENvbHVtbk51bWJlcikpO1xuICAgIG1lc3NhZ2UuZ2VuZXJhdGVkQ29sdW1uTnVtYmVyICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChvYmouZ2VuZXJhdGVkQ29sdW1uTnVtYmVyID0gTWF0aC5yb3VuZChtZXNzYWdlLmdlbmVyYXRlZENvbHVtbk51bWJlcikpO1xuICAgIG1lc3NhZ2Uuc291cmNlRnVuY3Rpb25OYW1lICE9PSB1bmRlZmluZWQgJiYgKG9iai5zb3VyY2VGdW5jdGlvbk5hbWUgPSBtZXNzYWdlLnNvdXJjZUZ1bmN0aW9uTmFtZSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfSxcblxuICBjcmVhdGUoYmFzZT86IERlZXBQYXJ0aWFsPFNvdXJjZUNvZGVMaW5lTWFwcGluZz4pOiBTb3VyY2VDb2RlTGluZU1hcHBpbmcge1xuICAgIHJldHVybiBTb3VyY2VDb2RlTGluZU1hcHBpbmcuZnJvbVBhcnRpYWwoYmFzZSA/PyB7fSk7XG4gIH0sXG5cbiAgZnJvbVBhcnRpYWwob2JqZWN0OiBEZWVwUGFydGlhbDxTb3VyY2VDb2RlTGluZU1hcHBpbmc+KTogU291cmNlQ29kZUxpbmVNYXBwaW5nIHtcbiAgICBjb25zdCBtZXNzYWdlID0gY3JlYXRlQmFzZVNvdXJjZUNvZGVMaW5lTWFwcGluZygpO1xuICAgIG1lc3NhZ2UuY2h1bmtOYW1lID0gb2JqZWN0LmNodW5rTmFtZSA/PyBcIlwiO1xuICAgIG1lc3NhZ2Uuc291cmNlRmlsZU5hbWUgPSBvYmplY3Quc291cmNlRmlsZU5hbWUgPz8gXCJcIjtcbiAgICBtZXNzYWdlLm9yaWdpbmFsTGluZU51bWJlciA9IG9iamVjdC5vcmlnaW5hbExpbmVOdW1iZXIgPz8gMDtcbiAgICBtZXNzYWdlLmdlbmVyYXRlZExpbmVOdW1iZXIgPSBvYmplY3QuZ2VuZXJhdGVkTGluZU51bWJlciA/PyAwO1xuICAgIG1lc3NhZ2Uub3JpZ2luYWxDb2x1bW5OdW1iZXIgPSBvYmplY3Qub3JpZ2luYWxDb2x1bW5OdW1iZXIgPz8gMDtcbiAgICBtZXNzYWdlLmdlbmVyYXRlZENvbHVtbk51bWJlciA9IG9iamVjdC5nZW5lcmF0ZWRDb2x1bW5OdW1iZXIgPz8gMDtcbiAgICBtZXNzYWdlLnNvdXJjZUZ1bmN0aW9uTmFtZSA9IG9iamVjdC5zb3VyY2VGdW5jdGlvbk5hbWUgPz8gXCJcIjtcbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfSxcbn07XG5cbnR5cGUgQnVpbHRpbiA9IERhdGUgfCBGdW5jdGlvbiB8IFVpbnQ4QXJyYXkgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUPiA9IFQgZXh0ZW5kcyBCdWlsdGluID8gVFxuICA6IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IEFycmF5PERlZXBQYXJ0aWFsPFU+PiA6IFQgZXh0ZW5kcyBSZWFkb25seUFycmF5PGluZmVyIFU+ID8gUmVhZG9ubHlBcnJheTxEZWVwUGFydGlhbDxVPj5cbiAgOiBUIGV4dGVuZHMgeyAkY2FzZTogc3RyaW5nIH0gPyB7IFtLIGluIGtleW9mIE9taXQ8VCwgXCIkY2FzZVwiPl0/OiBEZWVwUGFydGlhbDxUW0tdPiB9ICYgeyAkY2FzZTogVFtcIiRjYXNlXCJdIH1cbiAgOiBUIGV4dGVuZHMge30gPyB7IFtLIGluIGtleW9mIFRdPzogRGVlcFBhcnRpYWw8VFtLXT4gfVxuICA6IFBhcnRpYWw8VD47XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNTZXQodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZDtcbn1cbiJdfQ==