@datagrok-libraries/utils 0.1.0 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +39 -0
- package/README.md +10 -1
- package/package.json +13 -5
- package/src/array-utils.d.ts +28 -0
- package/src/array-utils.d.ts.map +1 -1
- package/src/array-utils.js +43 -1
- package/src/bit-array.d.ts.map +1 -1
- package/src/bit-array.js +57 -112
- package/src/computation-view.d.ts +71 -0
- package/src/computation-view.d.ts.map +1 -0
- package/src/computation-view.js +133 -0
- package/src/function-view.d.ts +27 -0
- package/src/function-view.d.ts.map +1 -0
- package/src/function-view.js +245 -0
- package/src/random.d.ts +17 -0
- package/src/random.d.ts.map +1 -0
- package/src/random.js +21 -0
- package/src/similarity-metrics.d.ts +4 -70
- package/src/similarity-metrics.d.ts.map +1 -1
- package/src/similarity-metrics.js +47 -75
- package/src/test.d.ts +1 -0
- package/src/test.d.ts.map +1 -1
- package/src/test.js +2 -1
- package/src/type-declarations.d.ts +1 -1
- package/src/type-declarations.d.ts.map +1 -1
- package/src/type-declarations.js +1 -1
- package/src/{operations.d.ts → vector-operations.d.ts} +7 -11
- package/src/vector-operations.d.ts.map +1 -0
- package/src/vector-operations.js +217 -0
- package/src/operations.d.ts.map +0 -1
- package/src/operations.js +0 -227
- package/src/test-node.d.ts +0 -11
- package/src/test-node.d.ts.map +0 -1
- package/src/test-node.js +0 -96
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as rxjs from 'rxjs';
|
|
2
|
+
import * as DG from 'datagrok-api/dg';
|
|
3
|
+
import { FuncCall } from 'datagrok-api/dg';
|
|
4
|
+
/**
|
|
5
|
+
* Base class for handling Compute models (see https://github.com/datagrok-ai/public/blob/master/help/compute/compute.md).
|
|
6
|
+
* In most cases, the computation is a simple {@link Func}
|
|
7
|
+
* Extend it in cases where a behavior or UI not supported by the {@link FunctionView} is needed.
|
|
8
|
+
*
|
|
9
|
+
* It provides the following functionality out-of-the-box, where each section could be customized:
|
|
10
|
+
* - a structured way to represent input and output parameters: {@link parameters}
|
|
11
|
+
* - generic way to generate UI for inputs, outputs, and interactivity (running the model, etc)
|
|
12
|
+
* - persisting historical results to the db (via {@link parameters})
|
|
13
|
+
* - export (to Excel and PDF): {@link export}
|
|
14
|
+
* - easy loading of historical runs
|
|
15
|
+
* - routing
|
|
16
|
+
* - entering the real, measured (as opposed to predicted) values manually
|
|
17
|
+
* - notifications for changing inputs, completion of computations, etc: {@link onInputChanged}
|
|
18
|
+
* */
|
|
19
|
+
export declare class ComputationView extends DG.ViewBase {
|
|
20
|
+
func: DG.Func;
|
|
21
|
+
call: DG.FuncCall;
|
|
22
|
+
lastCall?: DG.FuncCall;
|
|
23
|
+
_inputFields: Map<string, DG.InputBase>;
|
|
24
|
+
onViewInitialized: rxjs.Subject<void>;
|
|
25
|
+
onInputChanged: rxjs.Subject<void>;
|
|
26
|
+
onComputationStarted: rxjs.Subject<FuncCall>;
|
|
27
|
+
onComputationCompleted: rxjs.Subject<FuncCall>;
|
|
28
|
+
onComputationSucceeded: rxjs.Subject<FuncCall>;
|
|
29
|
+
onComputationError: rxjs.Subject<FuncCall>;
|
|
30
|
+
constructor(func: DG.Func);
|
|
31
|
+
/** All inputs that are bound to fields */
|
|
32
|
+
get inputFields(): Map<string, DG.InputBase>;
|
|
33
|
+
/** Saves the computation results to the historical results, returns its id. See also {@link loadRun}. */
|
|
34
|
+
saveRun(call: FuncCall): Promise<string>;
|
|
35
|
+
/** Loads the specified historical results. See also {@link saveRun}. */
|
|
36
|
+
loadRun(runId: string): Promise<void>;
|
|
37
|
+
/** The actual computation function. */
|
|
38
|
+
compute(call: FuncCall): Promise<void>;
|
|
39
|
+
/** Maps inputs to parameters, computes, and maps output parameters to the UI. */
|
|
40
|
+
run(): Promise<void>;
|
|
41
|
+
/** Override to provide custom initialization. {@link onViewInitialized} gets fired after that. */
|
|
42
|
+
init(): Promise<void>;
|
|
43
|
+
/** Override to customize top menu*/
|
|
44
|
+
initTopMenu(menu: DG.Menu): void;
|
|
45
|
+
/** Override to customize ribbon panels */
|
|
46
|
+
initRibbonPanels(): void;
|
|
47
|
+
/** Builds the complete view. Override it if completely custom implementation is needed,
|
|
48
|
+
* otherwise consider overriding {@link buildInputBlock} and/or {@link buildOutputBlock} */
|
|
49
|
+
build(): HTMLElement;
|
|
50
|
+
/** Override to build completely custom input block (the one with inputs, usually on the left).
|
|
51
|
+
* If only specific field, consider overriding {@link buildCustomInputs}. */
|
|
52
|
+
buildInputBlock(): HTMLElement;
|
|
53
|
+
/** Custom inputs for the specified fields. Inputs for these fields will not be created by {@link buildInputBlock}. */
|
|
54
|
+
buildCustomInputs(): Map<String, DG.InputBase>;
|
|
55
|
+
/** Override to create output block. */
|
|
56
|
+
buildOutputBlock(): HTMLElement;
|
|
57
|
+
/** Override to create a custom input control. */
|
|
58
|
+
buildRibbonPanel(): HTMLElement;
|
|
59
|
+
/** Creates function parameters based on the data entered by the user. */
|
|
60
|
+
inputFieldsToParameters(call: FuncCall): void;
|
|
61
|
+
/** Visualizes computation results */
|
|
62
|
+
outputParametersToView(call: FuncCall | null): void;
|
|
63
|
+
/** Override to provide custom computation error handling. */
|
|
64
|
+
processComputationError(call: FuncCall): void;
|
|
65
|
+
/** Override to provide supported export formats.
|
|
66
|
+
* These formats are available under the "Export" popup on the ribbon panel. */
|
|
67
|
+
get supportedExportFormats(): string[];
|
|
68
|
+
/** Override to provide custom export. */
|
|
69
|
+
export(format: string): Promise<Blob>;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=computation-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computation-view.d.ts","sourceRoot":"","sources":["computation-view.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAY,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AAGpD;;;;;;;;;;;;;;KAcK;AACL,qBAAa,eAAgB,SAAQ,EAAE,CAAC,QAAQ;IAC9C,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;IACd,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC;IAClB,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC;IACvB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,CAAmC;IAE1E,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAsB;IAC3D,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAsB;IACxD,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAsB;IAClE,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAsB;IACpE,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAsB;IACpE,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAsB;gBAEpD,IAAI,EAAE,EAAE,CAAC,IAAI;IAezB,0CAA0C;IAC1C,IAAI,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,CAA8B;IAE1E,yGAAyG;IACnG,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAE9C,wEAAwE;IAClE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAE3C,uCAAuC;IACjC,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAE5C,iFAAiF;IAC3E,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAc1B,kGAAkG;IAC5F,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAE3B,oCAAoC;IACpC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;IAMzB,0CAA0C;IAC1C,gBAAgB;IAWhB;+FAC2F;IAC3F,KAAK,IAAI,WAAW;IAEpB;gFAC4E;IAC5E,eAAe,IAAI,WAAW;IAO9B,sHAAsH;IACtH,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC;IAE9C,uCAAuC;IACvC,gBAAgB,IAAI,WAAW;IAE/B,iDAAiD;IACjD,gBAAgB,IAAI,WAAW;IAK/B,yEAAyE;IACzE,uBAAuB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAE7C,qCAAqC;IACrC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI;IAEnD,6DAA6D;IAC7D,uBAAuB,CAAC,IAAI,EAAE,QAAQ;IAEtC;mFAC+E;IAC/E,IAAI,sBAAsB,IAAI,MAAM,EAAE,CAAoC;IAE1E,yCAAyC;IACnC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK5C"}
|
|
@@ -0,0 +1,133 @@
|
|
|
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 grok from 'datagrok-api/grok';
|
|
11
|
+
import * as rxjs from 'rxjs';
|
|
12
|
+
import * as ui from 'datagrok-api/ui';
|
|
13
|
+
import * as DG from 'datagrok-api/dg';
|
|
14
|
+
/**
|
|
15
|
+
* Base class for handling Compute models (see https://github.com/datagrok-ai/public/blob/master/help/compute/compute.md).
|
|
16
|
+
* In most cases, the computation is a simple {@link Func}
|
|
17
|
+
* Extend it in cases where a behavior or UI not supported by the {@link FunctionView} is needed.
|
|
18
|
+
*
|
|
19
|
+
* It provides the following functionality out-of-the-box, where each section could be customized:
|
|
20
|
+
* - a structured way to represent input and output parameters: {@link parameters}
|
|
21
|
+
* - generic way to generate UI for inputs, outputs, and interactivity (running the model, etc)
|
|
22
|
+
* - persisting historical results to the db (via {@link parameters})
|
|
23
|
+
* - export (to Excel and PDF): {@link export}
|
|
24
|
+
* - easy loading of historical runs
|
|
25
|
+
* - routing
|
|
26
|
+
* - entering the real, measured (as opposed to predicted) values manually
|
|
27
|
+
* - notifications for changing inputs, completion of computations, etc: {@link onInputChanged}
|
|
28
|
+
* */
|
|
29
|
+
export class ComputationView extends DG.ViewBase {
|
|
30
|
+
constructor(func) {
|
|
31
|
+
super(func);
|
|
32
|
+
this._inputFields = new Map();
|
|
33
|
+
this.onViewInitialized = new rxjs.Subject();
|
|
34
|
+
this.onInputChanged = new rxjs.Subject();
|
|
35
|
+
this.onComputationStarted = new rxjs.Subject();
|
|
36
|
+
this.onComputationCompleted = new rxjs.Subject();
|
|
37
|
+
this.onComputationSucceeded = new rxjs.Subject();
|
|
38
|
+
this.onComputationError = new rxjs.Subject();
|
|
39
|
+
this.func = func;
|
|
40
|
+
this.call = func.prepare();
|
|
41
|
+
this.initTopMenu(this.ribbonMenu);
|
|
42
|
+
this.initRibbonPanels();
|
|
43
|
+
this.init().then((_) => {
|
|
44
|
+
this.root.appendChild(this.build());
|
|
45
|
+
return this.onViewInitialized.next();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** All inputs that are bound to fields */
|
|
49
|
+
get inputFields() { return this._inputFields; }
|
|
50
|
+
/** Saves the computation results to the historical results, returns its id. See also {@link loadRun}. */
|
|
51
|
+
saveRun(call) {
|
|
52
|
+
return __awaiter(this, void 0, void 0, function* () { return 'xxx'; });
|
|
53
|
+
}
|
|
54
|
+
/** Loads the specified historical results. See also {@link saveRun}. */
|
|
55
|
+
loadRun(runId) {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function* () { });
|
|
57
|
+
}
|
|
58
|
+
/** The actual computation function. */
|
|
59
|
+
compute(call) {
|
|
60
|
+
return __awaiter(this, void 0, void 0, function* () { yield call.call(); });
|
|
61
|
+
}
|
|
62
|
+
/** Maps inputs to parameters, computes, and maps output parameters to the UI. */
|
|
63
|
+
run() {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
this.lastCall = this.call.clone();
|
|
66
|
+
this.inputFieldsToParameters(this.lastCall);
|
|
67
|
+
try {
|
|
68
|
+
yield this.compute(this.lastCall);
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
this.onComputationError.next(this.lastCall);
|
|
72
|
+
}
|
|
73
|
+
this.outputParametersToView(this.lastCall);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/** Override to provide custom initialization. {@link onViewInitialized} gets fired after that. */
|
|
77
|
+
init() {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () { });
|
|
79
|
+
}
|
|
80
|
+
/** Override to customize top menu*/
|
|
81
|
+
initTopMenu(menu) {
|
|
82
|
+
menu
|
|
83
|
+
.group(this.func.friendlyName)
|
|
84
|
+
.item('Run', () => this.run());
|
|
85
|
+
}
|
|
86
|
+
/** Override to customize ribbon panels */
|
|
87
|
+
initRibbonPanels() {
|
|
88
|
+
this.setRibbonPanels([[
|
|
89
|
+
ui.bigButton('RUN', () => this.run()),
|
|
90
|
+
ui.comboPopup(ui.icons.save(null, 'Export'), this.supportedExportFormats, (format) => __awaiter(this, void 0, void 0, function* () { return DG.Utils.download('output.csv', yield this.export(format)); })),
|
|
91
|
+
]]);
|
|
92
|
+
}
|
|
93
|
+
/** Builds the complete view. Override it if completely custom implementation is needed,
|
|
94
|
+
* otherwise consider overriding {@link buildInputBlock} and/or {@link buildOutputBlock} */
|
|
95
|
+
build() { return ui.splitH([this.buildInputBlock(), this.buildOutputBlock()]); }
|
|
96
|
+
/** Override to build completely custom input block (the one with inputs, usually on the left).
|
|
97
|
+
* If only specific field, consider overriding {@link buildCustomInputs}. */
|
|
98
|
+
buildInputBlock() {
|
|
99
|
+
for (const p of this.func.inputs)
|
|
100
|
+
this._inputFields.set(p.name, DG.InputBase.forProperty(p, this.call.dart));
|
|
101
|
+
return ui.inputs(this._inputFields.values());
|
|
102
|
+
}
|
|
103
|
+
/** Custom inputs for the specified fields. Inputs for these fields will not be created by {@link buildInputBlock}. */
|
|
104
|
+
buildCustomInputs() { return new Map(); }
|
|
105
|
+
/** Override to create output block. */
|
|
106
|
+
buildOutputBlock() { return ui.div(); }
|
|
107
|
+
/** Override to create a custom input control. */
|
|
108
|
+
buildRibbonPanel() {
|
|
109
|
+
return ui.divH([
|
|
110
|
+
ui.button('RUN', () => { }),
|
|
111
|
+
ui.comboPopup('Export', this.supportedExportFormats, (format) => this.export(format))
|
|
112
|
+
]);
|
|
113
|
+
}
|
|
114
|
+
/** Creates function parameters based on the data entered by the user. */
|
|
115
|
+
inputFieldsToParameters(call) { }
|
|
116
|
+
/** Visualizes computation results */
|
|
117
|
+
outputParametersToView(call) { }
|
|
118
|
+
/** Override to provide custom computation error handling. */
|
|
119
|
+
processComputationError(call) { grok.shell.error(call.errorMessage); }
|
|
120
|
+
/** Override to provide supported export formats.
|
|
121
|
+
* These formats are available under the "Export" popup on the ribbon panel. */
|
|
122
|
+
get supportedExportFormats() { return ['Excel', 'PDF', 'CSV']; }
|
|
123
|
+
/** Override to provide custom export. */
|
|
124
|
+
export(format) {
|
|
125
|
+
var _a;
|
|
126
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
127
|
+
if (format == 'CSV')
|
|
128
|
+
return new Blob([((_a = this.lastCall) === null || _a === void 0 ? void 0 : _a.getOutputParamValue()).toCsv()]);
|
|
129
|
+
throw `Format "${format}" is not supported.`;
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0YXRpb24tdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbXB1dGF0aW9uLXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJdEM7Ozs7Ozs7Ozs7Ozs7O0tBY0s7QUFDTCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxFQUFFLENBQUMsUUFBUTtJQWE5QyxZQUFZLElBQWE7UUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBVmQsaUJBQVksR0FBOEIsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFFMUUsc0JBQWlCLEdBQXVCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNELG1CQUFjLEdBQXVCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hELHlCQUFvQixHQUEyQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsRSwyQkFBc0IsR0FBMkIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEUsMkJBQXNCLEdBQTJCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BFLHVCQUFrQixHQUEyQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUs5RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUzQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLElBQUksV0FBVyxLQUFnQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBRTFFLHlHQUF5RztJQUNuRyxPQUFPLENBQUMsSUFBYzs4REFBcUIsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDO0tBQUE7SUFFaEUsd0VBQXdFO0lBQ2xFLE9BQU8sQ0FBQyxLQUFhOzhEQUFtQixDQUFDO0tBQUE7SUFFL0MsdUNBQXVDO0lBQ2pDLE9BQU8sQ0FBQyxJQUFjOzhEQUFtQixNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FBQTtJQUVuRSxpRkFBaUY7SUFDM0UsR0FBRzs7WUFDUCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU1QyxJQUFJO2dCQUNGLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDbkM7WUFDRCxPQUFPLENBQUMsRUFBRTtnQkFDUixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM3QztZQUVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0MsQ0FBQztLQUFBO0lBRUQsa0dBQWtHO0lBQzVGLElBQUk7OERBQW1CLENBQUM7S0FBQTtJQUU5QixvQ0FBb0M7SUFDcEMsV0FBVyxDQUFDLElBQWE7UUFDdkIsSUFBSTthQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQzthQUM3QixJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNwQixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3JDLEVBQUUsQ0FBQyxVQUFVLENBQ1gsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUM3QixJQUFJLENBQUMsc0JBQXNCLEVBQzNCLENBQU8sTUFBTSxFQUFFLEVBQUUsZ0RBQUMsT0FBQSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUEsR0FBQSxDQUM3RTthQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVEOytGQUMyRjtJQUMzRixLQUFLLEtBQWlCLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDO0lBRTNGO2dGQUM0RTtJQUM1RSxlQUFlO1FBQ2IsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTdFLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUVELHNIQUFzSDtJQUN0SCxpQkFBaUIsS0FBZ0MsT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVwRSx1Q0FBdUM7SUFDdkMsZ0JBQWdCLEtBQWtCLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVwRCxpREFBaUQ7SUFDakQsZ0JBQWdCO1FBQWtCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQztZQUMvQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7WUFDMUIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsdUJBQXVCLENBQUMsSUFBYyxJQUFVLENBQUM7SUFFakQscUNBQXFDO0lBQ3JDLHNCQUFzQixDQUFDLElBQXFCLElBQVUsQ0FBQztJQUV2RCw2REFBNkQ7SUFDN0QsdUJBQXVCLENBQUMsSUFBYyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFhLENBQUMsQ0FBQyxDQUFFLENBQUM7SUFFbEY7bUZBQytFO0lBQy9FLElBQUksc0JBQXNCLEtBQWUsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTFFLHlDQUF5QztJQUNuQyxNQUFNLENBQUMsTUFBYzs7O1lBQ3pCLElBQUksTUFBTSxJQUFJLEtBQUs7Z0JBQ2pCLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQUEsSUFBSSxDQUFDLFFBQVEsMENBQUUsbUJBQW1CLEVBQWdCLENBQUEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakYsTUFBTSxXQUFXLE1BQU0scUJBQXFCLENBQUM7O0tBQzlDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHJ4anMgZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7RGF0YUZyYW1lLCBGdW5jQ2FsbH0gZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7RnVuY3Rpb25WaWV3fSBmcm9tICcuL2Z1bmN0aW9uLXZpZXcnO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGhhbmRsaW5nIENvbXB1dGUgbW9kZWxzIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2RhdGFncm9rLWFpL3B1YmxpYy9ibG9iL21hc3Rlci9oZWxwL2NvbXB1dGUvY29tcHV0ZS5tZCkuXG4gKiBJbiBtb3N0IGNhc2VzLCB0aGUgY29tcHV0YXRpb24gaXMgYSBzaW1wbGUge0BsaW5rIEZ1bmN9XG4gKiBFeHRlbmQgaXQgaW4gY2FzZXMgd2hlcmUgYSBiZWhhdmlvciBvciBVSSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB7QGxpbmsgRnVuY3Rpb25WaWV3fSBpcyBuZWVkZWQuXG4gKlxuICogSXQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbmFsaXR5IG91dC1vZi10aGUtYm94LCB3aGVyZSBlYWNoIHNlY3Rpb24gY291bGQgYmUgY3VzdG9taXplZDpcbiAqIC0gYSBzdHJ1Y3R1cmVkIHdheSB0byByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXJzOiB7QGxpbmsgcGFyYW1ldGVyc31cbiAqIC0gZ2VuZXJpYyB3YXkgdG8gZ2VuZXJhdGUgVUkgZm9yIGlucHV0cywgb3V0cHV0cywgYW5kIGludGVyYWN0aXZpdHkgKHJ1bm5pbmcgdGhlIG1vZGVsLCBldGMpXG4gKiAgIC0gcGVyc2lzdGluZyBoaXN0b3JpY2FsIHJlc3VsdHMgdG8gdGhlIGRiICh2aWEge0BsaW5rIHBhcmFtZXRlcnN9KVxuICogLSBleHBvcnQgKHRvIEV4Y2VsIGFuZCBQREYpOiB7QGxpbmsgZXhwb3J0fVxuICogLSBlYXN5IGxvYWRpbmcgb2YgaGlzdG9yaWNhbCBydW5zXG4gKiAtIHJvdXRpbmdcbiAqIC0gZW50ZXJpbmcgdGhlIHJlYWwsIG1lYXN1cmVkIChhcyBvcHBvc2VkIHRvIHByZWRpY3RlZCkgdmFsdWVzIG1hbnVhbGx5XG4gKiAtIG5vdGlmaWNhdGlvbnMgZm9yIGNoYW5naW5nIGlucHV0cywgY29tcGxldGlvbiBvZiBjb21wdXRhdGlvbnMsIGV0Yzoge0BsaW5rIG9uSW5wdXRDaGFuZ2VkfVxuICogKi9cbmV4cG9ydCBjbGFzcyBDb21wdXRhdGlvblZpZXcgZXh0ZW5kcyBERy5WaWV3QmFzZSB7XG4gIGZ1bmM6IERHLkZ1bmM7XG4gIGNhbGw6IERHLkZ1bmNDYWxsOyAvLyB3aGF0IGlzIGJlaW5nIGN1cnJlbnRseSBlZGl0ZWRcbiAgbGFzdENhbGw/OiBERy5GdW5jQ2FsbDtcbiAgX2lucHV0RmllbGRzOiBNYXA8c3RyaW5nLCBERy5JbnB1dEJhc2U+ID0gbmV3IE1hcDxzdHJpbmcsIERHLklucHV0QmFzZT4oKTtcblxuICBvblZpZXdJbml0aWFsaXplZDogcnhqcy5TdWJqZWN0PHZvaWQ+ID0gbmV3IHJ4anMuU3ViamVjdCgpO1xuICBvbklucHV0Q2hhbmdlZDogcnhqcy5TdWJqZWN0PHZvaWQ+ID0gbmV3IHJ4anMuU3ViamVjdCgpO1xuICBvbkNvbXB1dGF0aW9uU3RhcnRlZDogcnhqcy5TdWJqZWN0PEZ1bmNDYWxsPiA9IG5ldyByeGpzLlN1YmplY3QoKTtcbiAgb25Db21wdXRhdGlvbkNvbXBsZXRlZDogcnhqcy5TdWJqZWN0PEZ1bmNDYWxsPiA9IG5ldyByeGpzLlN1YmplY3QoKTtcbiAgb25Db21wdXRhdGlvblN1Y2NlZWRlZDogcnhqcy5TdWJqZWN0PEZ1bmNDYWxsPiA9IG5ldyByeGpzLlN1YmplY3QoKTtcbiAgb25Db21wdXRhdGlvbkVycm9yOiByeGpzLlN1YmplY3Q8RnVuY0NhbGw+ID0gbmV3IHJ4anMuU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKGZ1bmM6IERHLkZ1bmMpIHtcbiAgICBzdXBlcihmdW5jKTtcblxuICAgIHRoaXMuZnVuYyA9IGZ1bmM7XG4gICAgdGhpcy5jYWxsID0gZnVuYy5wcmVwYXJlKCk7XG5cbiAgICB0aGlzLmluaXRUb3BNZW51KHRoaXMucmliYm9uTWVudSk7XG4gICAgdGhpcy5pbml0UmliYm9uUGFuZWxzKCk7XG5cbiAgICB0aGlzLmluaXQoKS50aGVuKChfKSA9PiB7XG4gICAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5idWlsZCgpKTtcbiAgICAgIHJldHVybiB0aGlzLm9uVmlld0luaXRpYWxpemVkLm5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBBbGwgaW5wdXRzIHRoYXQgYXJlIGJvdW5kIHRvIGZpZWxkcyAqL1xuICBnZXQgaW5wdXRGaWVsZHMoKTogTWFwPHN0cmluZywgREcuSW5wdXRCYXNlPiB7IHJldHVybiB0aGlzLl9pbnB1dEZpZWxkczsgfVxuXG4gIC8qKiBTYXZlcyB0aGUgY29tcHV0YXRpb24gcmVzdWx0cyB0byB0aGUgaGlzdG9yaWNhbCByZXN1bHRzLCByZXR1cm5zIGl0cyBpZC4gU2VlIGFsc28ge0BsaW5rIGxvYWRSdW59LiAqL1xuICBhc3luYyBzYXZlUnVuKGNhbGw6IEZ1bmNDYWxsKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuICd4eHgnOyB9XG5cbiAgLyoqIExvYWRzIHRoZSBzcGVjaWZpZWQgaGlzdG9yaWNhbCByZXN1bHRzLiBTZWUgYWxzbyB7QGxpbmsgc2F2ZVJ1bn0uICovXG4gIGFzeW5jIGxvYWRSdW4ocnVuSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4geyB9XG5cbiAgLyoqIFRoZSBhY3R1YWwgY29tcHV0YXRpb24gZnVuY3Rpb24uICovXG4gIGFzeW5jIGNvbXB1dGUoY2FsbDogRnVuY0NhbGwpOiBQcm9taXNlPHZvaWQ+IHsgYXdhaXQgY2FsbC5jYWxsKCk7IH1cblxuICAvKiogTWFwcyBpbnB1dHMgdG8gcGFyYW1ldGVycywgY29tcHV0ZXMsIGFuZCBtYXBzIG91dHB1dCBwYXJhbWV0ZXJzIHRvIHRoZSBVSS4gKi9cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubGFzdENhbGwgPSB0aGlzLmNhbGwuY2xvbmUoKTtcbiAgICB0aGlzLmlucHV0RmllbGRzVG9QYXJhbWV0ZXJzKHRoaXMubGFzdENhbGwpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY29tcHV0ZSh0aGlzLmxhc3RDYWxsKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMub25Db21wdXRhdGlvbkVycm9yLm5leHQodGhpcy5sYXN0Q2FsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5vdXRwdXRQYXJhbWV0ZXJzVG9WaWV3KHRoaXMubGFzdENhbGwpO1xuICB9XG5cbiAgLyoqIE92ZXJyaWRlIHRvIHByb3ZpZGUgY3VzdG9tIGluaXRpYWxpemF0aW9uLiB7QGxpbmsgb25WaWV3SW5pdGlhbGl6ZWR9IGdldHMgZmlyZWQgYWZ0ZXIgdGhhdC4gKi9cbiAgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIE92ZXJyaWRlIHRvIGN1c3RvbWl6ZSB0b3AgbWVudSovXG4gIGluaXRUb3BNZW51KG1lbnU6IERHLk1lbnUpIHtcbiAgICBtZW51XG4gICAgICAuZ3JvdXAodGhpcy5mdW5jLmZyaWVuZGx5TmFtZSlcbiAgICAgIC5pdGVtKCdSdW4nLCAoKSA9PiB0aGlzLnJ1bigpKTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0byBjdXN0b21pemUgcmliYm9uIHBhbmVscyAqL1xuICBpbml0UmliYm9uUGFuZWxzKCkge1xuICAgIHRoaXMuc2V0UmliYm9uUGFuZWxzKFtbXG4gICAgICB1aS5iaWdCdXR0b24oJ1JVTicsICgpID0+IHRoaXMucnVuKCkpLFxuICAgICAgdWkuY29tYm9Qb3B1cChcbiAgICAgICAgdWkuaWNvbnMuc2F2ZShudWxsLCAnRXhwb3J0JyksXG4gICAgICAgIHRoaXMuc3VwcG9ydGVkRXhwb3J0Rm9ybWF0cyxcbiAgICAgICAgYXN5bmMgKGZvcm1hdCkgPT4gREcuVXRpbHMuZG93bmxvYWQoJ291dHB1dC5jc3YnLCBhd2FpdCB0aGlzLmV4cG9ydChmb3JtYXQpKSxcbiAgICAgICksXG4gICAgXV0pO1xuICB9XG5cbiAgLyoqIEJ1aWxkcyB0aGUgY29tcGxldGUgdmlldy4gT3ZlcnJpZGUgaXQgaWYgY29tcGxldGVseSBjdXN0b20gaW1wbGVtZW50YXRpb24gaXMgbmVlZGVkLFxuICAgKiBvdGhlcndpc2UgY29uc2lkZXIgb3ZlcnJpZGluZyB7QGxpbmsgYnVpbGRJbnB1dEJsb2NrfSBhbmQvb3Ige0BsaW5rIGJ1aWxkT3V0cHV0QmxvY2t9ICovXG4gIGJ1aWxkKCk6IEhUTUxFbGVtZW50IHtyZXR1cm4gdWkuc3BsaXRIKFt0aGlzLmJ1aWxkSW5wdXRCbG9jaygpLCB0aGlzLmJ1aWxkT3V0cHV0QmxvY2soKV0pO31cblxuICAvKiogT3ZlcnJpZGUgdG8gYnVpbGQgY29tcGxldGVseSBjdXN0b20gaW5wdXQgYmxvY2sgKHRoZSBvbmUgd2l0aCBpbnB1dHMsIHVzdWFsbHkgb24gdGhlIGxlZnQpLlxuICAgKiBJZiBvbmx5IHNwZWNpZmljIGZpZWxkLCBjb25zaWRlciBvdmVycmlkaW5nIHtAbGluayBidWlsZEN1c3RvbUlucHV0c30uICovXG4gIGJ1aWxkSW5wdXRCbG9jaygpOiBIVE1MRWxlbWVudCB7XG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuZnVuYy5pbnB1dHMpXG4gICAgICB0aGlzLl9pbnB1dEZpZWxkcy5zZXQocC5uYW1lLCBERy5JbnB1dEJhc2UuZm9yUHJvcGVydHkocCwgdGhpcy5jYWxsLmRhcnQpKTtcblxuICAgIHJldHVybiB1aS5pbnB1dHModGhpcy5faW5wdXRGaWVsZHMudmFsdWVzKCkpXG4gIH1cblxuICAvKiogQ3VzdG9tIGlucHV0cyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuIElucHV0cyBmb3IgdGhlc2UgZmllbGRzIHdpbGwgbm90IGJlIGNyZWF0ZWQgYnkge0BsaW5rIGJ1aWxkSW5wdXRCbG9ja30uICovXG4gIGJ1aWxkQ3VzdG9tSW5wdXRzKCk6IE1hcDxTdHJpbmcsIERHLklucHV0QmFzZT4geyByZXR1cm4gbmV3IE1hcCgpOyB9XG5cbiAgLyoqIE92ZXJyaWRlIHRvIGNyZWF0ZSBvdXRwdXQgYmxvY2suICovXG4gIGJ1aWxkT3V0cHV0QmxvY2soKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdWkuZGl2KCk7IH1cblxuICAvKiogT3ZlcnJpZGUgdG8gY3JlYXRlIGEgY3VzdG9tIGlucHV0IGNvbnRyb2wuICovXG4gIGJ1aWxkUmliYm9uUGFuZWwoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdWkuZGl2SChbXG4gICAgdWkuYnV0dG9uKCdSVU4nLCAoKSA9PiB7fSksXG4gICAgdWkuY29tYm9Qb3B1cCgnRXhwb3J0JywgdGhpcy5zdXBwb3J0ZWRFeHBvcnRGb3JtYXRzLCAoZm9ybWF0KSA9PiB0aGlzLmV4cG9ydChmb3JtYXQpKV0pO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgZnVuY3Rpb24gcGFyYW1ldGVycyBiYXNlZCBvbiB0aGUgZGF0YSBlbnRlcmVkIGJ5IHRoZSB1c2VyLiAqL1xuICBpbnB1dEZpZWxkc1RvUGFyYW1ldGVycyhjYWxsOiBGdW5jQ2FsbCk6IHZvaWQgeyB9XG5cbiAgLyoqIFZpc3VhbGl6ZXMgY29tcHV0YXRpb24gcmVzdWx0cyAqL1xuICBvdXRwdXRQYXJhbWV0ZXJzVG9WaWV3KGNhbGw6IEZ1bmNDYWxsIHwgbnVsbCk6IHZvaWQgeyB9XG5cbiAgLyoqIE92ZXJyaWRlIHRvIHByb3ZpZGUgY3VzdG9tIGNvbXB1dGF0aW9uIGVycm9yIGhhbmRsaW5nLiAqL1xuICBwcm9jZXNzQ29tcHV0YXRpb25FcnJvcihjYWxsOiBGdW5jQ2FsbCkgeyBncm9rLnNoZWxsLmVycm9yKGNhbGwuZXJyb3JNZXNzYWdlISk7ICB9XG5cbiAgLyoqIE92ZXJyaWRlIHRvIHByb3ZpZGUgc3VwcG9ydGVkIGV4cG9ydCBmb3JtYXRzLlxuICAgKiBUaGVzZSBmb3JtYXRzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlIFwiRXhwb3J0XCIgcG9wdXAgb24gdGhlIHJpYmJvbiBwYW5lbC4gKi9cbiAgZ2V0IHN1cHBvcnRlZEV4cG9ydEZvcm1hdHMoKTogc3RyaW5nW10geyByZXR1cm4gWydFeGNlbCcsICdQREYnLCAnQ1NWJ107IH1cblxuICAvKiogT3ZlcnJpZGUgdG8gcHJvdmlkZSBjdXN0b20gZXhwb3J0LiAqL1xuICBhc3luYyBleHBvcnQoZm9ybWF0OiBzdHJpbmcpOiBQcm9taXNlPEJsb2I+IHtcbiAgICBpZiAoZm9ybWF0ID09ICdDU1YnKVxuICAgICAgcmV0dXJuIG5ldyBCbG9iKFsodGhpcy5sYXN0Q2FsbD8uZ2V0T3V0cHV0UGFyYW1WYWx1ZSgpIGFzIERhdGFGcmFtZSkudG9Dc3YoKV0pO1xuICAgIHRocm93IGBGb3JtYXQgXCIke2Zvcm1hdH1cIiBpcyBub3Qgc3VwcG9ydGVkLmA7XG4gIH1cbn0iXX0=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as DG from 'datagrok-api/dg';
|
|
2
|
+
export declare class FunctionView extends DG.ViewBase {
|
|
3
|
+
constructor(func: DG.Func);
|
|
4
|
+
private _type;
|
|
5
|
+
get type(): string;
|
|
6
|
+
func: DG.Func;
|
|
7
|
+
private readonly context;
|
|
8
|
+
_setFunction(call: DG.FuncCall | undefined): Promise<void>;
|
|
9
|
+
clearResults(clearTabs?: boolean, showOutput?: boolean): void;
|
|
10
|
+
renderRunSection(call: DG.FuncCall): HTMLElement;
|
|
11
|
+
showInputs: boolean;
|
|
12
|
+
singleDfParam: boolean;
|
|
13
|
+
paramViewers: Map<string, DG.Viewer[]>;
|
|
14
|
+
resultsTabControl: DG.TabControl | undefined;
|
|
15
|
+
resultTabs: Map<String, HTMLElement>;
|
|
16
|
+
resultsDiv: HTMLElement;
|
|
17
|
+
controlsRoot: HTMLDivElement;
|
|
18
|
+
resultsRoot: HTMLDivElement;
|
|
19
|
+
inputsDiv: HTMLDivElement;
|
|
20
|
+
appendResultDataFrame(param: DG.FuncCallParam, options?: {
|
|
21
|
+
caption?: string;
|
|
22
|
+
category?: string;
|
|
23
|
+
height?: number;
|
|
24
|
+
}): void;
|
|
25
|
+
_appendResultElement(d: HTMLElement, category?: string): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=function-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-view.d.ts","sourceRoot":"","sources":["function-view.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEtC,qBAAa,YAAa,SAAQ,EAAE,CAAC,QAAQ;gBAC/B,IAAI,EAAE,EAAE,CAAC,IAAI;IASzB,OAAO,CAAC,KAAK,CAAsB;IACnC,IAAW,IAAI,IAAI,MAAM,CAExB;IACM,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IAG/B,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,GAAG,SAAS;IA+DhD,YAAY,CAAC,SAAS,GAAE,OAAc,EAAE,UAAU,GAAE,OAAc;IAiClE,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,GAAG,WAAW;IAmBhD,UAAU,EAAE,OAAO,CAAS;IAC5B,aAAa,EAAE,OAAO,CAAS;IAC/B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAa;IACnD,iBAAiB,EAAE,EAAE,CAAC,UAAU,GAAG,SAAS,CAAC;IAC7C,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAa;IACjD,UAAU,EAAE,WAAW,CAAqC;IAC5D,YAAY,EAAE,cAAc,CAAY;IACxC,WAAW,EAAE,cAAc,CAAY;IACvC,SAAS,EAAE,cAAc,CAAqC;IAE9D,qBAAqB,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAC;IAwGhH,oBAAoB,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM;CAMvD"}
|
|
@@ -0,0 +1,245 @@
|
|
|
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 wu from 'wu';
|
|
11
|
+
import $ from 'cash-dom';
|
|
12
|
+
import * as grok from 'datagrok-api/grok';
|
|
13
|
+
import * as ui from 'datagrok-api/ui';
|
|
14
|
+
import * as DG from 'datagrok-api/dg';
|
|
15
|
+
export class FunctionView extends DG.ViewBase {
|
|
16
|
+
constructor(func) {
|
|
17
|
+
super();
|
|
18
|
+
this._type = 'function';
|
|
19
|
+
this.showInputs = false;
|
|
20
|
+
this.singleDfParam = false;
|
|
21
|
+
this.paramViewers = new Map();
|
|
22
|
+
this.resultTabs = new Map();
|
|
23
|
+
this.resultsDiv = ui.panel([], 'grok-func-results');
|
|
24
|
+
this.controlsRoot = ui.box();
|
|
25
|
+
this.resultsRoot = ui.box();
|
|
26
|
+
this.inputsDiv = ui.panel([], 'grok-func-results');
|
|
27
|
+
this.func = func;
|
|
28
|
+
this.context = DG.Context.cloneDefault();
|
|
29
|
+
this.controlsRoot.style.maxWidth = '370px';
|
|
30
|
+
this.box = true;
|
|
31
|
+
this._setFunction(undefined).then((r) => { });
|
|
32
|
+
}
|
|
33
|
+
get type() {
|
|
34
|
+
return this._type;
|
|
35
|
+
}
|
|
36
|
+
_setFunction(call) {
|
|
37
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
38
|
+
/*
|
|
39
|
+
var meta = EntityMeta.forEntity(f);
|
|
40
|
+
func = await meta.refresh(f);
|
|
41
|
+
*/
|
|
42
|
+
if (call != undefined) {
|
|
43
|
+
/* if (call.validateParameterValues().isEmpty)
|
|
44
|
+
runFunc(call).then((_) => call.reset());
|
|
45
|
+
_callPath = '/${call.toUri()}';
|
|
46
|
+
Routing.setPath(this.path, f.name, true);*/
|
|
47
|
+
}
|
|
48
|
+
call !== null && call !== void 0 ? call : (call = this.func.prepare());
|
|
49
|
+
call.aux['view'] = this;
|
|
50
|
+
call.context = this.context;
|
|
51
|
+
this.singleDfParam = wu(this.func.outputs).filter((p) => p.propertyType == DG.TYPE.DATA_FRAME)
|
|
52
|
+
.toArray().length == 1;
|
|
53
|
+
const runSection = this.renderRunSection(call);
|
|
54
|
+
//var fullRunSection = div();
|
|
55
|
+
const funcDiv = ui.div([runSection], 'ui-div');
|
|
56
|
+
//var fullDiv = div('ui-panel', [getFullSection(func, call, fullRunSection)]);
|
|
57
|
+
//htmlSetDisplay(fullDiv, false);
|
|
58
|
+
for (const inParam of wu(call.inputParams.values())
|
|
59
|
+
.filter((p) => p.property.propertyType == DG.TYPE.DATA_FRAME && p.property.options['viewer'] != null)) {
|
|
60
|
+
this.showInputs = true;
|
|
61
|
+
const self = this;
|
|
62
|
+
this.subs.push(inParam.onChanged.subscribe(function (param) {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
self.clearResults(true, false);
|
|
65
|
+
param.processOutput();
|
|
66
|
+
self.appendResultDataFrame(param, { height: (self.singleDfParam && !grok.shell.windows.presentationMode) ? 600 : 400,
|
|
67
|
+
category: 'INPUT' });
|
|
68
|
+
});
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
this.controlsRoot.innerHTML = '';
|
|
72
|
+
this.controlsRoot.appendChild(funcDiv);
|
|
73
|
+
//this.controlsRoot.appendChild(fullDiv);
|
|
74
|
+
/*advancedModeSwitch.onChanged.listen((_) {
|
|
75
|
+
if (advancedModeSwitch.value)
|
|
76
|
+
fullRunSection.append(runSection);
|
|
77
|
+
else
|
|
78
|
+
funcDiv.append(runSection);
|
|
79
|
+
htmlSetDisplay(fullDiv, advancedModeSwitch.value);
|
|
80
|
+
htmlSetDisplay(funcDiv, !advancedModeSwitch.value);
|
|
81
|
+
});*/
|
|
82
|
+
//setRibbon();
|
|
83
|
+
this.root.appendChild(ui.splitH([this.controlsRoot, this.resultsRoot]));
|
|
84
|
+
/*
|
|
85
|
+
Routing.setPath(this.path, f.name, true);
|
|
86
|
+
*/
|
|
87
|
+
this.resultsRoot.innerHTML = '';
|
|
88
|
+
this.resultsRoot.appendChild(this.resultsDiv);
|
|
89
|
+
this.name = this.func.friendlyName;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
clearResults(clearTabs = true, showOutput = true) {
|
|
93
|
+
const categories = [];
|
|
94
|
+
// resultTabs.clear();
|
|
95
|
+
if (this.showInputs) {
|
|
96
|
+
categories.push('INPUT');
|
|
97
|
+
this.resultTabs.set('INPUT', this.inputsDiv);
|
|
98
|
+
}
|
|
99
|
+
for (const p of this.func.outputs) {
|
|
100
|
+
if (categories.includes(p.category))
|
|
101
|
+
continue;
|
|
102
|
+
categories.push(p.category);
|
|
103
|
+
}
|
|
104
|
+
if (clearTabs && (categories.length > 1 || (categories.length == 1 && categories[0] != 'Misc'))) {
|
|
105
|
+
this.resultsTabControl = DG.TabControl.create();
|
|
106
|
+
for (const c of categories) {
|
|
107
|
+
if (!this.resultTabs.has(c))
|
|
108
|
+
this.resultTabs.set(c, ui.div([], 'ui-panel,grok-func-results'));
|
|
109
|
+
let name = c;
|
|
110
|
+
if (this.showInputs && categories.length == 2 && c == 'Misc')
|
|
111
|
+
name = 'OUTPUT';
|
|
112
|
+
this.resultsTabControl.addPane(name, () => { var _a; return (_a = this.resultTabs.get(c)) !== null && _a !== void 0 ? _a : ui.div(); });
|
|
113
|
+
}
|
|
114
|
+
if (categories.length > 1 && this.showInputs && showOutput)
|
|
115
|
+
this.resultsTabControl.currentPane = this.resultsTabControl.panes[1];
|
|
116
|
+
this.resultsDiv = this.resultsTabControl.root;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
this.resultsDiv = ui.panel([], 'grok-func-results');
|
|
120
|
+
this.resultsTabControl = undefined;
|
|
121
|
+
}
|
|
122
|
+
this.resultsRoot.innerHTML = '';
|
|
123
|
+
this.resultsRoot.appendChild(this.resultsDiv);
|
|
124
|
+
}
|
|
125
|
+
renderRunSection(call) {
|
|
126
|
+
return ui.wait(() => __awaiter(this, void 0, void 0, function* () {
|
|
127
|
+
const runButton = ui.bigButton('Run', () => __awaiter(this, void 0, void 0, function* () {
|
|
128
|
+
call.aux['view'] = this.dart;
|
|
129
|
+
yield call.call(true, undefined, { processed: true });
|
|
130
|
+
this.clearResults(false, true);
|
|
131
|
+
for (const [, p] of call.outputParams) {
|
|
132
|
+
console.log('param', p.value);
|
|
133
|
+
p.processOutput();
|
|
134
|
+
if (p.property.propertyType == DG.TYPE.DATA_FRAME && p.value != null)
|
|
135
|
+
this.appendResultDataFrame(p, { caption: p.property.name, category: p.property.category });
|
|
136
|
+
}
|
|
137
|
+
}));
|
|
138
|
+
const editor = yield call.getEditor(true);
|
|
139
|
+
editor.appendChild(ui.buttonsInput([runButton]));
|
|
140
|
+
return editor;
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
appendResultDataFrame(param, options) {
|
|
144
|
+
var _a, _b, _c, _d, _e;
|
|
145
|
+
const df = param.value;
|
|
146
|
+
console.log('dataframe', df);
|
|
147
|
+
let caption = options === null || options === void 0 ? void 0 : options.caption;
|
|
148
|
+
let height = (_a = options === null || options === void 0 ? void 0 : options.height) !== null && _a !== void 0 ? _a : 400;
|
|
149
|
+
const viewers = (_b = param.aux['viewers']) !== null && _b !== void 0 ? _b : [];
|
|
150
|
+
caption !== null && caption !== void 0 ? caption : (caption = (_d = (_c = param.aux['viewerTitle']) !== null && _c !== void 0 ? _c : ((this.singleDfParam && viewers.length == 1) ? '' : param.property.caption)) !== null && _d !== void 0 ? _d : '');
|
|
151
|
+
let existingViewers = this.paramViewers.get(param.name);
|
|
152
|
+
if (existingViewers != null) {
|
|
153
|
+
for (const v of existingViewers)
|
|
154
|
+
v.dataFrame = df;
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
existingViewers !== null && existingViewers !== void 0 ? existingViewers : (existingViewers = []);
|
|
158
|
+
this.paramViewers.set(param.name, existingViewers);
|
|
159
|
+
if (viewers.length == 0)
|
|
160
|
+
viewers.push(df.plot.grid());
|
|
161
|
+
const hideList = [];
|
|
162
|
+
let blocks = 0;
|
|
163
|
+
let blockSize = 0;
|
|
164
|
+
const gridWrapper = ui.block([]);
|
|
165
|
+
const gridSwitch = !wu(viewers).some((v) => v.type == 'Grid');
|
|
166
|
+
$(gridWrapper).hide();
|
|
167
|
+
const getHeader = (sw) => {
|
|
168
|
+
var _a;
|
|
169
|
+
const s = (_a = caption !== null && caption !== void 0 ? caption : df.name) !== null && _a !== void 0 ? _a : '';
|
|
170
|
+
const header = ui.div([], 'grok-func-results-header');
|
|
171
|
+
if (s != '') {
|
|
172
|
+
const h = ui.h1(s);
|
|
173
|
+
ui.Tooltip.bind(h, () => s);
|
|
174
|
+
header.appendChild(h);
|
|
175
|
+
}
|
|
176
|
+
if (gridSwitch) {
|
|
177
|
+
const icon = ui.iconSvg('table', (e) => {
|
|
178
|
+
e.stopPropagation();
|
|
179
|
+
ui.setDisplayAll(hideList, !sw);
|
|
180
|
+
ui.setDisplay(gridWrapper, sw);
|
|
181
|
+
gridWrapper.classList.add(`ui-block-${blockSize}`);
|
|
182
|
+
}, 'Show grid');
|
|
183
|
+
if (!sw)
|
|
184
|
+
icon.classList.add('active');
|
|
185
|
+
header.appendChild(icon);
|
|
186
|
+
}
|
|
187
|
+
if (!grok.shell.tables.includes(df)) {
|
|
188
|
+
header.appendChild(ui.icons.add((e) => {
|
|
189
|
+
e.stopPropagation();
|
|
190
|
+
const v = grok.shell.addTableView(df);
|
|
191
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
192
|
+
for (const viewer of viewers) {
|
|
193
|
+
if (viewer.type != 'Grid') {
|
|
194
|
+
const newViewer = yield df.plot.fromType(viewer.type);
|
|
195
|
+
newViewer.setOptions(viewer.getOptions());
|
|
196
|
+
v.addViewer(newViewer);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}))();
|
|
200
|
+
}, 'Add to workspace'));
|
|
201
|
+
}
|
|
202
|
+
return header;
|
|
203
|
+
};
|
|
204
|
+
if (gridSwitch) {
|
|
205
|
+
gridWrapper.appendChild(getHeader(false));
|
|
206
|
+
const grid = df.plot.grid();
|
|
207
|
+
grid.root.style.height = `${height}px`;
|
|
208
|
+
gridWrapper.appendChild(grid.root);
|
|
209
|
+
existingViewers.push(grid);
|
|
210
|
+
}
|
|
211
|
+
let header = getHeader(true);
|
|
212
|
+
this._appendResultElement(gridWrapper, options === null || options === void 0 ? void 0 : options.category);
|
|
213
|
+
for (const viewer of viewers) {
|
|
214
|
+
if ((viewer === null || viewer === void 0 ? void 0 : viewer.tags) == null)
|
|
215
|
+
continue;
|
|
216
|
+
existingViewers.push(viewer);
|
|
217
|
+
const block = (_e = viewer.tags['.block-size']) !== null && _e !== void 0 ? _e : 100;
|
|
218
|
+
const wrapper = ui.block([], `ui-block-${block}`);
|
|
219
|
+
if (blocks + block <= 100) {
|
|
220
|
+
hideList.push(wrapper);
|
|
221
|
+
blockSize += block;
|
|
222
|
+
}
|
|
223
|
+
blocks += block;
|
|
224
|
+
wrapper.appendChild(header);
|
|
225
|
+
header = ui.div([], 'grok-func-results-header');
|
|
226
|
+
wrapper.appendChild(viewer.root);
|
|
227
|
+
if (viewer.type == 'grid') {
|
|
228
|
+
// @ts-ignore
|
|
229
|
+
const totalHeight = viewer.getOptions()['rowHeight'] *
|
|
230
|
+
(viewer.dataFrame.rowCount + 1);
|
|
231
|
+
if (totalHeight < height)
|
|
232
|
+
height = totalHeight;
|
|
233
|
+
}
|
|
234
|
+
viewer.root.style.height = `${height}px`;
|
|
235
|
+
this._appendResultElement(wrapper, options === null || options === void 0 ? void 0 : options.category);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
_appendResultElement(d, category) {
|
|
239
|
+
if (category != null && this.resultsTabControl != undefined && this.resultTabs.get(category) != null)
|
|
240
|
+
this.resultTabs.get(category).appendChild(d);
|
|
241
|
+
else
|
|
242
|
+
this.resultsDiv.appendChild(d);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZ1bmN0aW9uLXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sQ0FBQyxNQUFNLFVBQVUsQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxNQUFNLE9BQU8sWUFBYSxTQUFRLEVBQUUsQ0FBQyxRQUFRO0lBQzNDLFlBQVksSUFBYTtRQUN2QixLQUFLLEVBQUUsQ0FBQztRQVFGLFVBQUssR0FBVyxVQUFVLENBQUM7UUEySG5DLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsaUJBQVksR0FBNkIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVuRCxlQUFVLEdBQTZCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakQsZUFBVSxHQUFnQixFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQzVELGlCQUFZLEdBQW1CLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QyxnQkFBVyxHQUFtQixFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkMsY0FBUyxHQUFtQixFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBMUk1RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUMzQyxJ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WyJpbXBvcnQgd3UgZnJvbSAnd3UnO1xuaW1wb3J0ICQgZnJvbSAnY2FzaC1kb20nO1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcblxuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uVmlldyBleHRlbmRzIERHLlZpZXdCYXNlIHtcbiAgY29uc3RydWN0b3IoZnVuYzogREcuRnVuYykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5mdW5jID0gZnVuYztcbiAgICB0aGlzLmNvbnRleHQgPSBERy5Db250ZXh0LmNsb25lRGVmYXVsdCgpO1xuICAgIHRoaXMuY29udHJvbHNSb290LnN0eWxlLm1heFdpZHRoID0gJzM3MHB4JztcbiAgICB0aGlzLmJveCA9IHRydWU7XG4gICAgdGhpcy5fc2V0RnVuY3Rpb24odW5kZWZpbmVkKS50aGVuKChyKSA9PiB7fSk7XG4gIH1cblxuICBwcml2YXRlIF90eXBlOiBzdHJpbmcgPSAnZnVuY3Rpb24nO1xuICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuICBwdWJsaWMgZnVuYzogREcuRnVuYztcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBERy5Db250ZXh0O1xuXG5cbiAgYXN5bmMgX3NldEZ1bmN0aW9uKGNhbGw6IERHLkZ1bmNDYWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgLypcbiAgICAgIHZhciBtZXRhID0gRW50aXR5TWV0YS5mb3JFbnRpdHkoZik7XG4gICAgICBmdW5jID0gYXdhaXQgbWV0YS5yZWZyZXNoKGYpO1xuICAgICovXG4gICAgaWYgKGNhbGwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiAgaWYgKGNhbGwudmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZXMoKS5pc0VtcHR5KVxuICAgICAgICAgIHJ1bkZ1bmMoY2FsbCkudGhlbigoXykgPT4gY2FsbC5yZXNldCgpKTtcbiAgICAgICAgX2NhbGxQYXRoID0gJy8ke2NhbGwudG9VcmkoKX0nO1xuICAgICAgICBSb3V0aW5nLnNldFBhdGgodGhpcy5wYXRoLCBmLm5hbWUsIHRydWUpOyovXG4gICAgfVxuXG4gICAgY2FsbCA/Pz0gdGhpcy5mdW5jLnByZXBhcmUoKTtcbiAgICBjYWxsLmF1eFsndmlldyddID0gdGhpcztcbiAgICBjYWxsLmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG5cbiAgICB0aGlzLnNpbmdsZURmUGFyYW0gPSB3dSh0aGlzLmZ1bmMub3V0cHV0cykuZmlsdGVyKChwKSA9PiBwLnByb3BlcnR5VHlwZSA9PSBERy5UWVBFLkRBVEFfRlJBTUUpXG4gICAgICAudG9BcnJheSgpLmxlbmd0aCA9PSAxO1xuICAgIGNvbnN0IHJ1blNlY3Rpb24gPSB0aGlzLnJlbmRlclJ1blNlY3Rpb24oY2FsbCk7XG4gICAgLy92YXIgZnVsbFJ1blNlY3Rpb24gPSBkaXYoKTtcblxuICAgIGNvbnN0IGZ1bmNEaXYgPSB1aS5kaXYoW3J1blNlY3Rpb25dLCAndWktZGl2Jyk7XG4gICAgLy92YXIgZnVsbERpdiA9IGRpdigndWktcGFuZWwnLCBbZ2V0RnVsbFNlY3Rpb24oZnVuYywgY2FsbCwgZnVsbFJ1blNlY3Rpb24pXSk7XG4gICAgLy9odG1sU2V0RGlzcGxheShmdWxsRGl2LCBmYWxzZSk7XG5cbiAgICBmb3IgKGNvbnN0IGluUGFyYW0gb2Ygd3UoY2FsbC5pbnB1dFBhcmFtcy52YWx1ZXMoKSBhcyBERy5GdW5jQ2FsbFBhcmFtW10pXG4gICAgICAuZmlsdGVyKChwOiBERy5GdW5jQ2FsbFBhcmFtKSA9PlxuICAgICAgICBwLnByb3BlcnR5LnByb3BlcnR5VHlwZSA9PSBERy5UWVBFLkRBVEFfRlJBTUUgJiYgcC5wcm9wZXJ0eS5vcHRpb25zWyd2aWV3ZXInXSAhPSBudWxsKSkge1xuICAgICAgdGhpcy5zaG93SW5wdXRzID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5zdWJzLnB1c2goaW5QYXJhbS5vbkNoYW5nZWQuc3Vic2NyaWJlKGFzeW5jIGZ1bmN0aW9uKHBhcmFtOiBERy5GdW5jQ2FsbFBhcmFtKSB7XG4gICAgICAgIHNlbGYuY2xlYXJSZXN1bHRzKHRydWUsIGZhbHNlKTtcbiAgICAgICAgcGFyYW0ucHJvY2Vzc091dHB1dCgpO1xuXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0RGF0YUZyYW1lKHBhcmFtLFxuICAgICAgICAgIHtoZWlnaHQ6IChzZWxmLnNpbmdsZURmUGFyYW0gJiYgIWdyb2suc2hlbGwud2luZG93cy5wcmVzZW50YXRpb25Nb2RlKSA/IDYwMCA6IDQwMCxcbiAgICAgICAgICAgIGNhdGVnb3J5OiAnSU5QVVQnfSk7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgdGhpcy5jb250cm9sc1Jvb3QuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5jb250cm9sc1Jvb3QuYXBwZW5kQ2hpbGQoZnVuY0Rpdik7XG4gICAgLy90aGlzLmNvbnRyb2xzUm9vdC5hcHBlbmRDaGlsZChmdWxsRGl2KTtcblxuICAgIC8qYWR2YW5jZWRNb2RlU3dpdGNoLm9uQ2hhbmdlZC5saXN0ZW4oKF8pIHtcbiAgICAgIGlmIChhZHZhbmNlZE1vZGVTd2l0Y2gudmFsdWUpXG4gICAgICAgIGZ1bGxSdW5TZWN0aW9uLmFwcGVuZChydW5TZWN0aW9uKTtcbiAgICAgIGVsc2VcbiAgICAgICAgZnVuY0Rpdi5hcHBlbmQocnVuU2VjdGlvbik7XG4gICAgICBodG1sU2V0RGlzcGxheShmdWxsRGl2LCBhZHZhbmNlZE1vZGVTd2l0Y2gudmFsdWUpO1xuICAgICAgaHRtbFNldERpc3BsYXkoZnVuY0RpdiwgIWFkdmFuY2VkTW9kZVN3aXRjaC52YWx1ZSk7XG4gICAgfSk7Ki9cbiAgICAvL3NldFJpYmJvbigpO1xuXG4gICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHVpLnNwbGl0SChbdGhpcy5jb250cm9sc1Jvb3QsIHRoaXMucmVzdWx0c1Jvb3RdICkpO1xuICAgIC8qXG4gICAgUm91dGluZy5zZXRQYXRoKHRoaXMucGF0aCwgZi5uYW1lLCB0cnVlKTtcbiAgICAqL1xuICAgIHRoaXMucmVzdWx0c1Jvb3QuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5yZXN1bHRzUm9vdC5hcHBlbmRDaGlsZCh0aGlzLnJlc3VsdHNEaXYpO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuZnVuYy5mcmllbmRseU5hbWU7XG4gIH1cblxuICBjbGVhclJlc3VsdHMoY2xlYXJUYWJzOiBib29sZWFuID0gdHJ1ZSwgc2hvd091dHB1dDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBjb25zdCBjYXRlZ29yaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIC8vICByZXN1bHRUYWJzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuc2hvd0lucHV0cykge1xuICAgICAgY2F0ZWdvcmllcy5wdXNoKCdJTlBVVCcpO1xuICAgICAgdGhpcy5yZXN1bHRUYWJzLnNldCgnSU5QVVQnLCB0aGlzLmlucHV0c0Rpdik7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLmZ1bmMub3V0cHV0cykge1xuICAgICAgaWYgKGNhdGVnb3JpZXMuaW5jbHVkZXMocC5jYXRlZ29yeSkpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgY2F0ZWdvcmllcy5wdXNoKHAuY2F0ZWdvcnkpO1xuICAgIH1cbiAgICBpZiAoY2xlYXJUYWJzICYmIChjYXRlZ29yaWVzLmxlbmd0aCA+IDEgfHwgKGNhdGVnb3JpZXMubGVuZ3RoID09IDEgJiYgY2F0ZWdvcmllc1swXSAhPSAnTWlzYycpKSkge1xuICAgICAgdGhpcy5yZXN1bHRzVGFiQ29udHJvbCA9IERHLlRhYkNvbnRyb2wuY3JlYXRlKCk7XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgY2F0ZWdvcmllcykge1xuICAgICAgICBpZiAoIXRoaXMucmVzdWx0VGFicy5oYXMoYykpXG4gICAgICAgICAgdGhpcy5yZXN1bHRUYWJzLnNldChjLCB1aS5kaXYoW10sICd1aS1wYW5lbCxncm9rLWZ1bmMtcmVzdWx0cycpKTtcbiAgICAgICAgbGV0IG5hbWUgPSBjO1xuICAgICAgICBpZiAodGhpcy5zaG93SW5wdXRzICYmIGNhdGVnb3JpZXMubGVuZ3RoID09IDIgJiYgYyA9PSAnTWlzYycpXG4gICAgICAgICAgbmFtZSA9ICdPVVRQVVQnO1xuICAgICAgICB0aGlzLnJlc3VsdHNUYWJDb250cm9sLmFkZFBhbmUobmFtZSwgKCkgPT4gdGhpcy5yZXN1bHRUYWJzLmdldChjKSA/PyB1aS5kaXYoKSk7XG4gICAgICB9XG4gICAgICBpZiAoY2F0ZWdvcmllcy5sZW5ndGggPiAxICYmIHRoaXMuc2hvd0lucHV0cyAmJiBzaG93T3V0cHV0KVxuICAgICAgICB0aGlzLnJlc3VsdHNUYWJDb250cm9sLmN1cnJlbnRQYW5lID0gdGhpcy5yZXN1bHRzVGFiQ29udHJvbC5wYW5lc1sxXTtcbiAgICAgIHRoaXMucmVzdWx0c0RpdiA9IHRoaXMucmVzdWx0c1RhYkNvbnRyb2wucm9vdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHRzRGl2ID0gdWkucGFuZWwoW10sICdncm9rLWZ1bmMtcmVzdWx0cycpO1xuICAgICAgdGhpcy5yZXN1bHRzVGFiQ29udHJvbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5yZXN1bHRzUm9vdC5pbm5lckhUTUwgPSAnJztcbiAgICB0aGlzLnJlc3VsdHNSb290LmFwcGVuZENoaWxkKHRoaXMucmVzdWx0c0Rpdik7XG4gIH1cblxuICByZW5kZXJSdW5TZWN0aW9uKGNhbGw6IERHLkZ1bmNDYWxsKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB1aS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJ1bkJ1dHRvbiA9IHVpLmJpZ0J1dHRvbignUnVuJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjYWxsLmF1eFsndmlldyddID0gdGhpcy5kYXJ0O1xuICAgICAgICBhd2FpdCBjYWxsLmNhbGwodHJ1ZSwgdW5kZWZpbmVkLCB7cHJvY2Vzc2VkOiB0cnVlfSk7XG4gICAgICAgIHRoaXMuY2xlYXJSZXN1bHRzKGZhbHNlLCB0cnVlKTtcbiAgICAgICAgZm9yIChjb25zdCBbLCBwXSBvZiBjYWxsLm91dHB1dFBhcmFtcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdwYXJhbScsIHAudmFsdWUpO1xuICAgICAgICAgIHAucHJvY2Vzc091dHB1dCgpO1xuICAgICAgICAgIGlmIChwLnByb3BlcnR5LnByb3BlcnR5VHlwZSA9PSBERy5UWVBFLkRBVEFfRlJBTUUgJiYgcC52YWx1ZSAhPSBudWxsKVxuICAgICAgICAgICAgdGhpcy5hcHBlbmRSZXN1bHREYXRhRnJhbWUocCwge2NhcHRpb246IHAucHJvcGVydHkubmFtZSwgY2F0ZWdvcnk6IHAucHJvcGVydHkuY2F0ZWdvcnl9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBlZGl0b3I6IEhUTUxEaXZFbGVtZW50ID0gYXdhaXQgY2FsbC5nZXRFZGl0b3IodHJ1ZSk7XG4gICAgICBlZGl0b3IuYXBwZW5kQ2hpbGQodWkuYnV0dG9uc0lucHV0KFtydW5CdXR0b25dKSk7XG4gICAgICByZXR1cm4gZWRpdG9yO1xuICAgIH0pO1xuICB9XG5cbiAgc2hvd0lucHV0czogYm9vbGVhbiA9IGZhbHNlO1xuICBzaW5nbGVEZlBhcmFtOiBib29sZWFuID0gZmFsc2U7XG4gIHBhcmFtVmlld2VyczogTWFwPHN0cmluZywgREcuVmlld2VyW10+ID0gbmV3IE1hcCgpO1xuICByZXN1bHRzVGFiQ29udHJvbDogREcuVGFiQ29udHJvbCB8IHVuZGVmaW5lZDtcbiAgcmVzdWx0VGFiczogTWFwPFN0cmluZywgSFRNTEVsZW1lbnQ+ID0gbmV3IE1hcCgpO1xuICByZXN1bHRzRGl2OiBIVE1MRWxlbWVudCA9IHVpLnBhbmVsKFtdLCAnZ3Jvay1mdW5jLXJlc3VsdHMnKTtcbiAgY29udHJvbHNSb290OiBIVE1MRGl2RWxlbWVudCA9IHVpLmJveCgpO1xuICByZXN1bHRzUm9vdDogSFRNTERpdkVsZW1lbnQgPSB1aS5ib3goKTtcbiAgaW5wdXRzRGl2OiBIVE1MRGl2RWxlbWVudCA9IHVpLnBhbmVsKFtdLCAnZ3Jvay1mdW5jLXJlc3VsdHMnKTtcblxuICBhcHBlbmRSZXN1bHREYXRhRnJhbWUocGFyYW06IERHLkZ1bmNDYWxsUGFyYW0sIG9wdGlvbnM/OiB7IGNhcHRpb24/OiBzdHJpbmcsIGNhdGVnb3J5Pzogc3RyaW5nLCBoZWlnaHQ/OiBudW1iZXJ9KSB7XG4gICAgY29uc3QgZGYgPSBwYXJhbS52YWx1ZTtcbiAgICBjb25zb2xlLmxvZygnZGF0YWZyYW1lJywgZGYpO1xuICAgIGxldCBjYXB0aW9uID0gb3B0aW9ucz8uY2FwdGlvbjtcbiAgICBsZXQgaGVpZ2h0ID0gb3B0aW9ucz8uaGVpZ2h0ID8/IDQwMDtcbiAgICBjb25zdCB2aWV3ZXJzOiBERy5WaWV3ZXJbXSA9IHBhcmFtLmF1eFsndmlld2VycyddID8/IFtdO1xuICAgIGNhcHRpb24gPz89IHBhcmFtLmF1eFsndmlld2VyVGl0bGUnXSA/P1xuICAgICAgKCh0aGlzLnNpbmdsZURmUGFyYW0gJiYgdmlld2Vycy5sZW5ndGggPT0gMSkgPyAnJyA6IHBhcmFtLnByb3BlcnR5LmNhcHRpb24pID8/ICcnO1xuICAgIGxldCBleGlzdGluZ1ZpZXdlcnM6IERHLlZpZXdlcltdIHwgdW5kZWZpbmVkID0gdGhpcy5wYXJhbVZpZXdlcnMuZ2V0KHBhcmFtLm5hbWUpO1xuICAgIGlmIChleGlzdGluZ1ZpZXdlcnMgIT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCB2IG9mIGV4aXN0aW5nVmlld2VycylcbiAgICAgICAgdi5kYXRhRnJhbWUgPSBkZjtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBleGlzdGluZ1ZpZXdlcnMgPz89IFtdO1xuICAgIHRoaXMucGFyYW1WaWV3ZXJzLnNldChwYXJhbS5uYW1lLCBleGlzdGluZ1ZpZXdlcnMpO1xuICAgIGlmICh2aWV3ZXJzLmxlbmd0aCA9PSAwKVxuICAgICAgdmlld2Vycy5wdXNoKGRmLnBsb3QuZ3JpZCgpKTtcblxuICAgIGNvbnN0IGhpZGVMaXN0OiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgbGV0IGJsb2NrczogbnVtYmVyID0gMDtcbiAgICBsZXQgYmxvY2tTaXplOiBudW1iZXIgPSAwO1xuICAgIGNvbnN0IGdyaWRXcmFwcGVyID0gdWkuYmxvY2soW10pO1xuXG4gICAgY29uc3QgZ3JpZFN3aXRjaCA9ICF3dSh2aWV3ZXJzKS5zb21lKCh2OiBERy5WaWV3ZXIpID0+IHYudHlwZSA9PSAnR3JpZCcpO1xuICAgICQoZ3JpZFdyYXBwZXIpLmhpZGUoKTtcblxuICAgIGNvbnN0IGdldEhlYWRlciA9IChzdzogYm9vbGVhbikgPT4ge1xuICAgICAgY29uc3QgcyA9IGNhcHRpb24gPz8gZGYubmFtZSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRlciA9IHVpLmRpdihbXSwgJ2dyb2stZnVuYy1yZXN1bHRzLWhlYWRlcicpO1xuICAgICAgaWYgKHMgIT0gJycpIHtcbiAgICAgICAgY29uc3QgaCA9IHVpLmgxKHMpO1xuICAgICAgICB1aS5Ub29sdGlwLmJpbmQoaCwgKCkgPT4gcyk7XG4gICAgICAgIGhlYWRlci5hcHBlbmRDaGlsZChoKTtcbiAgICAgIH1cbiAgICAgIGlmIChncmlkU3dpdGNoKSB7XG4gICAgICAgIGNvbnN0IGljb24gPSB1aS5pY29uU3ZnKCd0YWJsZScsIChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB1aS5zZXREaXNwbGF5QWxsKGhpZGVMaXN0LCAhc3cpO1xuICAgICAgICAgIHVpLnNldERpc3BsYXkoZ3JpZFdyYXBwZXIsIHN3KTtcbiAgICAgICAgICBncmlkV3JhcHBlci5jbGFzc0xpc3QuYWRkKGB1aS1ibG9jay0ke2Jsb2NrU2l6ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICAsICdTaG93IGdyaWQnKTtcbiAgICAgICAgaWYgKCFzdylcbiAgICAgICAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoaWNvbik7XG4gICAgICB9XG4gICAgICBpZiAoIWdyb2suc2hlbGwudGFibGVzLmluY2x1ZGVzKGRmKSkge1xuICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQodWkuaWNvbnMuYWRkKChlOiBhbnkpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGNvbnN0IHYgPSBncm9rLnNoZWxsLmFkZFRhYmxlVmlldyhkZik7XG4gICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgdmlld2VyIG9mIHZpZXdlcnMpIHtcbiAgICAgICAgICAgICAgaWYgKHZpZXdlci50eXBlICE9ICdHcmlkJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZpZXdlciA9IGF3YWl0IGRmLnBsb3QuZnJvbVR5cGUodmlld2VyLnR5cGUpIGFzIERHLlZpZXdlcjtcbiAgICAgICAgICAgICAgICBuZXdWaWV3ZXIuc2V0T3B0aW9ucyh2aWV3ZXIuZ2V0T3B0aW9ucygpKTtcbiAgICAgICAgICAgICAgICB2LmFkZFZpZXdlcihuZXdWaWV3ZXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgfSxcbiAgICAgICAgJ0FkZCB0byB3b3Jrc3BhY2UnLFxuICAgICAgICApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoZWFkZXI7XG4gICAgfTtcblxuICAgIGlmIChncmlkU3dpdGNoKSB7XG4gICAgICBncmlkV3JhcHBlci5hcHBlbmRDaGlsZChnZXRIZWFkZXIoZmFsc2UpKTtcbiAgICAgIGNvbnN0IGdyaWQgPSBkZi5wbG90LmdyaWQoKTtcbiAgICAgIGdyaWQucm9vdC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgICAgZ3JpZFdyYXBwZXIuYXBwZW5kQ2hpbGQoZ3JpZC5yb290KTtcbiAgICAgIGV4aXN0aW5nVmlld2Vycy5wdXNoKGdyaWQpO1xuICAgIH1cblxuICAgIGxldCBoZWFkZXIgPSBnZXRIZWFkZXIodHJ1ZSk7XG4gICAgdGhpcy5fYXBwZW5kUmVzdWx0RWxlbWVudChncmlkV3JhcHBlciwgb3B0aW9ucz8uY2F0ZWdvcnkpO1xuICAgIGZvciAoY29uc3Qgdmlld2VyIG9mIHZpZXdlcnMpIHtcbiAgICAgIGlmICh2aWV3ZXI/LnRhZ3MgPT0gbnVsbClcbiAgICAgICAgY29udGludWU7XG4gICAgICBleGlzdGluZ1ZpZXdlcnMucHVzaCh2aWV3ZXIpO1xuICAgICAgY29uc3QgYmxvY2sgPSB2aWV3ZXIudGFnc1snLmJsb2NrLXNpemUnXSA/PyAxMDA7XG4gICAgICBjb25zdCB3cmFwcGVyID0gdWkuYmxvY2soW10sIGB1aS1ibG9jay0ke2Jsb2NrfWApO1xuICAgICAgaWYgKGJsb2NrcyArIGJsb2NrIDw9IDEwMCkge1xuICAgICAgICBoaWRlTGlzdC5wdXNoKHdyYXBwZXIpO1xuICAgICAgICBibG9ja1NpemUgKz0gYmxvY2s7XG4gICAgICB9XG4gICAgICBibG9ja3MgKz0gYmxvY2s7XG4gICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGhlYWRlcik7XG4gICAgICBoZWFkZXIgPSB1aS5kaXYoW10sICdncm9rLWZ1bmMtcmVzdWx0cy1oZWFkZXInKTtcbiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQodmlld2VyLnJvb3QpO1xuICAgICAgaWYgKHZpZXdlci50eXBlID09ICdncmlkJykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gdmlld2VyLmdldE9wdGlvbnMoKVsncm93SGVpZ2h0J10gKlxuICAgICAgICAgICh2aWV3ZXIuZGF0YUZyYW1lIS5yb3dDb3VudCArIDEpO1xuICAgICAgICBpZiAodG90YWxIZWlnaHQgPCBoZWlnaHQpXG4gICAgICAgICAgaGVpZ2h0ID0gdG90YWxIZWlnaHQ7XG4gICAgICB9XG4gICAgICB2aWV3ZXIucm9vdC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgICAgdGhpcy5fYXBwZW5kUmVzdWx0RWxlbWVudCh3cmFwcGVyLCBvcHRpb25zPy5jYXRlZ29yeSk7XG4gICAgfVxuICB9XG5cbiAgX2FwcGVuZFJlc3VsdEVsZW1lbnQoZDogSFRNTEVsZW1lbnQsIGNhdGVnb3J5Pzogc3RyaW5nKSB7XG4gICAgaWYgKGNhdGVnb3J5ICE9IG51bGwgJiYgdGhpcy5yZXN1bHRzVGFiQ29udHJvbCAhPSB1bmRlZmluZWQgJiYgdGhpcy5yZXN1bHRUYWJzLmdldChjYXRlZ29yeSkgIT0gbnVsbClcbiAgICAgIHRoaXMucmVzdWx0VGFicy5nZXQoY2F0ZWdvcnkpIS5hcHBlbmRDaGlsZChkKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLnJlc3VsdHNEaXYuYXBwZW5kQ2hpbGQoZCk7XG4gIH1cbn1cbiJdfQ==
|
package/src/random.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates single random float from 0 to range.
|
|
3
|
+
*
|
|
4
|
+
* @export
|
|
5
|
+
* @param {number} range Max generating value.
|
|
6
|
+
* @return {number} A random float generated.
|
|
7
|
+
*/
|
|
8
|
+
export declare function randomFloat(range: number): number;
|
|
9
|
+
/**
|
|
10
|
+
* Generates single random integer from 0 to range.
|
|
11
|
+
*
|
|
12
|
+
* @export
|
|
13
|
+
* @param {number} range Max generating value.
|
|
14
|
+
* @return {number} A random integer generated.
|
|
15
|
+
*/
|
|
16
|
+
export declare function randomInt(range: number): number;
|
|
17
|
+
//# sourceMappingURL=random.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.d.ts","sourceRoot":"","sources":["random.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
package/src/random.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates single random float from 0 to range.
|
|
3
|
+
*
|
|
4
|
+
* @export
|
|
5
|
+
* @param {number} range Max generating value.
|
|
6
|
+
* @return {number} A random float generated.
|
|
7
|
+
*/
|
|
8
|
+
export function randomFloat(range) {
|
|
9
|
+
return Math.random() * range;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Generates single random integer from 0 to range.
|
|
13
|
+
*
|
|
14
|
+
* @export
|
|
15
|
+
* @param {number} range Max generating value.
|
|
16
|
+
* @return {number} A random integer generated.
|
|
17
|
+
*/
|
|
18
|
+
export function randomInt(range) {
|
|
19
|
+
return Math.floor(randomFloat(range));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmFuZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gZmxvYXQgZnJvbSAwIHRvIHJhbmdlLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZSBNYXggZ2VuZXJhdGluZyB2YWx1ZS5cbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQgZ2VuZXJhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tRmxvYXQocmFuZ2U6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpICogcmFuZ2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gaW50ZWdlciBmcm9tIDAgdG8gcmFuZ2UuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlIE1heCBnZW5lcmF0aW5nIHZhbHVlLlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUludChyYW5nZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IocmFuZG9tRmxvYXQocmFuZ2UpKTtcbn1cbiJdfQ==
|