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.
@@ -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
- }, { maxRetries: config.retries || 3 })();
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.23",
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"; */