@datagrok-libraries/utils 1.11.1 → 1.12.2

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.
@@ -0,0 +1,36 @@
1
+ import * as DG from 'datagrok-api/dg';
2
+ import { FilterOptions } from './function-view';
3
+ export declare namespace historyUtils {
4
+ function loadRun(funcCallId: string): Promise<DG.FuncCall>;
5
+ function saveRun(callToSave: DG.FuncCall): Promise<DG.FuncCall>;
6
+ function deleteRun(callToDelete: DG.FuncCall): Promise<void>;
7
+ /**
8
+ * Loads all the function call of this function.
9
+ * Designed to pull hstorical runs in fast manner and the call {@link loadRun} with specified run ID.
10
+ * WARNING: FuncCall inputs/outputs fields are not included
11
+ * @param funcId ID of Func which calls we are looking for. Get it using {@link func.id} field
12
+ * @return Promise on array of FuncCalls corresponding to the passed Func ID
13
+ * @stability Deprecated. Script ID changes with every package release, so searching by ID is useless in practice.
14
+ */
15
+ function pullRuns(funcId: string, filterOptions?: FilterOptions, listOptions?: {
16
+ pageSize?: number;
17
+ pageNumber?: number;
18
+ filter?: string;
19
+ order?: string;
20
+ }): Promise<DG.FuncCall[]>;
21
+ /**
22
+ * Loads all the function call of this function.
23
+ * Designed to pull hstorical runs in fast manner and the call {@link loadRun} with specified run ID.
24
+ * WARNING: FuncCall inputs/outputs fields are not included
25
+ * @param funcName Name of Func which calls we are looking for. Get it using {@link func.name} field
26
+ * @return Promise on array of FuncCalls corresponding to the passed Func ID
27
+ * @stability Experimental
28
+ */
29
+ function pullRunsByName(funcName: string, filterOptions?: FilterOptions, listOptions?: {
30
+ pageSize?: number;
31
+ pageNumber?: number;
32
+ filter?: string;
33
+ order?: string;
34
+ }): Promise<DG.FuncCall[]>;
35
+ }
36
+ //# sourceMappingURL=history-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-utils.d.ts","sourceRoot":"","sources":["history-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEtC,OAAO,EAAc,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAyB3D,yBAAiB,YAAY,CAAC;IAC5B,SAAsB,OAAO,CAAC,UAAU,EAAE,MAAM,wBAkB/C;IAED,SAAsB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,wBAYpD;IAED,SAAsB,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC,QAAQ,iBAExD;IAED;;;;;;;KAOC;IACD,SAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,aAAa,GAAE,aAAkB,EACjC,WAAW,GAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAM,GAC1F,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAOxB;IAED;;;;;;;KAOC;IACD,SAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,aAAa,GAAE,aAAkB,EACjC,WAAW,GAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAM,GAC1F,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAQxB;CACF"}
@@ -0,0 +1,118 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ /* eslint-disable valid-jsdoc */
11
+ import * as grok from 'datagrok-api/grok';
12
+ import * as DG from 'datagrok-api/dg';
13
+ import wu from 'wu';
14
+ const getSearchStringByPattern = (datePattern) => {
15
+ switch (datePattern) {
16
+ case 'Today':
17
+ return ` and started > -1d`;
18
+ case 'Yesterday':
19
+ return ` and started > -2d and started < -1d`;
20
+ case 'Any time':
21
+ return ``;
22
+ case 'Last year':
23
+ return `and started > -2y and started < -1y`;
24
+ case 'This year':
25
+ return ` and started > -1y`;
26
+ case 'Last month':
27
+ return ` and started > -2m and started < -1m`;
28
+ case 'This month':
29
+ return ` and started > -1m`;
30
+ case 'Last week':
31
+ return ` and started > -2w and started < -1w`;
32
+ case 'This week':
33
+ return ` and started > -1w`;
34
+ }
35
+ };
36
+ export var historyUtils;
37
+ (function (historyUtils) {
38
+ function loadRun(funcCallId) {
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ const pulledRun = yield grok.dapi.functions.calls.include('inputs, outputs').find(funcCallId);
41
+ // FIX ME: manually get script since pulledRun contains empty Func
42
+ const script = yield grok.dapi.functions.find(pulledRun.func.id);
43
+ //@ts-ignore
44
+ window.grok_FuncCall_Set_Func(pulledRun.dart, script.dart);
45
+ pulledRun.options['isHistorical'] = true;
46
+ const dfOutputs = wu(pulledRun.outputParams.values())
47
+ .filter((output) => output.property.propertyType === DG.TYPE.DATA_FRAME);
48
+ for (const output of dfOutputs)
49
+ pulledRun.outputs[output.name] = yield grok.dapi.tables.getTable(pulledRun.outputs[output.name]);
50
+ const dfInputs = wu(pulledRun.inputParams.values())
51
+ .filter((input) => input.property.propertyType === DG.TYPE.DATA_FRAME);
52
+ for (const input of dfInputs)
53
+ pulledRun.inputs[input.name] = yield grok.dapi.tables.getTable(pulledRun.inputs[input.name]);
54
+ return pulledRun;
55
+ });
56
+ }
57
+ historyUtils.loadRun = loadRun;
58
+ function saveRun(callToSave) {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ const dfOutputs = wu(callToSave.outputParams.values())
61
+ .filter((output) => output.property.propertyType === DG.TYPE.DATA_FRAME);
62
+ for (const output of dfOutputs)
63
+ yield grok.dapi.tables.uploadDataFrame(callToSave.outputs[output.name]);
64
+ const dfInputs = wu(callToSave.inputParams.values())
65
+ .filter((input) => input.property.propertyType === DG.TYPE.DATA_FRAME);
66
+ for (const input of dfInputs)
67
+ yield grok.dapi.tables.uploadDataFrame(callToSave.inputs[input.name]);
68
+ return yield grok.dapi.functions.calls.save(callToSave);
69
+ });
70
+ }
71
+ historyUtils.saveRun = saveRun;
72
+ function deleteRun(callToDelete) {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ yield grok.dapi.functions.calls.delete(callToDelete);
75
+ });
76
+ }
77
+ historyUtils.deleteRun = deleteRun;
78
+ /**
79
+ * Loads all the function call of this function.
80
+ * Designed to pull hstorical runs in fast manner and the call {@link loadRun} with specified run ID.
81
+ * WARNING: FuncCall inputs/outputs fields are not included
82
+ * @param funcId ID of Func which calls we are looking for. Get it using {@link func.id} field
83
+ * @return Promise on array of FuncCalls corresponding to the passed Func ID
84
+ * @stability Deprecated. Script ID changes with every package release, so searching by ID is useless in practice.
85
+ */
86
+ function pullRuns(funcId, filterOptions = {}, listOptions = {}) {
87
+ return __awaiter(this, void 0, void 0, function* () {
88
+ let filteringString = `func.id="${funcId}"`;
89
+ filteringString += filterOptions.author ? ` and session.user.id="${filterOptions.author.id}"` : '';
90
+ filteringString += filterOptions.date ? getSearchStringByPattern(filterOptions.date) : '';
91
+ const filter = grok.dapi.functions.calls.filter(filteringString).include('session.user, options');
92
+ const list = filter.list(listOptions);
93
+ return list;
94
+ });
95
+ }
96
+ historyUtils.pullRuns = pullRuns;
97
+ /**
98
+ * Loads all the function call of this function.
99
+ * Designed to pull hstorical runs in fast manner and the call {@link loadRun} with specified run ID.
100
+ * WARNING: FuncCall inputs/outputs fields are not included
101
+ * @param funcName Name of Func which calls we are looking for. Get it using {@link func.name} field
102
+ * @return Promise on array of FuncCalls corresponding to the passed Func ID
103
+ * @stability Experimental
104
+ */
105
+ function pullRunsByName(funcName, filterOptions = {}, listOptions = {}) {
106
+ return __awaiter(this, void 0, void 0, function* () {
107
+ let filteringString = `func.name="${funcName}"`;
108
+ filteringString += filterOptions.author ? ` and session.user.id="${filterOptions.author.id}"` : '';
109
+ filteringString += filterOptions.date ? getSearchStringByPattern(filterOptions.date) : '';
110
+ filteringString += filterOptions.isShared ? `and options.isShared="true"` : '';
111
+ const filter = grok.dapi.functions.calls.filter(filteringString).include('session.user, options');
112
+ const list = filter.list(listOptions);
113
+ return list;
114
+ });
115
+ }
116
+ historyUtils.pullRunsByName = pullRunsByName;
117
+ })(historyUtils || (historyUtils = {}));
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhpc3RvcnktdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsZ0NBQWdDO0FBQ2hDLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFFMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFHcEIsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLFdBQXdCLEVBQUUsRUFBRTtJQUM1RCxRQUFRLFdBQVcsRUFBRTtRQUNyQixLQUFLLE9BQU87WUFDVixPQUFPLG9CQUFvQixDQUFDO1FBQzlCLEtBQUssV0FBVztZQUNkLE9BQU8sc0NBQXNDLENBQUM7UUFDaEQsS0FBSyxVQUFVO1lBQ2IsT0FBTyxFQUFFLENBQUM7UUFDWixLQUFLLFdBQVc7WUFDZCxPQUFPLHFDQUFxQyxDQUFDO1FBQy9DLEtBQUssV0FBVztZQUNkLE9BQU8sb0JBQW9CLENBQUM7UUFDOUIsS0FBSyxZQUFZO1lBQ2YsT0FBTyxzQ0FBc0MsQ0FBQztRQUNoRCxLQUFLLFlBQVk7WUFDZixPQUFPLG9CQUFvQixDQUFDO1FBQzlCLEtBQUssV0FBVztZQUNkLE9BQU8sc0NBQXNDLENBQUM7UUFDaEQsS0FBSyxXQUFXO1lBQ2QsT0FBTyxvQkFBb0IsQ0FBQztLQUM3QjtBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sS0FBVyxZQUFZLENBaUY1QjtBQWpGRCxXQUFpQixZQUFZO0lBQzNCLFNBQXNCLE9BQU8sQ0FBQyxVQUFrQjs7WUFDOUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlGLGtFQUFrRTtZQUNsRSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FB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Q0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6RixlQUFlLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ2xHLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0tBQUE7SUFacUIsMkJBQWMsaUJBWW5DLENBQUE7QUFDSCxDQUFDLEVBakZnQixZQUFZLEtBQVosWUFBWSxRQWlGNUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqL1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB3dSBmcm9tICd3dSc7XG5pbXBvcnQge0RhdGVPcHRpb25zLCBGaWx0ZXJPcHRpb25zfSBmcm9tICcuL2Z1bmN0aW9uLXZpZXcnO1xuXG5jb25zdCBnZXRTZWFyY2hTdHJpbmdCeVBhdHRlcm4gPSAoZGF0ZVBhdHRlcm46IERhdGVPcHRpb25zKSA9PiB7XG4gIHN3aXRjaCAoZGF0ZVBhdHRlcm4pIHtcbiAgY2FzZSAnVG9kYXknOlxuICAgIHJldHVybiBgIGFuZCBzdGFydGVkID4gLTFkYDtcbiAgY2FzZSAnWWVzdGVyZGF5JzpcbiAgICByZXR1cm4gYCBhbmQgc3RhcnRlZCA+IC0yZCBhbmQgc3RhcnRlZCA8IC0xZGA7XG4gIGNhc2UgJ0FueSB0aW1lJzpcbiAgICByZXR1cm4gYGA7XG4gIGNhc2UgJ0xhc3QgeWVhcic6XG4gICAgcmV0dXJuIGBhbmQgc3RhcnRlZCA+IC0yeSBhbmQgc3RhcnRlZCA8IC0xeWA7XG4gIGNhc2UgJ1RoaXMgeWVhcic6XG4gICAgcmV0dXJuIGAgYW5kIHN0YXJ0ZWQgPiAtMXlgO1xuICBjYXNlICdMYXN0IG1vbnRoJzpcbiAgICByZXR1cm4gYCBhbmQgc3RhcnRlZCA+IC0ybSBhbmQgc3RhcnRlZCA8IC0xbWA7XG4gIGNhc2UgJ1RoaXMgbW9udGgnOlxuICAgIHJldHVybiBgIGFuZCBzdGFydGVkID4gLTFtYDtcbiAgY2FzZSAnTGFzdCB3ZWVrJzpcbiAgICByZXR1cm4gYCBhbmQgc3RhcnRlZCA+IC0ydyBhbmQgc3RhcnRlZCA8IC0xd2A7XG4gIGNhc2UgJ1RoaXMgd2Vlayc6XG4gICAgcmV0dXJuIGAgYW5kIHN0YXJ0ZWQgPiAtMXdgO1xuICB9XG59O1xuXG5leHBvcnQgbmFtZXNwYWNlIGhpc3RvcnlVdGlscyB7XG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkUnVuKGZ1bmNDYWxsSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHB1bGxlZFJ1biA9IGF3YWl0IGdyb2suZGFwaS5mdW5jdGlvbnMuY2FsbHMuaW5jbHVkZSgnaW5wdXRzLCBvdXRwdXRzJykuZmluZChmdW5jQ2FsbElkKTtcbiAgICAvLyBGSVggTUU6IG1hbnVhbGx5IGdldCBzY3JpcHQgc2luY2UgcHVsbGVkUnVuIGNvbnRhaW5zIGVtcHR5IEZ1bmNcbiAgICBjb25zdCBzY3JpcHQgPSBhd2FpdCBncm9rLmRhcGkuZnVuY3Rpb25zLmZpbmQocHVsbGVkUnVuLmZ1bmMuaWQpO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5ncm9rX0Z1bmNDYWxsX1NldF9GdW5jKHB1bGxlZFJ1bi5kYXJ0LCBzY3JpcHQuZGFydCk7XG4gICAgcHVsbGVkUnVuLm9wdGlvbnNbJ2lzSGlzdG9yaWNhbCddID0gdHJ1ZTtcbiAgICBjb25zdCBkZk91dHB1dHMgPSB3dShwdWxsZWRSdW4ub3V0cHV0UGFyYW1zLnZhbHVlcygpIGFzIERHLkZ1bmNDYWxsUGFyYW1bXSlcbiAgICAgIC5maWx0ZXIoKG91dHB1dCkgPT4gb3V0cHV0LnByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gREcuVFlQRS5EQVRBX0ZSQU1FKTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBkZk91dHB1dHMpXG4gICAgICBwdWxsZWRSdW4ub3V0cHV0c1tvdXRwdXQubmFtZV0gPSBhd2FpdCBncm9rLmRhcGkudGFibGVzLmdldFRhYmxlKHB1bGxlZFJ1bi5vdXRwdXRzW291dHB1dC5uYW1lXSk7XG5cbiAgICBjb25zdCBkZklucHV0cyA9IHd1KHB1bGxlZFJ1bi5pbnB1dFBhcmFtcy52YWx1ZXMoKSBhcyBERy5GdW5jQ2FsbFBhcmFtW10pXG4gICAgICAuZmlsdGVyKChpbnB1dCkgPT4gaW5wdXQucHJvcGVydHkucHJvcGVydHlUeXBlID09PSBERy5UWVBFLkRBVEFfRlJBTUUpO1xuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgZGZJbnB1dHMpXG4gICAgICBwdWxsZWRSdW4uaW5wdXRzW2lucHV0Lm5hbWVdID0gYXdhaXQgZ3Jvay5kYXBpLnRhYmxlcy5nZXRUYWJsZShwdWxsZWRSdW4uaW5wdXRzW2lucHV0Lm5hbWVdKTtcblxuICAgIHJldHVybiBwdWxsZWRSdW47XG4gIH1cblxuICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVJ1bihjYWxsVG9TYXZlOiBERy5GdW5jQ2FsbCkge1xuICAgIGNvbnN0IGRmT3V0cHV0cyA9IHd1KGNhbGxUb1NhdmUub3V0cHV0UGFyYW1zLnZhbHVlcygpIGFzIERHLkZ1bmNDYWxsUGFyYW1bXSlcbiAgICAgIC5maWx0ZXIoKG91dHB1dCkgPT4gb3V0cHV0LnByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gREcuVFlQRS5EQVRBX0ZSQU1FKTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBkZk91dHB1dHMpXG4gICAgICBhd2FpdCBncm9rLmRhcGkudGFibGVzLnVwbG9hZERhdGFGcmFtZShjYWxsVG9TYXZlLm91dHB1dHNbb3V0cHV0Lm5hbWVdKTtcblxuICAgIGNvbnN0IGRmSW5wdXRzID0gd3UoY2FsbFRvU2F2ZS5pbnB1dFBhcmFtcy52YWx1ZXMoKSBhcyBERy5GdW5jQ2FsbFBhcmFtW10pXG4gICAgICAuZmlsdGVyKChpbnB1dCkgPT4gaW5wdXQucHJvcGVydHkucHJvcGVydHlUeXBlID09PSBERy5UWVBFLkRBVEFfRlJBTUUpO1xuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgZGZJbnB1dHMpXG4gICAgICBhd2FpdCBncm9rLmRhcGkudGFibGVzLnVwbG9hZERhdGFGcmFtZShjYWxsVG9TYXZlLmlucHV0c1tpbnB1dC5uYW1lXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgZ3Jvay5kYXBpLmZ1bmN0aW9ucy5jYWxscy5zYXZlKGNhbGxUb1NhdmUpO1xuICB9XG5cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVJ1bihjYWxsVG9EZWxldGU6IERHLkZ1bmNDYWxsKSB7XG4gICAgYXdhaXQgZ3Jvay5kYXBpLmZ1bmN0aW9ucy5jYWxscy5kZWxldGUoY2FsbFRvRGVsZXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbGwgdGhlIGZ1bmN0aW9uIGNhbGwgb2YgdGhpcyBmdW5jdGlvbi5cbiAgICogRGVzaWduZWQgdG8gcHVsbCBoc3RvcmljYWwgcnVucyBpbiBmYXN0IG1hbm5lciBhbmQgdGhlIGNhbGwge0BsaW5rIGxvYWRSdW59IHdpdGggc3BlY2lmaWVkIHJ1biBJRC5cbiAgICogV0FSTklORzogRnVuY0NhbGwgaW5wdXRzL291dHB1dHMgZmllbGRzIGFyZSBub3QgaW5jbHVkZWRcbiAgICogQHBhcmFtIGZ1bmNJZCBJRCBvZiBGdW5jIHdoaWNoIGNhbGxzIHdlIGFyZSBsb29raW5nIGZvci4gR2V0IGl0IHVzaW5nIHtAbGluayBmdW5jLmlkfSBmaWVsZFxuICAgKiBAcmV0dXJuIFByb21pc2Ugb24gYXJyYXkgb2YgRnVuY0NhbGxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhc3NlZCBGdW5jIElEXG4gICAqIEBzdGFiaWxpdHkgRGVwcmVjYXRlZC4gU2NyaXB0IElEIGNoYW5nZXMgd2l0aCBldmVyeSBwYWNrYWdlIHJlbGVhc2UsIHNvIHNlYXJjaGluZyBieSBJRCBpcyB1c2VsZXNzIGluIHByYWN0aWNlLlxuICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWxsUnVucyhcbiAgICBmdW5jSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJPcHRpb25zOiBGaWx0ZXJPcHRpb25zID0ge30sXG4gICAgbGlzdE9wdGlvbnM6IHtwYWdlU2l6ZT86IG51bWJlciwgcGFnZU51bWJlcj86IG51bWJlciwgZmlsdGVyPzogc3RyaW5nLCBvcmRlcj86IHN0cmluZ30gPSB7fVxuICApOiBQcm9taXNlPERHLkZ1bmNDYWxsW10+IHtcbiAgICBsZXQgZmlsdGVyaW5nU3RyaW5nID0gYGZ1bmMuaWQ9XCIke2Z1bmNJZH1cImA7XG4gICAgZmlsdGVyaW5nU3RyaW5nICs9IGZpbHRlck9wdGlvbnMuYXV0aG9yID8gYCBhbmQgc2Vzc2lvbi51c2VyLmlkPVwiJHtmaWx0ZXJPcHRpb25zLmF1dGhvci5pZH1cImA6Jyc7XG4gICAgZmlsdGVyaW5nU3RyaW5nICs9IGZpbHRlck9wdGlvbnMuZGF0ZSA/IGdldFNlYXJjaFN0cmluZ0J5UGF0dGVybihmaWx0ZXJPcHRpb25zLmRhdGUpOiAnJztcbiAgICBjb25zdCBmaWx0ZXIgPSBncm9rLmRhcGkuZnVuY3Rpb25zLmNhbGxzLmZpbHRlcihmaWx0ZXJpbmdTdHJpbmcpLmluY2x1ZGUoJ3Nlc3Npb24udXNlciwgb3B0aW9ucycpO1xuICAgIGNvbnN0IGxpc3QgPSBmaWx0ZXIubGlzdChsaXN0T3B0aW9ucyk7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYWxsIHRoZSBmdW5jdGlvbiBjYWxsIG9mIHRoaXMgZnVuY3Rpb24uXG4gICAqIERlc2lnbmVkIHRvIHB1bGwgaHN0b3JpY2FsIHJ1bnMgaW4gZmFzdCBtYW5uZXIgYW5kIHRoZSBjYWxsIHtAbGluayBsb2FkUnVufSB3aXRoIHNwZWNpZmllZCBydW4gSUQuXG4gICAqIFdBUk5JTkc6IEZ1bmNDYWxsIGlucHV0cy9vdXRwdXRzIGZpZWxkcyBhcmUgbm90IGluY2x1ZGVkXG4gICAqIEBwYXJhbSBmdW5jTmFtZSBOYW1lIG9mIEZ1bmMgd2hpY2ggY2FsbHMgd2UgYXJlIGxvb2tpbmcgZm9yLiBHZXQgaXQgdXNpbmcge0BsaW5rIGZ1bmMubmFtZX0gZmllbGRcbiAgICogQHJldHVybiBQcm9taXNlIG9uIGFycmF5IG9mIEZ1bmNDYWxscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXNzZWQgRnVuYyBJRFxuICAgKiBAc3RhYmlsaXR5IEV4cGVyaW1lbnRhbFxuICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWxsUnVuc0J5TmFtZShcbiAgICBmdW5jTmFtZTogc3RyaW5nLFxuICAgIGZpbHRlck9wdGlvbnM6IEZpbHRlck9wdGlvbnMgPSB7fSxcbiAgICBsaXN0T3B0aW9uczoge3BhZ2VTaXplPzogbnVtYmVyLCBwYWdlTnVtYmVyPzogbnVtYmVyLCBmaWx0ZXI/OiBzdHJpbmcsIG9yZGVyPzogc3RyaW5nfSA9IHt9XG4gICk6IFByb21pc2U8REcuRnVuY0NhbGxbXT4ge1xuICAgIGxldCBmaWx0ZXJpbmdTdHJpbmcgPSBgZnVuYy5uYW1lPVwiJHtmdW5jTmFtZX1cImA7XG4gICAgZmlsdGVyaW5nU3RyaW5nICs9IGZpbHRlck9wdGlvbnMuYXV0aG9yID8gYCBhbmQgc2Vzc2lvbi51c2VyLmlkPVwiJHtmaWx0ZXJPcHRpb25zLmF1dGhvci5pZH1cImA6Jyc7XG4gICAgZmlsdGVyaW5nU3RyaW5nICs9IGZpbHRlck9wdGlvbnMuZGF0ZSA/IGdldFNlYXJjaFN0cmluZ0J5UGF0dGVybihmaWx0ZXJPcHRpb25zLmRhdGUpOiAnJztcbiAgICBmaWx0ZXJpbmdTdHJpbmcgKz0gZmlsdGVyT3B0aW9ucy5pc1NoYXJlZCA/IGBhbmQgb3B0aW9ucy5pc1NoYXJlZD1cInRydWVcImA6ICcnO1xuICAgIGNvbnN0IGZpbHRlciA9IGdyb2suZGFwaS5mdW5jdGlvbnMuY2FsbHMuZmlsdGVyKGZpbHRlcmluZ1N0cmluZykuaW5jbHVkZSgnc2Vzc2lvbi51c2VyLCBvcHRpb25zJyk7XG4gICAgY29uc3QgbGlzdCA9IGZpbHRlci5saXN0KGxpc3RPcHRpb25zKTtcbiAgICByZXR1cm4gbGlzdDtcbiAgfVxufVxuIl19
@@ -1,5 +1,6 @@
1
1
  import { Subject } from 'rxjs';
