sliftutils 1.2.23 → 1.2.25
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/.claude/settings.local.json +7 -0
- package/dist/test.ts.cache +13 -0
- package/misc/dist/apiKeys.tsx.cache +145 -0
- package/misc/dist/openrouter.ts.cache +119 -0
- package/misc/dist/yaml.ts.cache +45 -0
- package/misc/dist/yamlBase.ts.cache +2406 -0
- package/misc/openrouter.ts +29 -3
- package/package.json +3 -2
- package/render-utils/dist/Input.tsx.cache +319 -0
- package/render-utils/dist/InputLabel.tsx.cache +220 -0
- package/render-utils/dist/modal.tsx.cache +69 -0
- package/render-utils/dist/observer.tsx.cache +6 -3
- package/storage/DiskCollection.ts +2 -2
- package/storage/FileFolderAPI.tsx +37 -15
- package/test.ts +10 -0
package/misc/openrouter.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { parseYAML } from "./yaml";
|
|
2
2
|
import { retryFunctional } from "socket-function/src/batching";
|
|
3
|
+
|
|
4
|
+
const CANNOT_RETRY = "(CANNOT RETRY)";
|
|
3
5
|
import { formatNumber } from "socket-function/src/formatting/format";
|
|
4
6
|
import { getAPIKey } from "./apiKeys";
|
|
5
7
|
|
|
@@ -97,7 +99,6 @@ export async function openRouterCallBase(config: {
|
|
|
97
99
|
let time = Date.now();
|
|
98
100
|
let stillRunning = true;
|
|
99
101
|
|
|
100
|
-
// Spawn monitoring loop
|
|
101
102
|
void (async () => {
|
|
102
103
|
while (stillRunning) {
|
|
103
104
|
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
@@ -126,7 +127,6 @@ export async function openRouterCallBase(config: {
|
|
|
126
127
|
}),
|
|
127
128
|
});
|
|
128
129
|
|
|
129
|
-
// If it failed, throw
|
|
130
130
|
if (response.status !== 200) {
|
|
131
131
|
let responseText = await response.text();
|
|
132
132
|
throw new Error(`Failed to call OpenRouter: ${response.status} ${response.statusText} ${responseText}`);
|
|
@@ -136,11 +136,34 @@ export async function openRouterCallBase(config: {
|
|
|
136
136
|
cost: number;
|
|
137
137
|
};
|
|
138
138
|
choices: {
|
|
139
|
+
finish_reason?: string;
|
|
139
140
|
message: {
|
|
140
141
|
content: string;
|
|
142
|
+
refusal?: string | null;
|
|
141
143
|
};
|
|
142
144
|
}[];
|
|
145
|
+
error?: {
|
|
146
|
+
code?: number | string;
|
|
147
|
+
message?: string;
|
|
148
|
+
metadata?: unknown;
|
|
149
|
+
};
|
|
143
150
|
};
|
|
151
|
+
if (responseObj.error) {
|
|
152
|
+
throw new Error(`OpenRouter returned an error: ${responseObj.error.code} ${responseObj.error.message} ${JSON.stringify(responseObj.error.metadata)}`);
|
|
153
|
+
}
|
|
154
|
+
let choice = responseObj.choices?.[0];
|
|
155
|
+
if (!choice) {
|
|
156
|
+
throw new Error(`OpenRouter returned no choices: ${JSON.stringify(responseObj)}`);
|
|
157
|
+
}
|
|
158
|
+
if (choice.message.refusal) {
|
|
159
|
+
throw new Error(`OpenRouter model refused content: ${choice.message.refusal} ${CANNOT_RETRY}`);
|
|
160
|
+
}
|
|
161
|
+
if (choice.finish_reason === "content_filter") {
|
|
162
|
+
throw new Error(`OpenRouter content filter triggered (finish_reason=content_filter): ${choice.message.content ?? ""} ${CANNOT_RETRY}`);
|
|
163
|
+
}
|
|
164
|
+
if (choice.finish_reason === "error") {
|
|
165
|
+
throw new Error(`OpenRouter completion errored (finish_reason=error): ${choice.message.content ?? ""}`);
|
|
166
|
+
}
|
|
144
167
|
let newCost = responseObj.usage.cost;
|
|
145
168
|
totalCost += newCost;
|
|
146
169
|
onCost?.(newCost);
|
|
@@ -161,7 +184,10 @@ export async function openRouterCallBase(config: {
|
|
|
161
184
|
pendingLog.duration += Date.now() - time;
|
|
162
185
|
pendingLog.cost += newCost;
|
|
163
186
|
return responseObj.choices[0].message.content as string;
|
|
164
|
-
}, {
|
|
187
|
+
}, {
|
|
188
|
+
maxRetries: config.retries || 3,
|
|
189
|
+
shouldRetry: message => !message.includes(CANNOT_RETRY),
|
|
190
|
+
})();
|
|
165
191
|
} finally {
|
|
166
192
|
stillRunning = false;
|
|
167
193
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sliftutils",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.25",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -25,7 +25,8 @@
|
|
|
25
25
|
"watch-web": "node ./builders/watchRun.js --port 9877 \"web/*.ts\" \"web/*.tsx\" \"yarn build-web\"",
|
|
26
26
|
"watch-extension": "node ./builders/watchRun.js --port 9878 \"extension/*.ts\" \"extension/*.tsx\" \"yarn build-extension\"",
|
|
27
27
|
"watch-electron": "node ./builders/watchRun.js --port 9879 \"electron/*.ts\" \"electron/*.tsx\" \"yarn build-electron\"",
|
|
28
|
-
"notes": "mobx, preact, socket-function, typenode SHOULD be peerDependencies. But we want to use yarn (better dependency deduplication), so we can't use peerDependencies (as they aren't installed by default, which makes them a nightmare to use). If you want to override the versions, feel free to use overrides/resolutions."
|
|
28
|
+
"notes": "mobx, preact, socket-function, typenode SHOULD be peerDependencies. But we want to use yarn (better dependency deduplication), so we can't use peerDependencies (as they aren't installed by default, which makes them a nightmare to use). If you want to override the versions, feel free to use overrides/resolutions.",
|
|
29
|
+
"test": "typenode ./test.ts"
|
|
29
30
|
},
|
|
30
31
|
"bin": {
|
|
31
32
|
"build-nodejs": "./builders/nodeJSBuildRun.js",
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
12
|
+
//exports.Input = void 0;
|
|
13
|
+
const preact_1 = __importDefault(require("preact"));
|
|
14
|
+
const typesafecss_1 = require("typesafecss");
|
|
15
|
+
const observer_1 = require("./observer");
|
|
16
|
+
const misc_1 = require("socket-function/src/misc");
|
|
17
|
+
let Input = class Input extends preact_1.default.Component {
|
|
18
|
+
constructor() {
|
|
19
|
+
super(...arguments);
|
|
20
|
+
this.onFocusText = "";
|
|
21
|
+
this.firstFocus = true;
|
|
22
|
+
this.elem = null;
|
|
23
|
+
this.lastValue = null;
|
|
24
|
+
this.lastChecked = null;
|
|
25
|
+
this.onChangeThrottle = undefined;
|
|
26
|
+
}
|
|
27
|
+
render() {
|
|
28
|
+
let flavorOverrides = {};
|
|
29
|
+
const { flavor, textarea, hot, inputKey, fillWidth, ...nativeProps } = this.props;
|
|
30
|
+
let props = { ...nativeProps };
|
|
31
|
+
if (props.onChangeValue) {
|
|
32
|
+
let throttle = this.props.throttle;
|
|
33
|
+
if (throttle) {
|
|
34
|
+
let existingThrottle = this.onChangeThrottle;
|
|
35
|
+
if ((existingThrottle === null || existingThrottle === void 0 ? void 0 : existingThrottle.throttle) !== throttle) {
|
|
36
|
+
existingThrottle = this.onChangeThrottle = {
|
|
37
|
+
throttle,
|
|
38
|
+
run: (0, misc_1.throttleFunction)(throttle, (newValue) => {
|
|
39
|
+
var _a, _b;
|
|
40
|
+
(_b = (_a = this.props).onChangeValue) === null || _b === void 0 ? void 0 : _b.call(_a, newValue);
|
|
41
|
+
})
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
props.onChangeValue = existingThrottle.run;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (flavor === "large") {
|
|
48
|
+
flavorOverrides = {
|
|
49
|
+
fontSize: 18,
|
|
50
|
+
padding: "10px 15px",
|
|
51
|
+
};
|
|
52
|
+
if (props.type === "checkbox") {
|
|
53
|
+
flavorOverrides.width = 16;
|
|
54
|
+
flavorOverrides.height = 16;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (flavor === "small") {
|
|
58
|
+
flavorOverrides = {
|
|
59
|
+
fontSize: 12,
|
|
60
|
+
padding: "5px 10px",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// IMPORTANT! When focused, preserve the input value, otherwise typing is annoying.
|
|
64
|
+
// This doesn't usually happen, but can if background tasks are updating the UI
|
|
65
|
+
// while the user is typing.
|
|
66
|
+
let attributes = {
|
|
67
|
+
...nativeProps,
|
|
68
|
+
key: inputKey || "input",
|
|
69
|
+
ref: x => {
|
|
70
|
+
if (x) {
|
|
71
|
+
this.elem = x;
|
|
72
|
+
}
|
|
73
|
+
if (x && props.focusOnMount && this.firstFocus) {
|
|
74
|
+
this.firstFocus = false;
|
|
75
|
+
setTimeout(() => {
|
|
76
|
+
x.focus();
|
|
77
|
+
}, 0);
|
|
78
|
+
}
|
|
79
|
+
let ref = props.inputRef;
|
|
80
|
+
if (typeof ref === "function") {
|
|
81
|
+
ref(x);
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
class: undefined,
|
|
85
|
+
className: ((props.className || props.class || " ")
|
|
86
|
+
+ typesafecss_1.css.display("flex", "soft")
|
|
87
|
+
.outline("3px solid hsl(204, 100%, 50%)", "focus", "soft")
|
|
88
|
+
+ (fillWidth && typesafecss_1.css.fillWidth)),
|
|
89
|
+
style: {
|
|
90
|
+
...flavorOverrides,
|
|
91
|
+
...props.style,
|
|
92
|
+
},
|
|
93
|
+
onFocus: e => {
|
|
94
|
+
var _a;
|
|
95
|
+
if (props.type === "checkbox")
|
|
96
|
+
return;
|
|
97
|
+
this.onFocusText = e.currentTarget.value;
|
|
98
|
+
if (!props.noFocusSelect) {
|
|
99
|
+
e.currentTarget.select();
|
|
100
|
+
}
|
|
101
|
+
(_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
|
102
|
+
},
|
|
103
|
+
onBlur: e => {
|
|
104
|
+
var _a, _b, _c, _d;
|
|
105
|
+
if (props.type === "checkbox")
|
|
106
|
+
return;
|
|
107
|
+
(_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
|
108
|
+
if (e.currentTarget.value === this.lastValue && e.currentTarget.checked === this.lastChecked && hot)
|
|
109
|
+
return;
|
|
110
|
+
this.lastValue = e.currentTarget.value;
|
|
111
|
+
this.lastChecked = e.currentTarget.checked;
|
|
112
|
+
let result = (_b = props.onInput) === null || _b === void 0 ? void 0 : _b.call(props, e);
|
|
113
|
+
result = ((_c = props.onChange) === null || _c === void 0 ? void 0 : _c.call(props, e)) || result;
|
|
114
|
+
result = ((_d = props.onChangeValue) === null || _d === void 0 ? void 0 : _d.call(props, e.currentTarget.value)) || result;
|
|
115
|
+
return result;
|
|
116
|
+
},
|
|
117
|
+
onChange: e => {
|
|
118
|
+
var _a, _b;
|
|
119
|
+
if (props.type !== "checkbox" && e.currentTarget.value === this.lastValue && e.currentTarget.checked === this.lastChecked)
|
|
120
|
+
return;
|
|
121
|
+
this.lastValue = e.currentTarget.value;
|
|
122
|
+
this.lastChecked = e.currentTarget.checked;
|
|
123
|
+
let result = undefined;
|
|
124
|
+
if (!props.onChangeValue || hot) {
|
|
125
|
+
result = ((_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, e)) || result;
|
|
126
|
+
}
|
|
127
|
+
if (hot) {
|
|
128
|
+
result = ((_b = props.onChangeValue) === null || _b === void 0 ? void 0 : _b.call(props, e.currentTarget.value)) || result;
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
},
|
|
132
|
+
onKeyDown: e => {
|
|
133
|
+
var _a, _b, _c;
|
|
134
|
+
if (e.defaultPrevented)
|
|
135
|
+
return;
|
|
136
|
+
// if (textarea && e.code === "Tab") {
|
|
137
|
+
// e.preventDefault();
|
|
138
|
+
// // Inject 4 spaces into the current position
|
|
139
|
+
// let elem = e.currentTarget;
|
|
140
|
+
// let value = elem.value;
|
|
141
|
+
// let start = elem.selectionStart ?? elem.value.length;
|
|
142
|
+
// let end = elem.selectionEnd ?? elem.value.length;
|
|
143
|
+
// elem.value = value.slice(0, start) + " " + value.slice(end);
|
|
144
|
+
// elem.selectionStart = elem.selectionEnd = start + 4;
|
|
145
|
+
// return;
|
|
146
|
+
// }
|
|
147
|
+
(_a = props.onKeyDown) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
|
148
|
+
if (e.code === "Enter" && e.ctrlKey) {
|
|
149
|
+
e.currentTarget.blur();
|
|
150
|
+
}
|
|
151
|
+
let callback = props.onInput;
|
|
152
|
+
if (!callback && hot) {
|
|
153
|
+
callback = props.onChange;
|
|
154
|
+
}
|
|
155
|
+
// Convert tab to 4 spaces
|
|
156
|
+
if (e.code === "Tab" && textarea) {
|
|
157
|
+
e.preventDefault();
|
|
158
|
+
let elem = e.currentTarget;
|
|
159
|
+
let value = elem.value;
|
|
160
|
+
let start = (_b = elem.selectionStart) !== null && _b !== void 0 ? _b : elem.value.length;
|
|
161
|
+
let end = (_c = elem.selectionEnd) !== null && _c !== void 0 ? _c : elem.value.length;
|
|
162
|
+
elem.value = value.slice(0, start) + " " + value.slice(end);
|
|
163
|
+
elem.selectionStart = elem.selectionEnd = start + 4;
|
|
164
|
+
callback === null || callback === void 0 ? void 0 : callback(e);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
if (this.elem && props.type === "number") {
|
|
168
|
+
let delta = 0;
|
|
169
|
+
let magnitude = 1;
|
|
170
|
+
if (e.shiftKey) {
|
|
171
|
+
if (props.integer) {
|
|
172
|
+
magnitude = 10;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
magnitude = 0.1;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (e.code === "ArrowUp") {
|
|
179
|
+
delta = magnitude;
|
|
180
|
+
}
|
|
181
|
+
else if (e.code === "ArrowDown") {
|
|
182
|
+
delta = -magnitude;
|
|
183
|
+
}
|
|
184
|
+
if (props.reverseArrowKeyDirection) {
|
|
185
|
+
delta *= -1;
|
|
186
|
+
}
|
|
187
|
+
if (delta !== 0) {
|
|
188
|
+
e.preventDefault();
|
|
189
|
+
let newValue = Math.round(((+this.elem.value || 0) + delta) * 100) / 100;
|
|
190
|
+
e.currentTarget.value = newValue.toString();
|
|
191
|
+
callback === null || callback === void 0 ? void 0 : callback(e);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
let { noEnterKeyBlur, onInput, onChange } = props;
|
|
195
|
+
// Detach from the synced function, to prevent double calls. This is important, as apparently .blur()
|
|
196
|
+
// synchronously triggers onChange, BUT, only if the input is changing the first time. Which means
|
|
197
|
+
// if this function reruns, it won't trigger the change again. Detaching it causes any triggered
|
|
198
|
+
// functions to become root synced functions, which will allow them to correctly run the sync loop.
|
|
199
|
+
void Promise.resolve().finally(() => {
|
|
200
|
+
if (e.defaultPrevented)
|
|
201
|
+
return;
|
|
202
|
+
if (e.code === "Escape") {
|
|
203
|
+
let changed = e.currentTarget.value !== this.onFocusText;
|
|
204
|
+
e.currentTarget.value = this.onFocusText;
|
|
205
|
+
if (onInput) {
|
|
206
|
+
onInput === null || onInput === void 0 ? void 0 : onInput(e);
|
|
207
|
+
}
|
|
208
|
+
else if (changed) {
|
|
209
|
+
if (onChange) {
|
|
210
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(e);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
e.currentTarget.blur();
|
|
214
|
+
}
|
|
215
|
+
if (!noEnterKeyBlur && e.code === "Enter" && (!textarea || e.shiftKey || e.ctrlKey) || props.autocompleteValues && e.code === "Tab") {
|
|
216
|
+
e.currentTarget.blur();
|
|
217
|
+
}
|
|
218
|
+
else if (e.ctrlKey && (e.code.startsWith("Key") || e.code === "Enter") || e.shiftKey && e.code === "Enter") {
|
|
219
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(e);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
},
|
|
223
|
+
onInput: e => {
|
|
224
|
+
var _a;
|
|
225
|
+
if (props.autocompleteValues) {
|
|
226
|
+
if (e.inputType === "insertText") {
|
|
227
|
+
let curValue = e.currentTarget.value.toLowerCase();
|
|
228
|
+
let match = props.autocompleteValues.find(x => x.toLowerCase().startsWith(curValue));
|
|
229
|
+
if (match) {
|
|
230
|
+
e.currentTarget.value = match || "";
|
|
231
|
+
// Select the part after the previous match, so when they type, they clobber the match part
|
|
232
|
+
let start = curValue.length;
|
|
233
|
+
let end = e.currentTarget.value.length;
|
|
234
|
+
e.currentTarget.selectionStart = start;
|
|
235
|
+
e.currentTarget.selectionEnd = end;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
(_a = props.onInput) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
if ("value" in props && props.type !== "checkbox") {
|
|
243
|
+
let elem = this.elem;
|
|
244
|
+
let newValue = props.value;
|
|
245
|
+
if (!this.props.forceInputValueUpdatesWhenFocused && elem && elem === document.activeElement) {
|
|
246
|
+
newValue = elem.value;
|
|
247
|
+
}
|
|
248
|
+
attributes.value = newValue;
|
|
249
|
+
this.lastValue = String(props.value);
|
|
250
|
+
}
|
|
251
|
+
if ("checked" in props) {
|
|
252
|
+
this.lastChecked = !!props.checked;
|
|
253
|
+
}
|
|
254
|
+
if (attributes.type === "number") {
|
|
255
|
+
// Fix stuff like 55.00000000000001
|
|
256
|
+
let value = attributes.value;
|
|
257
|
+
if (typeof value === "number") {
|
|
258
|
+
value = niceNumberStringify(value);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// We do number handling ourselves
|
|
262
|
+
if (attributes["type"] === "number") {
|
|
263
|
+
delete attributes["type"];
|
|
264
|
+
}
|
|
265
|
+
if (props.type === "checkbox") {
|
|
266
|
+
}
|
|
267
|
+
else if (hot) {
|
|
268
|
+
attributes.onInput = attributes.onChange;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
// We use onChange from onBlur, so don't use the onChange handler, as preact will hook this up
|
|
272
|
+
// with onInput, which will cause it to trigger as if the component is hot!
|
|
273
|
+
delete attributes.onChange;
|
|
274
|
+
}
|
|
275
|
+
if (textarea) {
|
|
276
|
+
return preact_1.default.createElement("textarea", { ...attributes });
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
return preact_1.default.createElement("input", { ...attributes });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
exports.Input = Input;
|
|
284
|
+
exports.Input = Input = __decorate([
|
|
285
|
+
observer_1.observer
|
|
286
|
+
], Input);
|
|
287
|
+
function niceNumberStringify(valueIn) {
|
|
288
|
+
if (Math.abs(valueIn) < 0.0000000001) {
|
|
289
|
+
return "0";
|
|
290
|
+
}
|
|
291
|
+
let value = valueIn.toString();
|
|
292
|
+
// TODO: Do this MUCH better...
|
|
293
|
+
if (value.slice(0, -1).endsWith("00000000000")) {
|
|
294
|
+
value = value.slice(0, -1);
|
|
295
|
+
while (value.endsWith("0")) {
|
|
296
|
+
value = value.slice(0, -1);
|
|
297
|
+
}
|
|
298
|
+
if (value.endsWith(".")) {
|
|
299
|
+
value = value.slice(0, -1);
|
|
300
|
+
}
|
|
301
|
+
return value;
|
|
302
|
+
}
|
|
303
|
+
if (value.slice(0, -1).endsWith("9999999999")) {
|
|
304
|
+
value = value.slice(0, -1);
|
|
305
|
+
while (value.endsWith("9")) {
|
|
306
|
+
value = value.slice(0, -1);
|
|
307
|
+
}
|
|
308
|
+
if (value.endsWith(".")) {
|
|
309
|
+
value = value.slice(0, -1);
|
|
310
|
+
}
|
|
311
|
+
// NOTE: Interestingly enough... because we remove all trailing 9s, it means if the last number is not 9,
|
|
312
|
+
// so... we can do this hack to round up
|
|
313
|
+
value = value.slice(0, -1) + (parseInt(value.slice(-1)) + 1);
|
|
314
|
+
return value;
|
|
315
|
+
}
|
|
316
|
+
return value;
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJJbnB1dC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDZDQUFrQztBQUNsQyx5Q0FBc0M7QUFDdEMsbURBQTREO0FBbURyRCxJQUFNLEtBQUssR0FBWCxNQUFNLEtBQU0sU0FBUSxnQkFBTSxDQUFDLFNBQXFCO0lBQWhEOztRQUNILGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFbEIsU0FBSSxHQUE0QixJQUFJLENBQUM7UUFDckMsY0FBUyxHQUFZLElBQUksQ0FBQztRQUMxQixnQkFBVyxHQUFZLElBQUksQ0FBQztRQUU1QixxQkFBZ0IsR0FHWixTQUFTLENBQUM7SUE0UGxCLENBQUM7SUExUEcsTUFBTTtRQUNGLElBQUksZUFBZSxHQUE2QixFQUFFLENBQUM7UUFDbkQsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xGLElBQUksS0FBSyxHQUFHLEVBQUUsR0FBRyxXQUFXLEVBQXdDLENBQUM7UUFFckUsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDbkMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDWCxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDN0MsSUFBSSxDQUFBLGdCQUFnQixhQUFoQixnQkFBZ0IsdUJBQWhCLGdCQUFnQixDQUFFLFFBQVEsTUFBSyxRQUFRLEVBQUUsQ0FBQztvQkFDMUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHO3dCQUN2QyxRQUFRO3dCQUNSLEdBQUcsRUFBRSxJQUFBLHVC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QUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELHlHQUF5RztRQUN6Ryx5Q0FBeUM7UUFDekMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcHJlYWN0IGZyb20gXCJwcmVhY3RcIjtcbmltcG9ydCB7IGNzcyB9IGZyb20gXCJ0eXBlc2FmZWNzc1wiO1xuaW1wb3J0IHsgb2JzZXJ2ZXIgfSBmcm9tIFwiLi9vYnNlcnZlclwiO1xuaW1wb3J0IHsgdGhyb3R0bGVGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcblxuLy8gVE9ETzogQXV0b2dyb3cgbW9kZSB3aGlsZSB0eXBpbmdcblxuLy8gTk9URTogXCJ2YWx1ZVwiIGlzIG9wdGlvbmFsLiBJZiB5b3UgZG9uJ3QgcGFzcyBcInZhbHVlXCIsIHdlIHdpbGwgcHJlc2VydmUgdGhlIHZhbHVlLlxuLy8gIFRoaXMgaXMgdXNlZnVsIGZvciBpbnB1dHMgd2hpY2ggeW91IHdhbnQgdG8gcnVuIGFuIGFjdGlvbiBvbiwgc3VjaCBhcyBcImFkZCBuZXcgaXRlbVwiLFxuLy8gICAgICBhcyBpdCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhIGxvY2FsIHN0YXRlIHZhbHVlIHRvIGNhY2hlIHRoZSB2YWx1ZSwgYnkganVzdFxuLy8gICAgICBkb2luZyB0aGUgYWRkIG9uIFwib25DaGFuZ2VWYWx1ZVwiLlxuLy8gSU1QT1JUQU5UISBJbnB1dFByb3BzIGlzIGluIGJvdGggSW5wdXRMYWJlbC50c3ggYW5kIElucHV0LnRzeCwgc28gdGhlIHR5cGVzIGV4cG9ydCBjb3JyZWN0bHlcbmV4cG9ydCB0eXBlIElucHV0UHJvcHMgPSAoXG4gICAgcHJlYWN0LkpTWC5IVE1MQXR0cmlidXRlczxIVE1MSW5wdXRFbGVtZW50PlxuICAgICYge1xuICAgICAgICAvKiogT05MWSB0aHJvdHRsZXMgb25DaGFuZ2VWYWx1ZSAqL1xuICAgICAgICB0aHJvdHRsZT86IG51bWJlcjtcblxuICAgICAgICBmbGF2b3I/OiBcImxhcmdlXCIgfCBcInNtYWxsXCIgfCBcIm5vbmVcIjtcbiAgICAgICAgZm9jdXNPbk1vdW50PzogYm9vbGVhbjtcbiAgICAgICAgdGV4dGFyZWE/OiBib29sZWFuO1xuICAgICAgICAvKiogVXBkYXRlIG9uIGtleSBzdHJva2UsIG5vdCBvbiBibHVyIChqdXN0IGRvZXMgb25JbnB1dCA9IG9uQ2hhbmdlLCBhcyBvbklucHV0IGFscmVhZHkgZG9lcyB0aGlzKSAqL1xuICAgICAgICBob3Q/OiBib29sZWFuO1xuICAgICAgICAvKiogVXBkYXRlcyBhcnJvdyBrZXlzIHdpdGggbW9kaWZpZXIgYmVoYXZpb3IgdG8gdXNlIGxhcmdlciBudW1iZXJzLCBpbnN0ZWFkIG9mIGRlY2ltYWxzLiAqL1xuICAgICAgICBpbnRlZ2VyPzogYm9vbGVhbjtcblxuICAgICAgICAvKiogT25seSB3b3JrcyB3aXRoIG51bWJlci9pbnRlZ2VyICovXG4gICAgICAgIHJldmVyc2VBcnJvd0tleURpcmVjdGlvbj86IGJvb2xlYW47XG5cbiAgICAgICAgaW5wdXRSZWY/OiAoeDogSFRNTElucHV0RWxlbWVudCB8IG51bGwpID0+IHZvaWQ7XG4gICAgICAgIC8qKiBEb24ndCBibHVyIG9uIGVudGVyIGtleSAqL1xuICAgICAgICBub0VudGVyS2V5Qmx1cj86IGJvb2xlYW47XG4gICAgICAgIG5vRm9jdXNTZWxlY3Q/OiBib29sZWFuO1xuICAgICAgICBpbnB1dEtleT86IHN0cmluZztcbiAgICAgICAgZmlsbFdpZHRoPzogYm9vbGVhbjtcblxuXG4gICAgICAgIGF1dG9jb21wbGV0ZVZhbHVlcz86IHN0cmluZ1tdO1xuXG4gICAgICAgIC8qKiBGb3JjZXMgdGhlIGlucHV0IHRvIHVwZGF0ZSB3aGVuIGZvY3VzZWQuIFVzdWFsbHkgd2UgaG9sZCB1cGRhdGVzLCB0byBwcmV2ZW50IHRoZSB1c2VyJ3NcbiAgICAgICAgICogICAgICB0eXBpbmcgdG8gYmUgaW50ZXJydXB0ZWQgYnkgYmFja2dyb3VuZCB1cGRhdGVzLlxuICAgICAgICAgKiAgICAgIE5PVEU6IFwiaG90XCIgaXMgdXN1YWxseSByZXF1aXJlZCB3aGVuIHVzaW5nIHRoaXMuXG4gICAgICAgICAqL1xuICAgICAgICBmb3JjZUlucHV0VmFsdWVVcGRhdGVzV2hlbkZvY3VzZWQ/OiBib29sZWFuO1xuXG4gICAgICAgIC8vIE5PVEU6IFdlIHRyaWdnZXIgb25DaGFuZ2UgKGFuZCBvbkNoYW5nZVZhbHVlKSB3aGVuZXZlclxuICAgICAgICAvLyAgICAgIGUuY3RybEtleSAmJiAoZS5jb2RlLnN0YXJ0c1dpdGgoXCJLZXlcIikgfHwgZS5jb2RlID09PSBcIkVudGVyXCIpIHx8IGUuY29kZSA9PT0gXCJFbnRlclwiICYmIGUuc2hpZnRLZXlcbiAgICAgICAgLy8gIFRoaXMgaXMgYmVjYXVzZSBjdHJsIHVzdWFsbHkgbWVhbnMgYSBob3RrZXksIGFuZCBob3RrZXlzIHVzdWFsbHkgd2FudCBjb21taXR0ZWQgdmFsdWVzLlxuICAgICAgICBvbkNoYW5nZVZhbHVlPzogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgfVxuKTtcblxuXG5Ab2JzZXJ2ZXJcbmV4cG9ydCBjbGFzcyBJbnB1dCBleHRlbmRzIHByZWFjdC5Db21wb25lbnQ8SW5wdXRQcm9wcz4ge1xuICAgIG9uRm9jdXNUZXh0ID0gXCJcIjtcbiAgICBmaXJzdEZvY3VzID0gdHJ1ZTtcblxuICAgIGVsZW06IEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsYXN0VmFsdWU6IHVua25vd24gPSBudWxsO1xuICAgIGxhc3RDaGVja2VkOiB1bmtub3duID0gbnVsbDtcblxuICAgIG9uQ2hhbmdlVGhyb3R0bGU6IHVuZGVmaW5lZCB8IHtcbiAgICAgICAgdGhyb3R0bGU6IG51bWJlcjtcbiAgICAgICAgcnVuOiAobmV3VmFsdWU6IHN0cmluZykgPT4gdm9pZDtcbiAgICB9ID0gdW5kZWZpbmVkO1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgZmxhdm9yT3ZlcnJpZGVzOiBwcmVhY3QuSlNYLkNTU1Byb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgY29uc3QgeyBmbGF2b3IsIHRleHRhcmVhLCBob3QsIGlucHV0S2V5LCBmaWxsV2lkdGgsIC4uLm5hdGl2ZVByb3BzIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgcHJvcHMgPSB7IC4uLm5hdGl2ZVByb3BzIH0gYXMgcHJlYWN0LlJlbmRlcmFibGVQcm9wczxJbnB1dFByb3BzPjtcblxuICAgICAgICBpZiAocHJvcHMub25DaGFuZ2VWYWx1ZSkge1xuICAgICAgICAgICAgbGV0IHRocm90dGxlID0gdGhpcy5wcm9wcy50aHJvdHRsZTtcbiAgICAgICAgICAgIGlmICh0aHJvdHRsZSkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZ1Rocm90dGxlID0gdGhpcy5vbkNoYW5nZVRocm90dGxlO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rocm90dGxlPy50aHJvdHRsZSAhPT0gdGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUaHJvdHRsZSA9IHRoaXMub25DaGFuZ2VUaHJvdHRsZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuOiB0aHJvdHRsZUZ1bmN0aW9uKHRocm90dGxlLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlVmFsdWU/LihuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9wcy5vbkNoYW5nZVZhbHVlID0gZXhpc3RpbmdUaHJvdHRsZS5ydW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZsYXZvciA9PT0gXCJsYXJnZVwiKSB7XG4gICAgICAgICAgICBmbGF2b3JPdmVycmlkZXMgPSB7XG4gICAgICAgICAgICAgICAgZm9udFNpemU6IDE4LFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMTBweCAxNXB4XCIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHByb3BzLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuICAgICAgICAgICAgICAgIGZsYXZvck92ZXJyaWRlcy53aWR0aCA9IDE2O1xuICAgICAgICAgICAgICAgIGZsYXZvck92ZXJyaWRlcy5oZWlnaHQgPSAxNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxhdm9yID09PSBcInNtYWxsXCIpIHtcbiAgICAgICAgICAgIGZsYXZvck92ZXJyaWRlcyA9IHtcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogMTIsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogXCI1cHggMTBweFwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElNUE9SVEFOVCEgV2hlbiBmb2N1c2VkLCBwcmVzZXJ2ZSB0aGUgaW5wdXQgdmFsdWUsIG90aGVyd2lzZSB0eXBpbmcgaXMgYW5ub3lpbmcuXG4gICAgICAgIC8vICBUaGlzIGRvZXNuJ3QgdXN1YWxseSBoYXBwZW4sIGJ1dCBjYW4gaWYgYmFja2dyb3VuZCB0YXNrcyBhcmUgdXBkYXRpbmcgdGhlIFVJXG4gICAgICAgIC8vICB3aGlsZSB0aGUgdXNlciBpcyB0eXBpbmcuXG5cblxuICAgICAgICBsZXQgYXR0cmlidXRlczogcHJlYWN0LkpTWC5IVE1MQXR0cmlidXRlczxIVE1MSW5wdXRFbGVtZW50PiA9IHtcbiAgICAgICAgICAgIC4uLm5hdGl2ZVByb3BzLFxuICAgICAgICAgICAga2V5OiBpbnB1dEtleSB8fCBcImlucHV0XCIsXG4gICAgICAgICAgICByZWY6IHggPT4ge1xuICAgICAgICAgICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbSA9IHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh4ICYmIHByb3BzLmZvY3VzT25Nb3VudCAmJiB0aGlzLmZpcnN0Rm9jdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJzdEZvY3VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgeC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlZiA9IHByb3BzLmlucHV0UmVmO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmKHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGFzczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiAoXG4gICAgICAgICAgICAgICAgKHByb3BzLmNsYXNzTmFtZSB8fCBwcm9wcy5jbGFzcyB8fCBcIiBcIilcbiAgICAgICAgICAgICAgICArIGNzcy5kaXNwbGF5KFwiZmxleFwiLCBcInNvZnRcIilcbiAgICAgICAgICAgICAgICAgICAgLm91dGxpbmUoXCIzcHggc29saWQgaHNsKDIwNCwgMTAwJSwgNTAlKVwiLCBcImZvY3VzXCIsIFwic29mdFwiKVxuICAgICAgICAgICAgICAgICsgKGZpbGxXaWR0aCAmJiBjc3MuZmlsbFdpZHRoKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgLi4uZmxhdm9yT3ZlcnJpZGVzLFxuICAgICAgICAgICAgICAgIC4uLnByb3BzLnN0eWxlIGFzIGFueSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkZvY3VzOiBlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcHMudHlwZSA9PT0gXCJjaGVja2JveFwiKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5vbkZvY3VzVGV4dCA9IGUuY3VycmVudFRhcmdldC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIXByb3BzLm5vRm9jdXNTZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnNlbGVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9wcy5vbkZvY3VzPy4oZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25CbHVyOiBlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcHMudHlwZSA9PT0gXCJjaGVja2JveFwiKSByZXR1cm47XG4gICAgICAgICAgICAgICAgcHJvcHMub25CbHVyPy4oZSk7XG4gICAgICAgICAgICAgICAgaWYgKGUuY3VycmVudFRhcmdldC52YWx1ZSA9PT0gdGhpcy5sYXN0VmFsdWUgJiYgZS5jdXJyZW50VGFyZ2V0LmNoZWNrZWQgPT09IHRoaXMubGFzdENoZWNrZWQgJiYgaG90KSByZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBlLmN1cnJlbnRUYXJnZXQudmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0Q2hlY2tlZCA9IGUuY3VycmVudFRhcmdldC5jaGVja2VkO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBwcm9wcy5vbklucHV0Py4oZSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHByb3BzLm9uQ2hhbmdlPy4oZSkgfHwgcmVzdWx0O1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHByb3BzLm9uQ2hhbmdlVmFsdWU/LihlLmN1cnJlbnRUYXJnZXQudmFsdWUpIHx8IHJlc3VsdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcHMudHlwZSAhPT0gXCJjaGVja2JveFwiICYmIGUuY3VycmVudFRhcmdldC52YWx1ZSA9PT0gdGhpcy5sYXN0VmFsdWUgJiYgZS5jdXJyZW50VGFyZ2V0LmNoZWNrZWQgPT09IHRoaXMubGFzdENoZWNrZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IGUuY3VycmVudFRhcmdldC52YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RDaGVja2VkID0gZS5jdXJyZW50VGFyZ2V0LmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDogdW5rbm93biA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoIXByb3BzLm9uQ2hhbmdlVmFsdWUgfHwgaG90KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHByb3BzLm9uQ2hhbmdlPy4oZSkgfHwgcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaG90KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHByb3BzLm9uQ2hhbmdlVmFsdWU/LihlLmN1cnJlbnRUYXJnZXQudmFsdWUpIHx8IHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbktleURvd246IGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyBpZiAodGV4dGFyZWEgJiYgZS5jb2RlID09PSBcIlRhYlwiKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy8gSW5qZWN0IDQgc3BhY2VzIGludG8gdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAvLyAgICAgbGV0IGVsZW0gPSBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCB2YWx1ZSA9IGVsZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCBzdGFydCA9IGVsZW0uc2VsZWN0aW9uU3RhcnQgPz8gZWxlbS52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCBlbmQgPSBlbGVtLnNlbGVjdGlvbkVuZCA/PyBlbGVtLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAvLyAgICAgZWxlbS52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0KSArIFwiICAgIFwiICsgdmFsdWUuc2xpY2UoZW5kKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgZWxlbS5zZWxlY3Rpb25TdGFydCA9IGVsZW0uc2VsZWN0aW9uRW5kID0gc3RhcnQgKyA0O1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIHByb3BzLm9uS2V5RG93bj8uKGUpO1xuICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IFwiRW50ZXJcIiAmJiBlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LmJsdXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNhbGxiYWNrID0gcHJvcHMub25JbnB1dDtcbiAgICAgICAgICAgICAgICBpZiAoIWNhbGxiYWNrICYmIGhvdCkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHByb3BzLm9uQ2hhbmdlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdGFiIHRvIDQgc3BhY2VzXG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gXCJUYWJcIiAmJiB0ZXh0YXJlYSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtID0gZS5jdXJyZW50VGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBlbGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBlbGVtLnNlbGVjdGlvblN0YXJ0ID8/IGVsZW0udmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gZWxlbS5zZWxlY3Rpb25FbmQgPz8gZWxlbS52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0udmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBzdGFydCkgKyBcIiAgICBcIiArIHZhbHVlLnNsaWNlKGVuZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uU3RhcnQgPSBlbGVtLnNlbGVjdGlvbkVuZCA9IHN0YXJ0ICsgNDtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s/LihlIGFzIHVua25vd24gYXMgcHJlYWN0LkpTWC5UYXJnZXRlZElucHV0RXZlbnQ8SFRNTElucHV0RWxlbWVudD4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVsZW0gJiYgcHJvcHMudHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGVsdGEgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFnbml0dWRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcy5pbnRlZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnbml0dWRlID0gMTA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZ25pdHVkZSA9IDAuMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcIkFycm93VXBcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBtYWduaXR1ZGU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5jb2RlID09PSBcIkFycm93RG93blwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IC1tYWduaXR1ZGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BzLnJldmVyc2VBcnJvd0tleURpcmVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKj0gLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3VmFsdWUgPSBNYXRoLnJvdW5kKCgoK3RoaXMuZWxlbS52YWx1ZSB8fCAwKSArIGRlbHRhKSAqIDEwMCkgLyAxMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQudmFsdWUgPSBuZXdWYWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s/LihlIGFzIHVua25vd24gYXMgcHJlYWN0LkpTWC5UYXJnZXRlZElucHV0RXZlbnQ8SFRNTElucHV0RWxlbWVudD4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCB7IG5vRW50ZXJLZXlCbHVyLCBvbklucHV0LCBvbkNoYW5nZSB9ID0gcHJvcHM7XG4gICAgICAgICAgICAgICAgLy8gRGV0YWNoIGZyb20gdGhlIHN5bmNlZCBmdW5jdGlvbiwgdG8gcHJldmVudCBkb3VibGUgY2FsbHMuIFRoaXMgaXMgaW1wb3J0YW50LCBhcyBhcHBhcmVudGx5IC5ibHVyKClcbiAgICAgICAgICAgICAgICAvLyAgc3luY2hyb25vdXNseSB0cmlnZ2VycyBvbkNoYW5nZSwgQlVULCBvbmx5IGlmIHRoZSBpbnB1dCBpcyBjaGFuZ2luZyB0aGUgZmlyc3QgdGltZS4gV2hpY2ggbWVhbnNcbiAgICAgICAgICAgICAgICAvLyAgaWYgdGhpcyBmdW5jdGlvbiByZXJ1bnMsIGl0IHdvbid0IHRyaWdnZXIgdGhlIGNoYW5nZSBhZ2Fpbi4gRGV0YWNoaW5nIGl0IGNhdXNlcyBhbnkgdHJpZ2dlcmVkXG4gICAgICAgICAgICAgICAgLy8gIGZ1bmN0aW9ucyB0byBiZWNvbWUgcm9vdCBzeW5jZWQgZnVuY3Rpb25zLCB3aGljaCB3aWxsIGFsbG93IHRoZW0gdG8gY29ycmVjdGx5IHJ1biB0aGUgc3luYyBsb29wLlxuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5yZXNvbHZlKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoYW5nZWQgPSBlLmN1cnJlbnRUYXJnZXQudmFsdWUgIT09IHRoaXMub25Gb2N1c1RleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQudmFsdWUgPSB0aGlzLm9uRm9jdXNUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbklucHV0Py4oZSBhcyB1bmtub3duIGFzIHByZWFjdC5KU1guVGFyZ2V0ZWRJbnB1dEV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT8uKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5ibHVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub0VudGVyS2V5Qmx1ciAmJiBlLmNvZGUgPT09IFwiRW50ZXJcIiAmJiAoIXRleHRhcmVhIHx8IGUuc2hpZnRLZXkgfHwgZS5jdHJsS2V5KSB8fCBwcm9wcy5hdXRvY29tcGxldGVWYWx1ZXMgJiYgZS5jb2RlID09PSBcIlRhYlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQuYmx1cigpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuY3RybEtleSAmJiAoZS5jb2RlLnN0YXJ0c1dpdGgoXCJLZXlcIikgfHwgZS5jb2RlID09PSBcIkVudGVyXCIpIHx8IGUuc2hpZnRLZXkgJiYgZS5jb2RlID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPy4oZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbklucHV0OiBlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcHMuYXV0b2NvbXBsZXRlVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLmlucHV0VHlwZSA9PT0gXCJpbnNlcnRUZXh0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJWYWx1ZSA9IGUuY3VycmVudFRhcmdldC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gcHJvcHMuYXV0b2NvbXBsZXRlVmFsdWVzLmZpbmQoeCA9PiB4LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChjdXJWYWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnZhbHVlID0gbWF0Y2ggfHwgXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIHBhcnQgYWZ0ZXIgdGhlIHByZXZpb3VzIG1hdGNoLCBzbyB3aGVuIHRoZXkgdHlwZSwgdGhleSBjbG9iYmVyIHRoZSBtYXRjaCBwYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gY3VyVmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmQgPSBlLmN1cnJlbnRUYXJnZXQudmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zZWxlY3Rpb25FbmQgPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvcHMub25JbnB1dD8uKGUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuXG4gICAgICAgIGlmIChcInZhbHVlXCIgaW4gcHJvcHMgJiYgcHJvcHMudHlwZSAhPT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgICAgICBsZXQgZWxlbSA9IHRoaXMuZWxlbTtcbiAgICAgICAgICAgIGxldCBuZXdWYWx1ZSA9IHByb3BzLnZhbHVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnByb3BzLmZvcmNlSW5wdXRWYWx1ZVVwZGF0ZXNXaGVuRm9jdXNlZCAmJiBlbGVtICYmIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IGVsZW0udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IFN0cmluZyhwcm9wcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwiY2hlY2tlZFwiIGluIHByb3BzKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RDaGVja2VkID0gISFwcm9wcy5jaGVja2VkO1xuICAgICAgICB9XG5cblxuICAgICAgICBpZiAoYXR0cmlidXRlcy50eXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAvLyBGaXggc3R1ZmYgbGlrZSA1NS4wMDAwMDAwMDAwMDAwMVxuICAgICAgICAgICAgbGV0IHZhbHVlID0gYXR0cmlidXRlcy52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG5pY2VOdW1iZXJTdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgZG8gbnVtYmVyIGhhbmRsaW5nIG91cnNlbHZlc1xuICAgICAgICBpZiAoYXR0cmlidXRlc1tcInR5cGVcIl0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzW1widHlwZVwiXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wcy50eXBlID09PSBcImNoZWNrYm94XCIpIHtcblxuICAgICAgICB9IGVsc2UgaWYgKGhvdCkge1xuICAgICAgICAgICAgYXR0cmlidXRlcy5vbklucHV0ID0gYXR0cmlidXRlcy5vbkNoYW5nZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlIHVzZSBvbkNoYW5nZSBmcm9tIG9uQmx1ciwgc28gZG9uJ3QgdXNlIHRoZSBvbkNoYW5nZSBoYW5kbGVyLCBhcyBwcmVhY3Qgd2lsbCBob29rIHRoaXMgdXBcbiAgICAgICAgICAgIC8vICB3aXRoIG9uSW5wdXQsIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gdHJpZ2dlciBhcyBpZiB0aGUgY29tcG9uZW50IGlzIGhvdCFcbiAgICAgICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLm9uQ2hhbmdlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0YXJlYSkge1xuICAgICAgICAgICAgcmV0dXJuIDx0ZXh0YXJlYSB7Li4uYXR0cmlidXRlcyBhcyBhbnl9IC8+O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDxpbnB1dCB7Li4uYXR0cmlidXRlc30gLz47XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuZnVuY3Rpb24gbmljZU51bWJlclN0cmluZ2lmeSh2YWx1ZUluOiBudW1iZXIpIHtcbiAgICBpZiAoTWF0aC5hYnModmFsdWVJbikgPCAwLjAwMDAwMDAwMDEpIHtcbiAgICAgICAgcmV0dXJuIFwiMFwiO1xuICAgIH1cbiAgICBsZXQgdmFsdWUgPSB2YWx1ZUluLnRvU3RyaW5nKCk7XG4gICAgLy8gVE9ETzogRG8gdGhpcyBNVUNIIGJldHRlci4uLlxuICAgIGlmICh2YWx1ZS5zbGljZSgwLCAtMSkuZW5kc1dpdGgoXCIwMDAwMDAwMDAwMFwiKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgd2hpbGUgKHZhbHVlLmVuZHNXaXRoKFwiMFwiKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLmVuZHNXaXRoKFwiLlwiKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUuc2xpY2UoMCwgLTEpLmVuZHNXaXRoKFwiOTk5OTk5OTk5OVwiKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgd2hpbGUgKHZhbHVlLmVuZHNXaXRoKFwiOVwiKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLmVuZHNXaXRoKFwiLlwiKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTk9URTogSW50ZXJlc3RpbmdseSBlbm91Z2guLi4gYmVjYXVzZSB3ZSByZW1vdmUgYWxsIHRyYWlsaW5nIDlzLCBpdCBtZWFucyBpZiB0aGUgbGFzdCBudW1iZXIgaXMgbm90IDksXG4gICAgICAgIC8vICBzby4uLiB3ZSBjYW4gZG8gdGhpcyBoYWNrIHRvIHJvdW5kIHVwXG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgLTEpICsgKHBhcnNlSW50KHZhbHVlLnNsaWNlKC0xKSkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4iXX0=
|
|
319
|
+
/* _JS_SOURCE_HASH = "ead59135606a7adefa7e3d0c8ca818085281ac9c57be874a210a55d6ecc8b305"; */
|