2
2
  import '../../css/shared-components.css';
3
+ import Validation from '../validation';
3
4
  export declare const EXCEL_BLOB_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
4
5
  export declare class FileInput {
5
6
  initialText: string;
@@ -7,10 +8,13 @@ export declare class FileInput {
7
8
  onValueChanged: Function | null;
8
9
  fileType: string;
9
10
  uploadedFile$: Subject<File | null>;
11
+ onFileUploaded: Subject<File | null>;
10
12
  root: HTMLDivElement;
13
+ validation: Validation<File>;
11
14
  private visibleInput;
12
15
  private hiddenInput;
13
16
  private icon;
17
+ private isValid;
14
18
  constructor(initialText?: string, initialValue?: File | null, onValueChanged?: Function | null, fileType?: string);
15
19
  private draw;
16
20
  private reset;
@@ -1 +1 @@
1
- {"version":3,"file":"file-input.d.ts","sourceRoot":"","sources":["file-input.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAC7B,OAAO,iCAAiC,CAAC;AAEzC,eAAO,MAAM,eAAe,sEAAsE,CAAC;AAEnG,qBAAa,SAAS;IAWX,WAAW;IACX,YAAY,EAAE,IAAI,GAAG,IAAI;IACzB,cAAc,EAAE,QAAQ,GAAG,IAAI;IAC/B,QAAQ;IAZV,aAAa,uBAA8B;IAE3C,IAAI,iBAAY;IAEvB,OAAO,CAAC,YAAY,CAAwD;IAC5E,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,IAAI,CAA6D;gBAGhE,WAAW,SAAqB,EAChC,YAAY,GAAE,IAAI,GAAG,IAAW,EAChC,cAAc,GAAE,QAAQ,GAAG,IAAW,EACtC,QAAQ,SAAkB;IAQnC,OAAO,CAAC,IAAI;IA2FZ,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,KAAK;CAGd"}
1
+ {"version":3,"file":"file-input.d.ts","sourceRoot":"","sources":["file-input.ts"],"names":[],"mappings":"AAIA,OAAO,EAAkB,OAAO,EAAC,MAAM,MAAM,CAAC;AAC9C,OAAO,iCAAiC,CAAC;AACzC,OAAO,UAAU,MAAM,eAAe,CAAC;AAEvC,eAAO,MAAM,eAAe,sEAAsE,CAAC;AAEnG,qBAAa,SAAS;IAiBX,WAAW;IACX,YAAY,EAAE,IAAI,GAAG,IAAI;IACzB,cAAc,EAAE,QAAQ,GAAG,IAAI;IAC/B,QAAQ;IAlBV,aAAa,uBAA8B;IAE3C,cAAc,uBAA8B;IAE5C,IAAI,iBAAY;IAEhB,UAAU,mBAA0B;IAE3C,OAAO,CAAC,YAAY,CAAwD;IAC5E,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,IAAI,CAA6D;IAEzE,OAAO,CAAC,OAAO,CAAsC;gBAG5C,WAAW,SAAqB,EAChC,YAAY,GAAE,IAAI,GAAG,IAAW,EAChC,cAAc,GAAE,QAAQ,GAAG,IAAW,EACtC,QAAQ,SAAkB;IA0BnC,OAAO,CAAC,IAAI;IAoFZ,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,KAAK;CAGd"}
@@ -8,8 +8,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import * as ui from 'datagrok-api/ui';
11
- import { Subject } from 'rxjs';
11
+ import { BehaviorSubject, Subject } from 'rxjs';
12
12
  import '../../css/shared-components.css';
13
+ import Validation from '../validation';
13
14
  export const EXCEL_BLOB_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
14
15
  export class FileInput {
15
16
  constructor(initialText = 'Drag-n-drop here', initialValue = null, onValueChanged = null, fileType = EXCEL_BLOB_TYPE) {
@@ -19,11 +20,34 @@ export class FileInput {
19
20
  this.fileType = fileType;
20
21
  // events to emit
21
22
  this.uploadedFile$ = new Subject();
23
+ // same event as above but in DG-style
24
+ this.onFileUploaded = new Subject();
25
+ // HTML root of component
22
26
  this.root = ui.div();
27
+ // Validation object
28
+ this.validation = new Validation();
23
29
  this.visibleInput = ui.stringInput('Input file', this.initialText, null);
24
30
  this.hiddenInput = document.createElement('input');
25
31
  this.icon = ui.iconFA('cloud-upload', () => this.hiddenInput.click());
32
+ this.isValid = new BehaviorSubject(true);
26
33
  this.draw();
34
+ this.isValid.subscribe((isValid) => {
35
+ if (isValid) {
36
+ this.visibleInput.input.classList.remove('error');
37
+ this.visibleInput.input.classList.add('success');
38
+ const newIcon = ui.iconFA('times', () => this.reset());
39
+ this.icon.replaceWith(newIcon);
40
+ this.icon = newIcon;
41
+ }
42
+ else {
43
+ this.visibleInput.input.classList.remove('success');
44
+ this.visibleInput.input.classList.add('error');
45
+ const newIcon = ui.iconFA('redo', () => this.hiddenInput.click());
46
+ this.icon.replaceWith(newIcon);
47
+ this.icon = newIcon;
48
+ }
49
+ });
50
+ this.uploadedFile$.subscribe((file) => this.onFileUploaded.next(file));
27
51
  if (onValueChanged)
28
52
  this.uploadedFile$.subscribe((newValue) => onValueChanged(newValue));
29
53
  }
@@ -32,39 +56,31 @@ export class FileInput {
32
56
  const createFileArea = () => {
33
57
  this.visibleInput.input.readOnly = true;
34
58
  this.visibleInput.input.classList.add('default');
35
- const handleFiles = (files) => {
59
+ const handleFiles = (files) => __awaiter(this, void 0, void 0, function* () {
36
60
  if (!files || !files.length) {
37
61
  this.uploadedFile$.next(null);
38
62
  return;
39
63
  }
40
64
  if (files.length > 1) {
41
- this.visibleInput.input.classList.remove('success');
42
- this.visibleInput.input.classList.add('error');
43
- const newIcon = ui.iconFA('redo', () => this.hiddenInput.click());
44
- this.icon.replaceWith(newIcon);
45
- this.icon = newIcon;
65
+ this.isValid.next(false);
46
66
  throw new Error('Please specify single input file');
47
67
  }
48
68
  this.visibleInput.value = files[0].name;
49
69
  if (files[0].type !== this.fileType) {
50
- this.visibleInput.input.classList.remove('success');
51
- this.visibleInput.input.classList.add('error');
52
- const newIcon = ui.iconFA('redo', () => this.hiddenInput.click());
53
- this.icon.replaceWith(newIcon);
54
- this.icon = newIcon;
70
+ this.isValid.next(false);
55
71
  throw new Error('File type is not supported');
56
72
  }
57
- this.visibleInput.input.classList.add('success');
58
- const newIcon = ui.iconFA('times', () => this.reset());
59
- this.icon.replaceWith(newIcon);
60
- this.icon = newIcon;
61
- this.uploadedFile$.next(files[0]);
62
- };
73
+ this.isValid.next(yield this.validation.validate(files[0]));
74
+ if (this.isValid.value)
75
+ this.uploadedFile$.next(files[0]);
76
+ else
77
+ this.uploadedFile$.next(null);
78
+ });
63
79
  this.visibleInput.root.classList.add('cv-drop-area');
64
80
  this.visibleInput.root.style.width = '100%';
65
81
  // hidden input to handle file dialog
66
82
  this.hiddenInput.type = 'file';
67
- this.hiddenInput.addEventListener('change', () => handleFiles(this.hiddenInput.files), false);
83
+ this.hiddenInput.addEventListener('change', () => __awaiter(this, void 0, void 0, function* () { return yield handleFiles(this.hiddenInput.files); }), false);
68
84
  // Prevent default drag behaviors
69
85
  ['dragenter', 'dragover', 'dragleave', 'drop'].forEach((eventName) => {
70
86
  this.visibleInput.input.addEventListener(eventName, (e) => {
@@ -114,4 +130,4 @@ export class FileInput {
114
130
  ui.empty(this.root);
115
131
  }
116
132
  }
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZpbGUtaW5wdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8saUNBQWlDLENBQUM7QUFFekMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLG1FQUFtRSxDQUFDO0FBRW5HLE1BQU0sT0FBTyxTQUFTO0lBVXBCLFlBQ1MsY0FBYyxrQkFBa0IsRUFDaEMsZUFBNEIsSUFBSSxFQUNoQyxpQkFBa0MsSUFBSSxFQUN0QyxXQUFXLGVBQWU7UUFIMUIsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO1FBQ2hDLGlCQUFZLEdBQVosWUFBWSxDQUFvQjtRQUNoQyxtQkFBYyxHQUFkLGNBQWMsQ0FBd0I7UUFDdEMsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUFibkMsaUJBQWlCO1FBQ1Ysa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBRTNDLFNBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFZixpQkFBWSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEUsZ0JBQVcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLFNBQUksR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFRdkUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVosSUFBSSxjQUFjO1lBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU8sSUFBSTtRQUNWLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUViLE1BQU0sY0FBYyxHQUFHLEdBQUcsRUFBRTtZQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQTBCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUM5RCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRWpELE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBc0IsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtvQkFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlCLE9BQU87aUJBQ1I7Z0JBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDcEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDL0MsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7b0JBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztpQkFDckQ7Z0JBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDeEMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQy9DLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztvQkFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO29CQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7aUJBQy9DO2dCQUVELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2pELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQztZQUVGLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFFNUMscUNBQXFDO1lBRXJDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUU5RixpQ0FBaUM7WUFDakMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDbkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ3hELENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDbkIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN0QixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDWixDQUFDLENBQUMsQ0FBQztZQUVILENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO29CQUN2RCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQzNELENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNaLENBQUMsQ0FBQyxDQUFDO1lBRUgsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7b0JBQ3ZELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDOUQsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ1osQ0FBQyxDQUFDLENBQUM7WUFFSCx1QkFBdUI7WUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQU8sQ0FBWSxFQUFFLEVBQUU7Z0JBQ3RFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUM7Z0JBQzFCLE1BQU0sS0FBSyxHQUFHLEVBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQ3hCLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixDQUFDLENBQUEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVWLG1DQUFtQztZQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN6RixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFFekQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzNCLENBQUMsQ0FBQztRQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQzFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUN0RixDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdEIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxLQUFLO1FBQ1gsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyx5QkFBeUIsQ0FBQztRQUNwRSxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsa0JBQWtCLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxLQUFLO1FBQ1gsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgJy4uLy4uL2Nzcy9zaGFyZWQtY29tcG9uZW50cy5jc3MnO1xuXG5leHBvcnQgY29uc3QgRVhDRUxfQkxPQl9UWVBFID0gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0JztcblxuZXhwb3J0IGNsYXNzIEZpbGVJbnB1dCB7XG4gIC8vIGV2ZW50cyB0byBlbWl0XG4gIHB1YmxpYyB1cGxvYWRlZEZpbGUkID0gbmV3IFN1YmplY3Q8RmlsZSB8IG51bGw+KCk7XG5cbiAgcHVibGljIHJvb3QgPSB1aS5kaXYoKTtcblxuICBwcml2YXRlIHZpc2libGVJbnB1dCA9IHVpLnN0cmluZ0lucHV0KCdJbnB1dCBmaWxlJywgdGhpcy5pbml0aWFsVGV4dCwgbnVsbCk7XG4gIHByaXZhdGUgaGlkZGVuSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICBwcml2YXRlIGljb24gPSB1aS5pY29uRkEoJ2Nsb3VkLXVwbG9hZCcsICgpID0+IHRoaXMuaGlkZGVuSW5wdXQuY2xpY2soKSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGluaXRpYWxUZXh0ID0gJ0RyYWctbi1kcm9wIGhlcmUnLFxuICAgIHB1YmxpYyBpbml0aWFsVmFsdWU6IEZpbGUgfCBudWxsID0gbnVsbCxcbiAgICBwdWJsaWMgb25WYWx1ZUNoYW5nZWQ6IEZ1bmN0aW9uIHwgbnVsbCA9IG51bGwsXG4gICAgcHVibGljIGZpbGVUeXBlID0gRVhDRUxfQkxPQl9UWVBFXG4gICkge1xuICAgIHRoaXMuZHJhdygpO1xuXG4gICAgaWYgKG9uVmFsdWVDaGFuZ2VkKVxuICAgICAgdGhpcy51cGxvYWRlZEZpbGUkLnN1YnNjcmliZSgobmV3VmFsdWU6IGFueSkgPT4gb25WYWx1ZUNoYW5nZWQobmV3VmFsdWUpKTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhdygpIHtcbiAgICB0aGlzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBjcmVhdGVGaWxlQXJlYSA9ICgpID0+IHtcbiAgICAgICh0aGlzLnZpc2libGVJbnB1dC5pbnB1dCBhcyBIVE1MSW5wdXRFbGVtZW50KS5yZWFkT25seSA9IHRydWU7XG4gICAgICB0aGlzLnZpc2libGVJbnB1dC5pbnB1dC5jbGFzc0xpc3QuYWRkKCdkZWZhdWx0Jyk7XG5cbiAgICAgIGNvbnN0IGhhbmRsZUZpbGVzID0gKGZpbGVzOiBGaWxlTGlzdCB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKCFmaWxlcyB8fCAhZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGUkLm5leHQobnVsbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0aGlzLnZpc2libGVJbnB1dC5pbnB1dC5jbGFzc0xpc3QucmVtb3ZlKCdzdWNjZXNzJyk7XG4gICAgICAgICAgdGhpcy52aXNpYmxlSW5wdXQuaW5wdXQuY2xhc3NMaXN0LmFkZCgnZXJyb3InKTtcbiAgICAgICAgICBjb25zdCBuZXdJY29uID0gdWkuaWNvbkZBKCdyZWRvJywgKCkgPT4gdGhpcy5oaWRkZW5JbnB1dC5jbGljaygpKTtcbiAgICAgICAgICB0aGlzLmljb24ucmVwbGFjZVdpdGgobmV3SWNvbik7XG4gICAgICAgICAgdGhpcy5pY29uID0gbmV3SWNvbjtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBzcGVjaWZ5IHNpbmdsZSBpbnB1dCBmaWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZpc2libGVJbnB1dC52YWx1ZSA9IGZpbGVzWzBdLm5hbWU7XG4gICAgICAgIGlmIChmaWxlc1swXS50eXBlICE9PSB0aGlzLmZpbGVUeXBlKSB7XG4gICAgICAgICAgdGhpcy52aXNpYmxlSW5wdXQuaW5wdXQuY2xhc3NMaXN0LnJlbW92ZSgnc3VjY2VzcycpO1xuICAgICAgICAgIHRoaXMudmlzaWJsZUlucHV0LmlucHV0LmNsYXNzTGlzdC5hZGQoJ2Vycm9yJyk7XG4gICAgICAgICAgY29uc3QgbmV3SWNvbiA9IHVpLmljb25GQSgncmVkbycsICgpID0+IHRoaXMuaGlkZGVuSW5wdXQuY2xpY2soKSk7XG4gICAgICAgICAgdGhpcy5pY29uLnJlcGxhY2VXaXRoKG5ld0ljb24pO1xuICAgICAgICAgIHRoaXMuaWNvbiA9IG5ld0ljb247XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIHR5cGUgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52aXNpYmxlSW5wdXQuaW5wdXQuY2xhc3NMaXN0LmFkZCgnc3VjY2VzcycpO1xuICAgICAgICBjb25zdCBuZXdJY29uID0gdWkuaWNvbkZBKCd0aW1lcycsICgpID0+IHRoaXMucmVzZXQoKSk7XG4gICAgICAgIHRoaXMuaWNvbi5yZXBsYWNlV2l0aChuZXdJY29uKTtcbiAgICAgICAgdGhpcy5pY29uID0gbmV3SWNvbjtcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGUkLm5leHQoZmlsZXNbMF0pO1xuICAgICAgfTtcblxuICAgICAgdGhpcy52aXNpYmxlSW5wdXQucm9vdC5jbGFzc0xpc3QuYWRkKCdjdi1kcm9wLWFyZWEnKTtcbiAgICAgIHRoaXMudmlzaWJsZUlucHV0LnJvb3Quc3R5bGUud2lkdGggPSAnMTAwJSc7XG5cbiAgICAgIC8vIGhpZGRlbiBpbnB1dCB0byBoYW5kbGUgZmlsZSBkaWFsb2dcblxuICAgICAgdGhpcy5oaWRkZW5JbnB1dC50eXBlID0gJ2ZpbGUnO1xuICAgICAgdGhpcy5oaWRkZW5JbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiBoYW5kbGVGaWxlcyh0aGlzLmhpZGRlbklucHV0LmZpbGVzKSwgZmFsc2UpO1xuXG4gICAgICAvLyBQcmV2ZW50IGRlZmF1bHQgZHJhZyBiZWhhdmlvcnNcbiAgICAgIFsnZHJhZ2VudGVyJywgJ2RyYWdvdmVyJywgJ2RyYWdsZWF2ZScsICdkcm9wJ10uZm9yRWFjaCgoZXZlbnROYW1lKSA9PiB7XG4gICAgICAgIHRoaXMudmlzaWJsZUlucHV0LmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCAoZSkgPT4ge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LCBmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgWydkcmFnZW50ZXInLCAnZHJhZ292ZXInXS5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcbiAgICAgICAgdGhpcy52aXNpYmxlSW5wdXQuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnZpc2libGVJbnB1dC5pbnB1dC5jbGFzc0xpc3QuYWRkKCdkcmFnLW4tZHJvcHBpbmcnKTtcbiAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIFsnZHJhZ2xlYXZlJywgJ2Ryb3AnXS5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcbiAgICAgICAgdGhpcy52aXNpYmxlSW5wdXQuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnZpc2libGVJbnB1dC5pbnB1dC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnLW4tZHJvcHBpbmcnKTtcbiAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEhhbmRsZSBkcm9wcGVkIGZpbGVzXG4gICAgICB0aGlzLnZpc2libGVJbnB1dC5pbnB1dC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgYXN5bmMgKGU6IERyYWdFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkdCA9IGUuZGF0YVRyYW5zZmVyO1xuICAgICAgICBjb25zdCBmaWxlcyA9IGR0IS5maWxlcztcbiAgICAgICAgaGFuZGxlRmlsZXMoZmlsZXMpO1xuICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAvLyBQYXNzIGNsaWNrcyB0byBoaWRkZW4gZmlsZSBpbnB1dFxuICAgICAgdGhpcy52aXNpYmxlSW5wdXQuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmhpZGRlbklucHV0LmNsaWNrKCksIGZhbHNlKTtcbiAgICAgIHRoaXMudmlzaWJsZUlucHV0LnJvb3QuYXBwZW5kKHVpLmRpdih0aGlzLmljb24sICdpY29uJykpO1xuXG4gICAgICByZXR1cm4gdGhpcy52aXNpYmxlSW5wdXQ7XG4gICAgfTtcblxuICAgIFsnZHJhZycsICdkcmFnZW50ZXInXS5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xheW91dC13b3JrYXJlYScpWzBdLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCAoZSkgPT4ge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yb290LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgdGhpcy5yb290LmFwcGVuZChjcmVhdGVGaWxlQXJlYSgpLnJvb3QpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldCgpIHtcbiAgICB0aGlzLnZpc2libGVJbnB1dC5pbnB1dC5jbGFzc0xpc3QudmFsdWUgPSAndWktaW5wdXQtZWRpdG9yIGRlZmF1bHQnO1xuICAgIGNvbnN0IG5ld0ljb24gPSB1aS5pY29uRkEoJ2Nsb3VkLXVwbG9hZCcsICgpID0+IHRoaXMuaGlkZGVuSW5wdXQuY2xpY2soKSk7XG4gICAgdGhpcy5pY29uLnJlcGxhY2VXaXRoKG5ld0ljb24pO1xuICAgIHRoaXMuaWNvbiA9IG5ld0ljb247XG4gICAgdGhpcy52aXNpYmxlSW5wdXQudmFsdWUgPSAnRHJhZy1uLWRyb3AgaGVyZSc7XG4gICAgdGhpcy5oaWRkZW5JbnB1dC52YWx1ZSA9ICcnO1xuICAgIHRoaXMudXBsb2FkZWRGaWxlJC5uZXh0KG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhcigpIHtcbiAgICB1aS5lbXB0eSh0aGlzLnJvb3QpO1xuICB9XG59XG4iXX0=
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZpbGUtaW5wdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBRUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBQUMsZUFBZSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sVUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV2QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsbUVBQW1FLENBQUM7QUFFbkcsTUFBTSxPQUFPLFNBQVM7SUFnQnBCLFlBQ1MsY0FBYyxrQkFBa0IsRUFDaEMsZUFBNEIsSUFBSSxFQUNoQyxpQkFBa0MsSUFBSSxFQUN0QyxXQUFXLGVBQWU7UUFIMUIsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO1FBQ2hDLGlCQUFZLEdBQVosWUFBWSxDQUFvQjtRQUNoQyxtQkFBYyxHQUFkLGNBQWMsQ0FBd0I7UUFDdEMsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUFuQm5DLGlCQUFpQjtRQUNWLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQWUsQ0FBQztRQUNsRCxzQ0FBc0M7UUFDL0IsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQ25ELHlCQUF5QjtRQUNsQixTQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLG9CQUFvQjtRQUNiLGVBQVUsR0FBRyxJQUFJLFVBQVUsRUFBUSxDQUFDO1FBRW5DLGlCQUFZLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRSxnQkFBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsU0FBSSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFD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SUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsa0JBQWtCLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxLQUFLO1FBQ1gsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCAnLi4vLi4vY3NzL3NoYXJlZC1jb21wb25lbnRzLmNzcyc7XG5pbXBvcnQgVmFsaWRhdGlvbiBmcm9tICcuLi92YWxpZGF0aW9uJztcblxuZXhwb3J0IGNvbnN0IEVYQ0VMX0JMT0JfVFlQRSA9ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCc7XG5cbmV4cG9ydCBjbGFzcyBGaWxlSW5wdXQge1xuICAvLyBldmVudHMgdG8gZW1pdFxuICBwdWJsaWMgdXBsb2FkZWRGaWxlJCA9IG5ldyBTdWJqZWN0PEZpbGUgfCBudWxsPigpO1xuICAvLyBzYW1lIGV2ZW50IGFzIGFib3ZlIGJ1dCBpbiBERy1zdHlsZVxuICBwdWJsaWMgb25GaWxlVXBsb2FkZWQgPSBuZXcgU3ViamVjdDxGaWxlIHwgbnVsbD4oKTtcbiAgLy8gSFRNTCByb290IG9mIGNvbXBvbmVudFxuICBwdWJsaWMgcm9vdCA9IHVpLmRpdigpO1xuICAvLyBWYWxpZGF0aW9uIG9iamVjdFxuICBwdWJsaWMgdmFsaWRhdGlvbiA9IG5ldyBWYWxpZGF0aW9uPEZpbGU+KCk7XG5cbiAgcHJpdmF0ZSB2aXNpYmxlSW5wdXQgPSB1aS5zdHJpbmdJbnB1dCgnSW5wdXQgZmlsZScsIHRoaXMuaW5pdGlhbFRleHQsIG51bGwpO1xuICBwcml2YXRlIGhpZGRlbklucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgcHJpdmF0ZSBpY29uID0gdWkuaWNvbkZBKCdjbG91ZC11cGxvYWQnLCAoKSA9PiB0aGlzLmhpZGRlbklucHV0LmNsaWNrKCkpO1xuXG4gIHByaXZhdGUgaXNWYWxpZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGluaXRpYWxUZXh0ID0gJ0RyYWctbi1kcm9wIGhlcmUnLFxuICAgIHB1YmxpYyBpbml0aWFsVmFsdWU6IEZpbGUgfCBudWxsID0gbnVsbCxcbiAgICBwdWJsaWMgb25WYWx1ZUNoYW5nZWQ6IEZ1bmN0aW9uIHwgbnVsbCA9IG51bGwsXG4gICAgcHVibGljIGZpbGVUeXBlID0gRVhDRUxfQkxPQl9UWVBFXG4gICkge1xuICAgIHRoaXMuZHJhdygpO1xuXG4gICAgdGhpcy5pc1ZhbGlkLnN1YnNjcmliZSgoaXNWYWxpZCkgPT4ge1xuICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgdGhpcy52aXNpYmxlSW5wdXQuaW5wdXQuY2xhc3NMaXN0LnJlbW92ZSgnZXJyb3InKTtcbiAgICAgICAgdGhpcy52aXNpYmxlSW5wdXQuaW5wdXQuY2xhc3NMaXN0LmFkZCgnc3VjY2VzcycpO1xuICAgICAgICBjb25zdCBuZXdJY29uID0gdWkuaWNvbkZBKCd0aW1lcycsICgpID0+IHRoaXMucmVzZXQoKSk7XG4gICAgICAgIHRoaXMuaWNvbi5yZXBsYWNlV2l0aChuZXdJY29uKTtcbiAgICAgICAgdGhpcy5pY29uID0gbmV3SWNvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmlzaWJsZUlucHV0LmlucHV0LmNsYXNzTGlzdC5yZW1vdmUoJ3N1Y2Nlc3MnKTtcbiAgICAgICAgdGhpcy52aXNpYmxlSW5wdXQuaW5wdXQuY2xhc3NMaXN0LmFkZCgnZXJyb3InKTtcbiAgICAgICAgY29uc3QgbmV3SWNvbiA9IHVpLmljb25GQSgncmVkbycsICgpID0+IHRoaXMuaGlkZGVuSW5wdXQuY2xpY2soKSk7XG4gICAgICAgIHRoaXMuaWNvbi5yZXBsYWNlV2l0aChuZXdJY29uKTtcbiAgICAgICAgdGhpcy5pY29uID0gbmV3SWNvbjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudXBsb2FkZWRGaWxlJC5zdWJzY3JpYmUoKGZpbGUpID0+IHRoaXMub25GaWxlVXBsb2FkZWQubmV4dChmaWxlKSk7XG5cbiAgICBpZiAob25WYWx1ZUNoYW5nZWQpXG4gICAgICB0aGlzLnVwbG9hZGVkRmlsZSQuc3Vic2NyaWJlKChuZXdWYWx1ZTogYW55KSA9PiBvblZhbHVlQ2hhbmdlZChuZXdWYWx1ZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3KCkge1xuICAgIHRoaXMuY2xlYXIoKTtcblxuICAgIGNvbnN0IGNyZWF0ZUZpbGVBcmVhID0gKCkgPT4ge1xuICAgICAgKHRoaXMudmlzaWJsZUlucHV0LmlucHV0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnJlYWRPbmx5ID0gdHJ1ZTtcbiAgICAgIHRoaXMudmlzaWJsZUlucHV0LmlucHV0LmNsYXNzTGlzdC5hZGQoJ2RlZmF1bHQnKTtcblxuICAgICAgY29uc3QgaGFuZGxlRmlsZXMgPSBhc3luYyAoZmlsZXM6IEZpbGVMaXN0IHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAoIWZpbGVzIHx8ICFmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZSQubmV4dChudWxsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRoaXMuaXNWYWxpZC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBzcGVjaWZ5IHNpbmdsZSBpbnB1dCBmaWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZpc2libGVJbnB1dC52YWx1ZSA9IGZpbGVzWzBdLm5hbWU7XG4gICAgICAgIGlmIChmaWxlc1swXS50eXBlICE9PSB0aGlzLmZpbGVUeXBlKSB7XG4gICAgICAgICAgdGhpcy5pc1ZhbGlkLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNWYWxpZC5uZXh0KGF3YWl0IHRoaXMudmFsaWRhdGlvbi52YWxpZGF0ZShmaWxlc1swXSkpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQudmFsdWUpXG4gICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGUkLm5leHQoZmlsZXNbMF0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGUkLm5leHQobnVsbCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnZpc2libGVJbnB1dC5yb290LmNsYXNzTGlzdC5hZGQoJ2N2LWRyb3AtYXJlYScpO1xuICAgICAgdGhpcy52aXNpYmxlSW5wdXQucm9vdC5zdHlsZS53aWR0aCA9ICcxMDAlJztcblxuICAgICAgLy8gaGlkZGVuIGlucHV0IHRvIGhhbmRsZSBmaWxlIGRpYWxvZ1xuXG4gICAgICB0aGlzLmhpZGRlbklucHV0LnR5cGUgPSAnZmlsZSc7XG4gICAgICB0aGlzLmhpZGRlbklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jICgpID0+IGF3YWl0IGhhbmRsZUZpbGVzKHRoaXMuaGlkZGVuSW5wdXQuZmlsZXMpLCBmYWxzZSk7XG5cbiAgICAgIC8vIFByZXZlbnQgZGVmYXVsdCBkcmFnIGJlaGF2aW9yc1xuICAgICAgWydkcmFnZW50ZXInLCAnZHJhZ292ZXInLCAnZHJhZ2xlYXZlJywgJ2Ryb3AnXS5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcbiAgICAgICAgdGhpcy52aXNpYmxlSW5wdXQuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIChlKSA9PiB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICBbJ2RyYWdlbnRlcicsICdkcmFnb3ZlciddLmZvckVhY2goKGV2ZW50TmFtZSkgPT4ge1xuICAgICAgICB0aGlzLnZpc2libGVJbnB1dC5pbnB1dC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMudmlzaWJsZUlucHV0LmlucHV0LmNsYXNzTGlzdC5hZGQoJ2RyYWctbi1kcm9wcGluZycpO1xuICAgICAgICB9LCBmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgWydkcmFnbGVhdmUnLCAnZHJvcCddLmZvckVhY2goKGV2ZW50TmFtZSkgPT4ge1xuICAgICAgICB0aGlzLnZpc2libGVJbnB1dC5pbnB1dC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMudmlzaWJsZUlucHV0LmlucHV0LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctbi1kcm9wcGluZycpO1xuICAgICAgICB9LCBmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gSGFuZGxlIGRyb3BwZWQgZmlsZXNcbiAgICAgIHRoaXMudmlzaWJsZUlucHV0LmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBhc3luYyAoZTogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGR0ID0gZS5kYXRhVHJhbnNmZXI7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gZHQhLmZpbGVzO1xuICAgICAgICBoYW5kbGVGaWxlcyhmaWxlcyk7XG4gICAgICB9LCBmYWxzZSk7XG5cbiAgICAgIC8vIFBhc3MgY2xpY2tzIHRvIGhpZGRlbiBmaWxlIGlucHV0XG4gICAgICB0aGlzLnZpc2libGVJbnB1dC5pbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuaGlkZGVuSW5wdXQuY2xpY2soKSwgZmFsc2UpO1xuICAgICAgdGhpcy52aXNpYmxlSW5wdXQucm9vdC5hcHBlbmQodWkuZGl2KHRoaXMuaWNvbiwgJ2ljb24nKSk7XG5cbiAgICAgIHJldHVybiB0aGlzLnZpc2libGVJbnB1dDtcbiAgICB9O1xuXG4gICAgWydkcmFnJywgJ2RyYWdlbnRlciddLmZvckVhY2goKGV2ZW50TmFtZSkgPT4ge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF5b3V0LXdvcmthcmVhJylbMF0uYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIChlKSA9PiB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9LCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJvb3Quc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICB0aGlzLnJvb3QuYXBwZW5kKGNyZWF0ZUZpbGVBcmVhKCkucm9vdCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0KCkge1xuICAgIHRoaXMudmlzaWJsZUlucHV0LmlucHV0LmNsYXNzTGlzdC52YWx1ZSA9ICd1aS1pbnB1dC1lZGl0b3IgZGVmYXVsdCc7XG4gICAgY29uc3QgbmV3SWNvbiA9IHVpLmljb25GQSgnY2xvdWQtdXBsb2FkJywgKCkgPT4gdGhpcy5oaWRkZW5JbnB1dC5jbGljaygpKTtcbiAgICB0aGlzLmljb24ucmVwbGFjZVdpdGgobmV3SWNvbik7XG4gICAgdGhpcy5pY29uID0gbmV3SWNvbjtcbiAgICB0aGlzLnZpc2libGVJbnB1dC52YWx1ZSA9ICdEcmFnLW4tZHJvcCBoZXJlJztcbiAgICB0aGlzLmhpZGRlbklucHV0LnZhbHVlID0gJyc7XG4gICAgdGhpcy51cGxvYWRlZEZpbGUkLm5leHQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyKCkge1xuICAgIHVpLmVtcHR5KHRoaXMucm9vdCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,56 @@
1
+ import ExcelJS from 'exceljs';
2
+ declare type ValidationSuccess = {
3
+ isValid: true;
4
+ chainedFuncs?: ValidatingFunc[];
5
+ result?: any;
6
+ };
7
+ declare type ValidationFailure = {
8
+ isValid: false;
9
+ caption: string;
10
+ content: HTMLElement | string;
11
+ };
12
+ declare type ValidationResult = ValidationSuccess | ValidationFailure;
13
+ export declare type ValidatingFunc = ((arg: any) => Promise<ValidationResult>);
14
+ declare type InitialValidatingFunc<InitialArgType> = ((arg: InitialArgType) => Promise<ValidationResult>);
15
+ declare class Validation<InitialArgType> {
16
+ validators: InitialValidatingFunc<InitialArgType>[];
17
+ constructor(validators?: InitialValidatingFunc<InitialArgType>[]);
18
+ validate(initialArg: InitialArgType): Promise<boolean>;
19
+ }
20
+ export declare namespace v8n {
21
+ const isSheetExist: (sheetName: string, chainedFuncs?: ValidatingFunc[]) => (importedWb: ExcelJS.Workbook) => Promise<{
22
+ isValid: boolean;
23
+ caption: string;
24
+ content: string;
25
+ chainedFuncs?: undefined;
26
+ result?: undefined;
27
+ } | {
28
+ isValid: true;
29
+ chainedFuncs: ValidatingFunc[] | undefined;
30
+ result: ExcelJS.Worksheet;
31
+ caption?: undefined;
32
+ content?: undefined;
33
+ }>;
34
+ const isColumnExist: (columnName: string, chainedFuncs?: ValidatingFunc[]) => (sheet: ExcelJS.Worksheet) => Promise<{
35
+ isValid: boolean;
36
+ caption: string;
37
+ content: string;
38
+ chainedFuncs?: undefined;
39
+ } | {
40
+ isValid: true;
41
+ chainedFuncs: ValidatingFunc[] | undefined;
42
+ caption?: undefined;
43
+ content?: undefined;
44
+ }>;
45
+ const isExcelParsed: (chainedFuncs?: ValidatingFunc[]) => (file: File) => Promise<{
46
+ isValid: true;
47
+ chainedFuncs: ValidatingFunc[] | undefined;
48
+ result: ExcelJS.Workbook;
49
+ } | {
50
+ isValid: boolean;
51
+ caption: string;
52
+ content: string;
53
+ }>;
54
+ }
55
+ export default Validation;
56
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["validation.ts"],"names":[],"mappings":"AAKA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,aAAK,iBAAiB,GAAG;IAAC,OAAO,EAAE,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,GAAG,CAAA;CAAC,CAAC;AACxF,aAAK,iBAAiB,GAAG;IAAC,OAAO,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAAA;CAAC,CAAC;AAC1F,aAAK,gBAAgB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAC9D,oBAAY,cAAc,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACvE,aAAK,qBAAqB,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAElG,cAAM,UAAU,CAAC,cAAc;IAGpB,UAAU,EAAE,qBAAqB,CAAC,cAAc,CAAC,EAAE;gBAAnD,UAAU,GAAE,qBAAqB,CAAC,cAAc,CAAC,EAAO;IAKpD,QAAQ,CAAC,UAAU,EAAE,cAAc;CAkFjD;AAED,yBAAiB,GAAG,CAAC;IACZ,MAAM,YAAY,cAAe,MAAM,iBAAiB,cAAc,EAAE,kBAAwB,QAAQ,QAAQ;;;;;;;;;;;;MAiBtH,CAAC;IAEK,MAAM,aAAa,eAAgB,MAAM,iBAAiB,cAAc,EAAE,aAAmB,QAAQ,SAAS;;;;;;;;;;MAkBpH,CAAC;IAEK,MAAM,aAAa,kBAAmB,cAAc,EAAE,YAAkB,IAAI;;;;;;;;MAmBlF,CAAC;CACH;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,152 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import * as ui from 'datagrok-api/ui';
11
+ import * as DG from 'datagrok-api/dg';
12
+ import $ from 'cash-dom';
13
+ import ExcelJS from 'exceljs';
14
+ class Validation {
15
+ constructor(
16
+ // Validation functions to be stored and applied
17
+ validators = []) {
18
+ this.validators = validators;
19
+ }
20
+ validate(initialArg) {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ const failedValidations = [];
23
+ const checkCustomValidators = (validators, result) => __awaiter(this, void 0, void 0, function* () {
24
+ for (const validator of validators) {
25
+ const validationRes = yield validator(result);
26
+ if (!validationRes.isValid)
27
+ failedValidations.push(validationRes);
28
+ else if (validationRes.chainedFuncs)
29
+ yield checkCustomValidators(validationRes.chainedFuncs, validationRes.result);
30
+ }
31
+ });
32
+ for (const validator of this.validators) {
33
+ const validationRes = yield validator(initialArg);
34
+ if (!validationRes.isValid)
35
+ failedValidations.push(validationRes);
36
+ else if (validationRes.chainedFuncs)
37
+ yield checkCustomValidators(validationRes.chainedFuncs, validationRes.result);
38
+ }
39
+ if (failedValidations.length == 0)
40
+ return true;
41
+ const wizard = new DG.Wizard({ title: 'Data validation failed' });
42
+ failedValidations.forEach((validation) => {
43
+ wizard.page({
44
+ caption: validation.caption,
45
+ root: (validation.content instanceof HTMLElement ? validation.content : ui.markdown(validation.content)),
46
+ });
47
+ });
48
+ wizard.onOK(() => { });
49
+ const btnCancel = wizard.getButton('CANCEL');
50
+ const btnBack = wizard.getButton('<<');
51
+ const btnNext = wizard.getButton('>>');
52
+ const btnOk = wizard.getButton('OK');
53
+ const pagesLength = wizard.pages.length;
54
+ const stepCounter = ui.divText('1/' + pagesLength);
55
+ stepCounter.style.position = 'absolute';
56
+ stepCounter.style.left = '12px';
57
+ stepCounter.style.color = 'var(--grey-5)';
58
+ wizard.captionHost.style.fontSize = '20px';
59
+ wizard.captionHost.style.fontWeight = '400';
60
+ wizard.captionHost.style.margin = '6px 0';
61
+ $(wizard.root).find('.d4-command-bar').append(stepCounter);
62
+ $(btnBack).html('BACK');
63
+ $(btnNext).html('NEXT');
64
+ $(btnOk).addClass('disabled');
65
+ btnCancel.style.display = 'none';
66
+ btnBack.addEventListener('click', () => {
67
+ const curIndex = wizard.pageIndex + 1;
68
+ const pageIndex = wizard.pages.length;
69
+ wizard.captionHost.style.fontSize = '20px';
70
+ wizard.captionHost.style.fontWeight = '400';
71
+ wizard.captionHost.style.margin = '6px 0';
72
+ if (!wizard.completable)
73
+ $(btnOk).addClass('disabled');
74
+ stepCounter.textContent = curIndex + '/' + pageIndex;
75
+ });
76
+ btnNext.addEventListener('click', () => {
77
+ const curIndex = wizard.pageIndex + 1;
78
+ const pageIndex = wizard.pages.length;
79
+ wizard.captionHost.style.fontSize = '20px';
80
+ wizard.captionHost.style.fontWeight = '400';
81
+ wizard.captionHost.style.margin = '6px 0';
82
+ if (wizard.completable)
83
+ $(btnOk).removeClass('disabled');
84
+ stepCounter.textContent = curIndex + '/' + pageIndex;
85
+ });
86
+ wizard.show();
87
+ return false;
88
+ });
89
+ }
90
+ }
91
+ export var v8n;
92
+ (function (v8n) {
93
+ v8n.isSheetExist = (sheetName, chainedFuncs) => (importedWb) => __awaiter(this, void 0, void 0, function* () {
94
+ const datasetWs = importedWb.worksheets.find((ws) => ws.name === sheetName);
95
+ if (!datasetWs) {
96
+ return {
97
+ isValid: false,
98
+ caption: `Sheet named '${sheetName}' is not found`,
99
+ content: `Sheet name should be exactly \`${sheetName}\` to be parsed.
100
+ \n
101
+ Please double-check:
102
+ - No extra spaces are in the sheet name
103
+ - Capitalization is the same as in the template
104
+ \n
105
+ ${importedWb.worksheets.length > 0 ? `Found sheets: \`${importedWb.worksheets.map((ws) => ws.name).join('`,`')}\`` : `No columns have found.`}
106
+ `
107
+ };
108
+ }
109
+ return { isValid: true, chainedFuncs, result: datasetWs };
110
+ });
111
+ v8n.isColumnExist = (columnName, chainedFuncs) => (sheet) => __awaiter(this, void 0, void 0, function* () {
112
+ const vals = sheet.getRow(1).values;
113
+ if (!vals.includes(columnName)) {
114
+ return {
115
+ isValid: false,
116
+ caption: `No column "${columnName}" in "${sheet.name}" sheet`,
117
+ content: `Column name should be exactly \`${columnName}\` to be parsed.
118
+ \n
119
+ Please double-check:
120
+ - Column names are in the first row of the sheet
121
+ - No extra spaces are in the cell
122
+ - Capitalization is the same as in the template
123
+ \n
124
+ ${vals.length > 0 ? `Found columns: \`${vals.filter((val) => val !== '').join('`,`')}\`` : `No columns have found.`}
125
+ `
126
+ };
127
+ }
128
+ return { isValid: true, chainedFuncs };
129
+ });
130
+ v8n.isExcelParsed = (chainedFuncs) => (file) => __awaiter(this, void 0, void 0, function* () {
131
+ const importedWb = new ExcelJS.Workbook();
132
+ return importedWb.xlsx.load(yield file.arrayBuffer())
133
+ .then((workbook) => __awaiter(this, void 0, void 0, function* () {
134
+ return { isValid: true, chainedFuncs, result: workbook };
135
+ }))
136
+ .catch(() => {
137
+ return {
138
+ isValid: false,
139
+ caption: 'File is failed to parse',
140
+ content: `Please make sure:
141
+ - XLSX format is used (not XLS or XLSM)
142
+ - File should not be corrupted
143
+ \n
144
+ XLS could be converted to XLSX using Excel's export functionality. \n
145
+ If the file is corrupted, it will not open in Excel.
146
+ `,
147
+ };
148
+ });
149
+ });
150
+ })(v8n || (v8n = {}));
151
+ export default Validation;
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBRUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sQ0FBQyxNQUFNLFVBQVUsQ0FBQztBQUN6QixPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFROUIsTUFBTSxVQUFVO0lBQ2Q7SUFDRSxnREFBZ0Q7SUFDekMsYUFBc0QsRUFBRTtRQUF4RCxlQUFVLEdBQVYsVUFBVSxDQUE4QztJQUdqRSxDQUFDO0lBRVksUUFBUSxDQUFDLFVBQTBCOztZQUM5QyxNQUFNLGlCQUFpQixHQUFHLEVBQXlCLENBQUM7WUFDcEQsTUFBTSxxQkFBcUIsR0FBRyxDQUFPLFVBQTRCLEVBQUUsTUFBVyxFQUFFLEVBQUU7Z0JBQ2hGLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO29CQUNsQyxNQUFNLGFBQWEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPO3dCQUN4QixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7eUJBQ25DLElBQUksYUFBYSxDQUFDLFlBQVk7d0JBQUUsTUFBTSxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDcEg7WUFDSCxDQUFDLENBQUEsQ0FBQztZQUVGLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDdkMsTUFBTSxhQUFhLEdBQUcsTUFBTSxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTztvQkFDeEIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FB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b0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQyx3QkFBd0I7U0FDekc7YUFDRixDQUFDO1NBQ0g7UUFDRCxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQVksRUFBRSxZQUFZLEVBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUEsQ0FBQztJQUVXLGlCQUFhLEdBQUcsQ0FBQyxZQUErQixFQUFFLEVBQUUsQ0FBQyxDQUFPLElBQVUsRUFBRSxFQUFFO1FBQ3JGLE1BQU0sVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDbEQsSUFBSSxDQUFDLENBQU8sUUFBUSxFQUFFLEVBQUU7WUFDdkIsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUEsQ0FBQzthQUNELEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDVixPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE9BQU8sRUFBRSx5QkFBeUI7Z0JBQ2xDLE9BQU8sRUFBRTs7Ozs7O1dBTVI7YUFDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUEsQ0FBQztBQUNKLENBQUMsRUE1RGdCLEdBQUcsS0FBSCxHQUFHLFFBNERuQjtBQUVELGVBQWUsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCAkIGZyb20gJ2Nhc2gtZG9tJztcbmltcG9ydCBFeGNlbEpTIGZyb20gJ2V4Y2VsanMnO1xuXG50eXBlIFZhbGlkYXRpb25TdWNjZXNzID0ge2lzVmFsaWQ6IHRydWUsIGNoYWluZWRGdW5jcz86IFZhbGlkYXRpbmdGdW5jW10sIHJlc3VsdD86IGFueX07XG50eXBlIFZhbGlkYXRpb25GYWlsdXJlID0ge2lzVmFsaWQ6IGZhbHNlLCBjYXB0aW9uOiBzdHJpbmcsIGNvbnRlbnQ6IEhUTUxFbGVtZW50IHwgc3RyaW5nfTtcbnR5cGUgVmFsaWRhdGlvblJlc3VsdCA9IFZhbGlkYXRpb25TdWNjZXNzIHwgVmFsaWRhdGlvbkZhaWx1cmU7XG5leHBvcnQgdHlwZSBWYWxpZGF0aW5nRnVuYyA9ICgoYXJnOiBhbnkpID0+IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdD4pO1xudHlwZSBJbml0aWFsVmFsaWRhdGluZ0Z1bmM8SW5pdGlhbEFyZ1R5cGU+ID0gKChhcmc6IEluaXRpYWxBcmdUeXBlKSA9PiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ+KTtcblxuY2xhc3MgVmFsaWRhdGlvbjxJbml0aWFsQXJnVHlwZT4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICAvLyBWYWxpZGF0aW9uIGZ1bmN0aW9ucyB0byBiZSBzdG9yZWQgYW5kIGFwcGxpZWRcbiAgICBwdWJsaWMgdmFsaWRhdG9yczogSW5pdGlhbFZhbGlkYXRpbmdGdW5jPEluaXRpYWxBcmdUeXBlPltdID0gW11cbiAgKSB7XG5cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZShpbml0aWFsQXJnOiBJbml0aWFsQXJnVHlwZSkge1xuICAgIGNvbnN0IGZhaWxlZFZhbGlkYXRpb25zID0gW10gYXMgVmFsaWRhdGlvbkZhaWx1cmVbXTtcbiAgICBjb25zdCBjaGVja0N1c3RvbVZhbGlkYXRvcnMgPSBhc3luYyAodmFsaWRhdG9yczogVmFsaWRhdGluZ0Z1bmNbXSwgcmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIHZhbGlkYXRvcnMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlcyA9IGF3YWl0IHZhbGlkYXRvcihyZXN1bHQpO1xuICAgICAgICBpZiAoIXZhbGlkYXRpb25SZXMuaXNWYWxpZClcbiAgICAgICAgICBmYWlsZWRWYWxpZGF0aW9ucy5wdXNoKHZhbGlkYXRpb25SZXMpO1xuICAgICAgICBlbHNlIGlmICh2YWxpZGF0aW9uUmVzLmNoYWluZWRGdW5jcykgYXdhaXQgY2hlY2tDdXN0b21WYWxpZGF0b3JzKHZhbGlkYXRpb25SZXMuY2hhaW5lZEZ1bmNzLCB2YWxpZGF0aW9uUmVzLnJlc3VsdCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIHRoaXMudmFsaWRhdG9ycykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlcyA9IGF3YWl0IHZhbGlkYXRvcihpbml0aWFsQXJnKTtcbiAgICAgIGlmICghdmFsaWRhdGlvblJlcy5pc1ZhbGlkKVxuICAgICAgICBmYWlsZWRWYWxpZGF0aW9ucy5wdXNoKHZhbGlkYXRpb25SZXMpO1xuICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblJlcy5jaGFpbmVkRnVuY3MpIGF3YWl0IGNoZWNrQ3VzdG9tVmFsaWRhdG9ycyh2YWxpZGF0aW9uUmVzLmNoYWluZWRGdW5jcywgdmFsaWRhdGlvblJlcy5yZXN1bHQpO1xuICAgIH1cblxuICAgIGlmIChmYWlsZWRWYWxpZGF0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCB3aXphcmQgPSBuZXcgREcuV2l6YXJkKHt0aXRsZTogJ0RhdGEgdmFsaWRhdGlvbiBmYWlsZWQnfSk7XG5cbiAgICBmYWlsZWRWYWxpZGF0aW9ucy5mb3JFYWNoKCh2YWxpZGF0aW9uKSA9PiB7XG4gICAgICB3aXphcmQucGFnZSh7XG4gICAgICAgIGNhcHRpb246IHZhbGlkYXRpb24uY2FwdGlvbixcbiAgICAgICAgcm9vdDogKHZhbGlkYXRpb24uY29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gdmFsaWRhdGlvbi5jb250ZW50IDogdWkubWFya2Rvd24odmFsaWRhdGlvbi5jb250ZW50KSkgYXMgSFRNTERpdkVsZW1lbnQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB3aXphcmQub25PSygoKSA9PiB7fSk7XG5cbiAgICBjb25zdCBidG5DYW5jZWwgPSB3aXphcmQuZ2V0QnV0dG9uKCdDQU5DRUwnKTtcbiAgICBjb25zdCBidG5CYWNrID0gd2l6YXJkLmdldEJ1dHRvbignPDwnKTtcbiAgICBjb25zdCBidG5OZXh0ID0gd2l6YXJkLmdldEJ1dHRvbignPj4nKTtcbiAgICBjb25zdCBidG5PayA9IHdpemFyZC5nZXRCdXR0b24oJ09LJyk7XG5cbiAgICBjb25zdCBwYWdlc0xlbmd0aCA9IHdpemFyZC5wYWdlcy5sZW5ndGg7XG5cbiAgICBjb25zdCBzdGVwQ291bnRlciA9IHVpLmRpdlRleHQoJzEvJytwYWdlc0xlbmd0aCk7XG4gICAgc3RlcENvdW50ZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHN0ZXBDb3VudGVyLnN0eWxlLmxlZnQgPSAnMTJweCc7XG4gICAgc3RlcENvdW50ZXIuc3R5bGUuY29sb3IgPSAndmFyKC0tZ3JleS01KSc7XG5cbiAgICB3aXphcmQuY2FwdGlvbkhvc3Quc3R5bGUuZm9udFNpemUgPSAnMjBweCc7XG4gICAgd2l6YXJkLmNhcHRpb25Ib3N0LnN0eWxlLmZvbnRXZWlnaHQgPSAnNDAwJztcbiAgICB3aXphcmQuY2FwdGlvbkhvc3Quc3R5bGUubWFyZ2luID0gJzZweCAwJztcblxuICAgICQod2l6YXJkLnJvb3QpLmZpbmQoJy5kNC1jb21tYW5kLWJhcicpLmFwcGVuZChzdGVwQ291bnRlcik7XG4gICAgJChidG5CYWNrKS5odG1sKCdCQUNLJyk7XG4gICAgJChidG5OZXh0KS5odG1sKCdORVhUJyk7XG4gICAgJChidG5PaykuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG4gICAgYnRuQ2FuY2VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICBidG5CYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCk9PntcbiAgICAgIGNvbnN0IGN1ckluZGV4ID0gd2l6YXJkLnBhZ2VJbmRleCsxO1xuICAgICAgY29uc3QgcGFnZUluZGV4ID0gd2l6YXJkLnBhZ2VzLmxlbmd0aDtcblxuICAgICAgd2l6YXJkLmNhcHRpb25Ib3N0LnN0eWxlLmZvbnRTaXplID0gJzIwcHgnO1xuICAgICAgd2l6YXJkLmNhcHRpb25Ib3N0LnN0eWxlLmZvbnRXZWlnaHQgPSAnNDAwJztcbiAgICAgIHdpemFyZC5jYXB0aW9uSG9zdC5zdHlsZS5tYXJnaW4gPSAnNnB4IDAnO1xuXG4gICAgICBpZiAoIXdpemFyZC5jb21wbGV0YWJsZSlcbiAgICAgICAgJChidG5PaykuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cbiAgICAgIHN0ZXBDb3VudGVyLnRleHRDb250ZW50ID0gY3VySW5kZXgrJy8nK3BhZ2VJbmRleDtcbiAgICB9KTtcblxuICAgIGJ0bk5leHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKT0+e1xuICAgICAgY29uc3QgY3VySW5kZXggPSB3aXphcmQucGFnZUluZGV4KzE7XG4gICAgICBjb25zdCBwYWdlSW5kZXggPSB3aXphcmQucGFnZXMubGVuZ3RoO1xuXG4gICAgICB3aXphcmQuY2FwdGlvbkhvc3Quc3R5bGUuZm9udFNpemUgPSAnMjBweCc7XG4gICAgICB3aXphcmQuY2FwdGlvbkhvc3Quc3R5bGUuZm9udFdlaWdodCA9ICc0MDAnO1xuICAgICAgd2l6YXJkLmNhcHRpb25Ib3N0LnN0eWxlLm1hcmdpbiA9ICc2cHggMCc7XG5cbiAgICAgIGlmICh3aXphcmQuY29tcGxldGFibGUpXG4gICAgICAgICQoYnRuT2spLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgc3RlcENvdW50ZXIudGV4dENvbnRlbnQgPSBjdXJJbmRleCsnLycrcGFnZUluZGV4O1xuICAgIH0pO1xuXG4gICAgd2l6YXJkLnNob3coKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSB2OG4ge1xuICBleHBvcnQgY29uc3QgaXNTaGVldEV4aXN0ID0gKHNoZWV0TmFtZTogc3RyaW5nLCBjaGFpbmVkRnVuY3M/OiBWYWxpZGF0aW5nRnVuY1tdKSA9PiBhc3luYyAoaW1wb3J0ZWRXYjogRXhjZWxKUy5Xb3JrYm9vaykgPT4ge1xuICAgIGNvbnN0IGRhdGFzZXRXcyA9IGltcG9ydGVkV2Iud29ya3NoZWV0cy5maW5kKCh3cykgPT4gd3MubmFtZSA9PT0gc2hlZXROYW1lKTtcbiAgICBpZiAoIWRhdGFzZXRXcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGNhcHRpb246IGBTaGVldCBuYW1lZCAnJHtzaGVldE5hbWV9JyBpcyBub3QgZm91bmRgLFxuICAgICAgICBjb250ZW50OiBgU2hlZXQgbmFtZSBzaG91bGQgYmUgZXhhY3RseSBcXGAke3NoZWV0TmFtZX1cXGAgdG8gYmUgcGFyc2VkLiBcblxcbiAgIFxuUGxlYXNlIGRvdWJsZS1jaGVjazpcbi0gTm8gZXh0cmEgc3BhY2VzIGFyZSBpbiB0aGUgc2hlZXQgbmFtZVxuLSBDYXBpdGFsaXphdGlvbiBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgdGVtcGxhdGVcblxcblxuJHtpbXBvcnRlZFdiLndvcmtzaGVldHMubGVuZ3RoID4gMCA/IGBGb3VuZCBzaGVldHM6IFxcYCR7aW1wb3J0ZWRXYi53b3Jrc2hlZXRzLm1hcCgod3MpID0+IHdzLm5hbWUpLmpvaW4oJ2AsYCcpfVxcYGA6IGBObyBjb2x1bW5zIGhhdmUgZm91bmQuYH0gXG4gICAgICAgIGBcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7aXNWYWxpZDogdHJ1ZSBhcyB0cnVlLCBjaGFpbmVkRnVuY3MsIHJlc3VsdDogZGF0YXNldFdzfTtcbiAgfTtcblxuICBleHBvcnQgY29uc3QgaXNDb2x1bW5FeGlzdCA9IChjb2x1bW5OYW1lOiBzdHJpbmcsIGNoYWluZWRGdW5jcz86IFZhbGlkYXRpbmdGdW5jW10pID0+IGFzeW5jIChzaGVldDogRXhjZWxKUy5Xb3Jrc2hlZXQpID0+IHtcbiAgICBjb25zdCB2YWxzID0gc2hlZXQuZ2V0Um93KDEpLnZhbHVlcyBhcyBFeGNlbEpTLkNlbGxWYWx1ZVtdO1xuICAgIGlmICghdmFscy5pbmNsdWRlcyhjb2x1bW5OYW1lKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGNhcHRpb246IGBObyBjb2x1bW4gXCIke2NvbHVtbk5hbWV9XCIgaW4gXCIke3NoZWV0Lm5hbWV9XCIgc2hlZXRgLFxuICAgICAgICBjb250ZW50OiBgQ29sdW1uIG5hbWUgc2hvdWxkIGJlIGV4YWN0bHkgXFxgJHtjb2x1bW5OYW1lfVxcYCB0byBiZSBwYXJzZWQuIFxuXFxuXG5QbGVhc2UgZG91YmxlLWNoZWNrOlxuLSBDb2x1bW4gbmFtZXMgYXJlIGluIHRoZSBmaXJzdCByb3cgb2YgdGhlIHNoZWV0XG4tIE5vIGV4dHJhIHNwYWNlcyBhcmUgaW4gdGhlIGNlbGxcbi0gQ2FwaXRhbGl6YXRpb24gaXMgdGhlIHNhbWUgYXMgaW4gdGhlIHRlbXBsYXRlXG5cXG5cbiR7dmFscy5sZW5ndGggPiAwID8gYEZvdW5kIGNvbHVtbnM6IFxcYCR7dmFscy5maWx0ZXIoKHZhbCkgPT4gdmFsICE9PSAnJykuam9pbignYCxgJyl9XFxgYDogYE5vIGNvbHVtbnMgaGF2ZSBmb3VuZC5gfSBcbiAgICAgICAgYFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtpc1ZhbGlkOiB0cnVlIGFzIHRydWUsIGNoYWluZWRGdW5jc307XG4gIH07XG5cbiAgZXhwb3J0IGNvbnN0IGlzRXhjZWxQYXJzZWQgPSAoY2hhaW5lZEZ1bmNzPzogVmFsaWRhdGluZ0Z1bmNbXSkgPT4gYXN5bmMgKGZpbGU6IEZpbGUpID0+IHtcbiAgICBjb25zdCBpbXBvcnRlZFdiID0gbmV3IEV4Y2VsSlMuV29ya2Jvb2soKTtcbiAgICByZXR1cm4gaW1wb3J0ZWRXYi54bHN4LmxvYWQoYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpKVxuICAgICAgLnRoZW4oYXN5bmMgKHdvcmtib29rKSA9PiB7XG4gICAgICAgIHJldHVybiB7aXNWYWxpZDogdHJ1ZSBhcyB0cnVlLCBjaGFpbmVkRnVuY3MsIHJlc3VsdDogd29ya2Jvb2t9O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgY2FwdGlvbjogJ0ZpbGUgaXMgZmFpbGVkIHRvIHBhcnNlJyxcbiAgICAgICAgICBjb250ZW50OiBgUGxlYXNlIG1ha2Ugc3VyZTpcbi0gWExTWCBmb3JtYXQgaXMgdXNlZCAobm90IFhMUyBvciBYTFNNKVxuLSBGaWxlIHNob3VsZCBub3QgYmUgY29ycnVwdGVkXG5cXG5cblhMUyBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gWExTWCB1c2luZyBFeGNlbCdzIGV4cG9ydCBmdW5jdGlvbmFsaXR5LiBcXG5cbklmIHRoZSBmaWxlIGlzIGNvcnJ1cHRlZCwgaXQgd2lsbCBub3Qgb3BlbiBpbiBFeGNlbC4gXG4gICAgICAgICAgYCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBWYWxpZGF0aW9uO1xuIl19