@kittycad/web-view 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.js +145 -2729
  2. package/index.js.map +7 -1
  3. package/package.json +1 -1
package/index.js CHANGED
@@ -1,2737 +1,153 @@
1
1
  "use strict";
2
- var kittycadWebWiew = (() => {
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __require = /* @__PURE__ */ ((x2) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x2, {
8
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
9
- }) : x2)(function(x2) {
10
- if (typeof require !== "undefined") return require.apply(this, arguments);
11
- throw Error('Dynamic require of "' + x2 + '" is not supported');
12
- });
13
- var __export = (target, all) => {
14
- for (var name in all)
15
- __defProp(target, name, { get: all[name], enumerable: true });
16
- };
17
- var __copyProps = (to, from, except, desc) => {
18
- if (from && typeof from === "object" || typeof from === "function") {
19
- for (let key of __getOwnPropNames(from))
20
- if (!__hasOwnProp.call(to, key) && key !== except)
21
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
22
- }
23
- return to;
24
- };
25
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
26
29
 
27
- // src/index.ts
28
- var index_exports = {};
29
- __export(index_exports, {
30
- ZooWebView: () => ZooWebView
31
- });
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ ZooWebView: () => ZooWebView
34
+ });
35
+ module.exports = __toCommonJS(index_exports);
36
+ var zoo = __toESM(require("@kittycad/lib"));
32
37
 
33
- // node_modules/@kittycad/oauth2-auth-code-pkce/index.js
34
- var Stage;
35
- (function(Stage2) {
36
- Stage2[Stage2["Initial"] = 0] = "Initial";
37
- Stage2[Stage2["GoingToAuthServer"] = 1] = "GoingToAuthServer";
38
- Stage2[Stage2["ReturnedFromAuthServer"] = 2] = "ReturnedFromAuthServer";
39
- Stage2[Stage2["AuthCodeBeenExchangedForAccessToken"] = 3] = "AuthCodeBeenExchangedForAccessToken";
40
- Stage2[Stage2["NeedsRefresh"] = 4] = "NeedsRefresh";
41
- Stage2[Stage2["Fetching"] = 5] = "Fetching";
42
- Stage2[Stage2["Authenticated"] = 6] = "Authenticated";
43
- })(Stage || (Stage = {}));
44
- var EErrorOAuth2;
45
- (function(EErrorOAuth22) {
46
- EErrorOAuth22["ErrorUnknown"] = "ErrorUnknown";
47
- EErrorOAuth22["ErrorNoAuthCode"] = "ErrorNoAuthCode";
48
- EErrorOAuth22["ErrorInvalidReturnedStateParam"] = "ErrorInvalidReturnedStateParam";
49
- EErrorOAuth22["ErrorInvalidJson"] = "ErrorInvalidJson";
50
- EErrorOAuth22["ErrorInvalidScope"] = "ErrorInvalidScope";
51
- EErrorOAuth22["ErrorInvalidRequest"] = "ErrorInvalidRequest";
52
- EErrorOAuth22["ErrorInvalidToken"] = "ErrorInvalidToken";
53
- EErrorOAuth22["ErrorAuthenticationGrant"] = "ErrorAuthenticationGrant";
54
- EErrorOAuth22["ErrorAccessTokenResponse"] = "ErrorAccessTokenResponse";
55
- })(EErrorOAuth2 || (EErrorOAuth2 = {}));
56
- var EErrorAuthenticationGrant;
57
- (function(EErrorAuthenticationGrant2) {
58
- EErrorAuthenticationGrant2["ErrorUnauthorizedClient"] = "ErrorUnauthorizedClient";
59
- EErrorAuthenticationGrant2["ErrorAccessDenied"] = "ErrorAccessDenied";
60
- EErrorAuthenticationGrant2["ErrorUnsupportedResponseType"] = "ErrorUnsupportedResponseType";
61
- EErrorAuthenticationGrant2["ErrorServerError"] = "ErrorServerError";
62
- EErrorAuthenticationGrant2["ErrorTemporarilyUnavailable"] = "ErrorTemporarilyUnavailable";
63
- })(EErrorAuthenticationGrant || (EErrorAuthenticationGrant = {}));
64
- var EErrorAccessTokenResponse;
65
- (function(EErrorAccessTokenResponse2) {
66
- EErrorAccessTokenResponse2["ErrorInvalidClient"] = "ErrorInvalidClient";
67
- EErrorAccessTokenResponse2["ErrorInvalidGrant"] = "ErrorInvalidGrant";
68
- EErrorAccessTokenResponse2["ErrorUnsupportedGrantType"] = "ErrorUnsupportedGrantType";
69
- })(EErrorAccessTokenResponse || (EErrorAccessTokenResponse = {}));
70
- var RawErrorToOAuth2ErrorTypeMap = {
71
- invalid_json: {
72
- kind: EErrorOAuth2.ErrorInvalidJson
73
- },
74
- invalid_scope: {
75
- kind: EErrorOAuth2.ErrorInvalidScope
76
- },
77
- invalid_request: {
78
- kind: EErrorOAuth2.ErrorInvalidRequest
79
- },
80
- invalid_token: {
81
- kind: EErrorOAuth2.ErrorInvalidToken
82
- },
83
- invalid_grant: {
84
- kind: EErrorOAuth2.ErrorAccessTokenResponse,
85
- value: EErrorAccessTokenResponse.ErrorInvalidGrant
86
- },
87
- unauthorized_client: {
88
- kind: EErrorOAuth2.ErrorAuthenticationGrant,
89
- value: EErrorAuthenticationGrant.ErrorUnauthorizedClient
90
- },
91
- access_denied: {
92
- kind: EErrorOAuth2.ErrorAuthenticationGrant,
93
- value: EErrorAuthenticationGrant.ErrorAccessDenied
94
- },
95
- unsupported_response_type: {
96
- kind: EErrorOAuth2.ErrorAuthenticationGrant,
97
- value: EErrorAuthenticationGrant.ErrorUnsupportedResponseType
98
- },
99
- server_error: {
100
- kind: EErrorOAuth2.ErrorAuthenticationGrant,
101
- value: EErrorAuthenticationGrant.ErrorServerError
102
- },
103
- temporarily_unavailable: {
104
- kind: EErrorOAuth2.ErrorAuthenticationGrant,
105
- value: EErrorAuthenticationGrant.ErrorTemporarilyUnavailable
106
- },
107
- invalid_client: {
108
- kind: EErrorOAuth2.ErrorAccessTokenResponse,
109
- value: EErrorAccessTokenResponse.ErrorInvalidClient
110
- },
111
- unsupported_grant_type: {
112
- kind: EErrorOAuth2.ErrorAccessTokenResponse,
113
- value: EErrorAccessTokenResponse.ErrorUnsupportedGrantType
114
- }
115
- };
116
- var LOCALSTORAGE_ID = `oauth2authcodepkce`;
117
- var LOCALSTORAGE_STATE = `${LOCALSTORAGE_ID}-state`;
38
+ // src/svg-zoo.ts
39
+ var svg_zoo_default = '<svg viewBox="0 -2 245 84" fill="none" xmlns="http://www.w3.org/2000/svg"><g><path fill="currentcolor" d="M49.1899 14.2024V1.75536H0.0079789V19.3089H44.4824L0.0159578 67.5334H0.0079789V67.5414L0 67.5493L0.0079789 67.5573V79.3501H11.4018L22.8755 66.903V79.3501H72.0574V61.7965H27.591L72.0574 13.5641V1.75536L60.6556 1.77131L49.1899 14.2024Z"></path><path fill="currentcolor" fill-rule="evenodd" clip-rule="evenodd" d="M116.723 17.5536C103.981 17.5536 93.6164 27.9182 93.6164 40.6605C93.6164 45.751 95.276 50.4665 98.0846 54.2884L86.0205 67.2781C79.8129 60.1369 76.0628 50.8256 76.0628 40.6605C76.0628 18.2398 94.3026 0 116.723 0C125.819 0 134.221 3.00007 141.003 8.06666L128.939 21.0563C125.396 18.8382 121.207 17.5536 116.723 17.5536ZM139.83 40.6605C139.83 35.5699 138.171 30.8544 135.37 27.0245L147.426 14.0349C153.634 21.176 157.384 30.4874 157.384 40.6605C157.384 63.0732 139.144 81.3129 116.723 81.3129C107.627 81.3129 99.2256 78.3129 92.4435 73.2542L104.516 60.2566C108.058 62.4748 112.239 63.7594 116.723 63.7594C129.466 63.7594 139.83 53.3948 139.83 40.6605Z"></path><path fill="currentcolor" fill-rule="evenodd" clip-rule="evenodd" d="M204.34 17.5536C191.597 17.5536 181.233 27.9182 181.233 40.6605C181.233 45.751 182.892 50.4665 185.701 54.2884L173.637 67.2781C167.429 60.1369 163.679 50.8256 163.679 40.6605C163.679 18.2398 181.919 0 204.34 0C213.435 0 221.837 3.00007 228.619 8.06666L216.555 21.0563C213.013 18.8382 208.824 17.5536 204.34 17.5536ZM222.986 27.0245L235.042 14.0349C241.25 21.176 245 30.4874 245 40.6605C245 63.0732 226.76 81.3129 204.34 81.3129C195.244 81.3129 186.842 78.3129 180.06 73.2542L192.132 60.2566C195.674 62.4748 199.855 63.7594 204.34 63.7594C217.082 63.7594 227.446 53.3948 227.446 40.6605C227.446 35.5699 225.787 30.8544 222.986 27.0245Z"></path></g></svg>';
118
40
 
119
- // node_modules/@kittycad/lib/dist/mjs/index.js
120
- try {
121
- if ("undefined" == typeof fetch && "undefined" != typeof process && process.versions?.node) {
122
- new Function("m", "return import(m)")("cross-fetch/polyfill").catch((() => {
123
- }));
124
- }
125
- } catch {
126
- }
127
- function i(t) {
128
- const e = new URLSearchParams();
129
- for (const [n2, l] of Object.entries(t)) if (void 0 !== l) if (Array.isArray(l)) for (const t2 of l) e.append(n2, String(t2));
130
- else e.append(n2, String(l));
131
- const n = e.toString();
132
- return n ? `?${n}` : "";
133
- }
134
- try {
135
- if ("undefined" != typeof process && process.versions?.node && "win32" === process.platform) {
136
- new Function("m", "return import(m)")("win-ca");
137
- }
138
- } catch {
139
- }
140
- var u = (() => {
141
- const t = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Uint8Array.prototype), Symbol.toStringTag).get;
142
- return (e) => t.call(e);
143
- })();
144
- function h(t) {
145
- return "Uint8Array" === u(t);
146
- }
147
- function p(t) {
148
- return "object" == typeof t && null != t && Symbol.toStringTag in t && ("ArrayBuffer" === t[Symbol.toStringTag] || "SharedArrayBuffer" === t[Symbol.toStringTag]);
149
- }
150
- function y(t) {
151
- return t instanceof RegExp || "[object RegExp]" === Object.prototype.toString.call(t);
152
- }
153
- function X(t) {
154
- return "object" == typeof t && null != t && Symbol.toStringTag in t && "Map" === t[Symbol.toStringTag];
155
- }
156
- function G(t) {
157
- return t instanceof Date || "[object Date]" === Object.prototype.toString.call(t);
158
- }
159
- function V(t, e) {
160
- return JSON.stringify(t, ((t2, e2) => "bigint" == typeof e2 ? { $numberLong: `${e2}` } : X(e2) ? Object.fromEntries(e2) : e2));
161
- }
162
- var W = 7;
163
- var f = /* @__PURE__ */ Symbol.for("@@mdb.bson.version");
164
- var g = 2147483647;
165
- var Y = -2147483648;
166
- var I = Math.pow(2, 63) - 1;
167
- var R = -Math.pow(2, 63);
168
- var J = Math.pow(2, 53);
169
- var S = -Math.pow(2, 53);
170
- var K = 1;
171
- var T = 2;
172
- var L = 3;
173
- var z = 4;
174
- var x = 5;
175
- var U = 6;
176
- var N = 7;
177
- var w = 8;
178
- var k = 9;
179
- var H = 10;
180
- var C = 11;
181
- var B = 12;
182
- var v = 13;
183
- var j = 14;
184
- var M = 15;
185
- var P = 16;
186
- var F = 17;
187
- var Q = 18;
188
- var O = 19;
189
- var E = 255;
190
- var _ = 127;
191
- var D = 0;
192
- var A = 4;
193
- var $ = Object.freeze({ double: 1, string: 2, object: 3, array: 4, binData: 5, undefined: 6, objectId: 7, bool: 8, date: 9, null: 10, regex: 11, dbPointer: 12, javascript: 13, symbol: 14, javascriptWithScope: 15, int: 16, timestamp: 17, long: 18, decimal: 19, minKey: -1, maxKey: 127 });
194
- var q = class extends Error {
195
- get bsonError() {
196
- return true;
197
- }
198
- get name() {
199
- return "BSONError";
200
- }
201
- constructor(t, e) {
202
- super(t, e);
203
- }
204
- static isBSONError(t) {
205
- return null != t && "object" == typeof t && "bsonError" in t && true === t.bsonError && "name" in t && "message" in t && "stack" in t;
206
- }
207
- };
208
- var tt = class extends q {
209
- get name() {
210
- return "BSONVersionError";
211
- }
212
- constructor() {
213
- super(`Unsupported BSON version, bson types must be from bson ${W}.x.x`);
214
- }
215
- };
216
- var et = class extends q {
217
- get name() {
218
- return "BSONRuntimeError";
219
- }
220
- constructor(t) {
221
- super(t);
222
- }
223
- };
224
- var nt = class extends q {
225
- get name() {
226
- return "BSONOffsetError";
227
- }
228
- offset;
229
- constructor(t, e, n) {
230
- super(`${t}. offset: ${e}`, n), this.offset = e;
231
- }
232
- };
233
- var lt;
234
- var it;
235
- function ot(t, e, n, l) {
236
- if (l) {
237
- lt ??= new TextDecoder("utf8", { fatal: true });
238
- try {
239
- return lt.decode(t.subarray(e, n));
240
- } catch (t2) {
241
- throw new q("Invalid UTF-8 string in BSON document", { cause: t2 });
242
- }
243
- }
244
- return it ??= new TextDecoder("utf8", { fatal: false }), it.decode(t.subarray(e, n));
245
- }
246
- function ct(t, e, n) {
247
- if (0 === t.length) return "";
248
- const l = n - e;
249
- if (0 === l) return "";
250
- if (l > 20) return null;
251
- if (1 === l && t[e] < 128) return String.fromCharCode(t[e]);
252
- if (2 === l && t[e] < 128 && t[e + 1] < 128) return String.fromCharCode(t[e]) + String.fromCharCode(t[e + 1]);
253
- if (3 === l && t[e] < 128 && t[e + 1] < 128 && t[e + 2] < 128) return String.fromCharCode(t[e]) + String.fromCharCode(t[e + 1]) + String.fromCharCode(t[e + 2]);
254
- const i2 = [];
255
- for (let l2 = e; l2 < n; l2++) {
256
- const e2 = t[l2];
257
- if (e2 > 127) return null;
258
- i2.push(e2);
259
- }
260
- return String.fromCharCode(...i2);
261
- }
262
- function at(t) {
263
- return bt.fromNumberArray(Array.from({ length: t }, (() => Math.floor(256 * Math.random()))));
264
- }
265
- function st(t) {
266
- return crypto.getRandomValues(bt.allocate(t));
267
- }
268
- var dt = (() => {
269
- const { crypto: t } = globalThis;
270
- return null != t && "function" == typeof t.getRandomValues ? st : at;
271
- })();
272
- var bt = { isUint8Array: h, toLocalBufferType(t) {
273
- if (Buffer.isBuffer(t)) return t;
274
- if (ArrayBuffer.isView(t)) return Buffer.from(t.buffer, t.byteOffset, t.byteLength);
275
- const e = t?.[Symbol.toStringTag] ?? Object.prototype.toString.call(t);
276
- if ("ArrayBuffer" === e || "SharedArrayBuffer" === e || "[object ArrayBuffer]" === e || "[object SharedArrayBuffer]" === e) return Buffer.from(t);
277
- throw new q("Cannot create Buffer from the passed potentialBuffer.");
278
- }, allocate: (t) => Buffer.alloc(t), allocateUnsafe: (t) => Buffer.allocUnsafe(t), compare: (t, e) => bt.toLocalBufferType(t).compare(e), concat: (t) => Buffer.concat(t), copy: (t, e, n, l, i2) => bt.toLocalBufferType(t).copy(e, n ?? 0, l ?? 0, i2 ?? t.length), equals: (t, e) => bt.toLocalBufferType(t).equals(e), fromNumberArray: (t) => Buffer.from(t), fromBase64: (t) => Buffer.from(t, "base64"), fromUTF8: (t) => Buffer.from(t, "utf8"), toBase64: (t) => bt.toLocalBufferType(t).toString("base64"), fromISO88591: (t) => Buffer.from(t, "binary"), toISO88591: (t) => bt.toLocalBufferType(t).toString("binary"), fromHex: (t) => Buffer.from(t, "hex"), toHex: (t) => bt.toLocalBufferType(t).toString("hex"), toUTF8(t, e, n, l) {
279
- const i2 = n - e <= 20 ? ct(t, e, n) : null;
280
- if (null != i2) return i2;
281
- const o = bt.toLocalBufferType(t).toString("utf8", e, n);
282
- if (l) {
283
- for (let l2 = 0; l2 < o.length; l2++) if (65533 === o.charCodeAt(l2)) {
284
- ot(t, e, n, true);
285
- break;
286
- }
287
- }
288
- return o;
289
- }, utf8ByteLength: (t) => Buffer.byteLength(t, "utf8"), encodeUTF8Into(t, e, n) {
290
- const l = (function(t2, e2, n2) {
291
- if (0 === e2.length) return 0;
292
- if (e2.length > 25) return null;
293
- if (t2.length - n2 < e2.length) return null;
294
- for (let l2 = 0, i2 = n2; l2 < e2.length; l2++, i2++) {
295
- const n3 = e2.charCodeAt(l2);
296
- if (n3 > 127) return null;
297
- t2[i2] = n3;
298
- }
299
- return e2.length;
300
- })(t, e, n);
301
- return null != l ? l : bt.toLocalBufferType(t).write(e, n, void 0, "utf8");
302
- }, randomBytes: dt, swap32: (t) => bt.toLocalBufferType(t).swap32() };
303
- function Zt(t) {
304
- if (t < 0) throw new RangeError(`The argument 'byteLength' is invalid. Received ${t}`);
305
- return ut.fromNumberArray(Array.from({ length: t }, (() => Math.floor(256 * Math.random()))));
306
- }
307
- var mt = (() => {
308
- const { crypto: t } = globalThis;
309
- if (null != t && "function" == typeof t.getRandomValues) return (e) => t.getRandomValues(ut.allocate(e));
310
- if ((function() {
311
- const { navigator: t2 } = globalThis;
312
- return "object" == typeof t2 && "ReactNative" === t2.product;
313
- })()) {
314
- const { console: t2 } = globalThis;
315
- t2?.warn?.("BSON: For React Native please polyfill crypto.getRandomValues, e.g. using: https://www.npmjs.com/package/react-native-get-random-values.");
316
- }
317
- return Zt;
318
- })();
319
- var rt = /(\d|[a-f])/i;
320
- var ut = { isUint8Array: h, toLocalBufferType(t) {
321
- const e = t?.[Symbol.toStringTag] ?? Object.prototype.toString.call(t);
322
- if ("Uint8Array" === e) return t;
323
- if (ArrayBuffer.isView(t)) return new Uint8Array(t.buffer.slice(t.byteOffset, t.byteOffset + t.byteLength));
324
- if ("ArrayBuffer" === e || "SharedArrayBuffer" === e || "[object ArrayBuffer]" === e || "[object SharedArrayBuffer]" === e) return new Uint8Array(t);
325
- throw new q("Cannot make a Uint8Array from passed potentialBuffer.");
326
- }, allocate(t) {
327
- if ("number" != typeof t) throw new TypeError(`The "size" argument must be of type number. Received ${String(t)}`);
328
- return new Uint8Array(t);
329
- }, allocateUnsafe: (t) => ut.allocate(t), compare(t, e) {
330
- if (t === e) return 0;
331
- const n = Math.min(t.length, e.length);
332
- for (let l = 0; l < n; l++) {
333
- if (t[l] < e[l]) return -1;
334
- if (t[l] > e[l]) return 1;
335
- }
336
- return t.length < e.length ? -1 : t.length > e.length ? 1 : 0;
337
- }, concat(t) {
338
- if (0 === t.length) return ut.allocate(0);
339
- let e = 0;
340
- for (const n2 of t) e += n2.length;
341
- const n = ut.allocate(e);
342
- let l = 0;
343
- for (const e2 of t) n.set(e2, l), l += e2.length;
344
- return n;
345
- }, copy(t, e, n, l, i2) {
346
- if (void 0 !== i2 && i2 < 0) throw new RangeError(`The value of "sourceEnd" is out of range. It must be >= 0. Received ${i2}`);
347
- if (i2 = i2 ?? t.length, void 0 !== l && (l < 0 || l > i2)) throw new RangeError(`The value of "sourceStart" is out of range. It must be >= 0 and <= ${i2}. Received ${l}`);
348
- if (l = l ?? 0, void 0 !== n && n < 0) throw new RangeError(`The value of "targetStart" is out of range. It must be >= 0. Received ${n}`);
349
- n = n ?? 0;
350
- const o = t.subarray(l, i2), c = Math.min(o.length, e.length - n);
351
- return c <= 0 ? 0 : (e.set(o.subarray(0, c), n), c);
352
- }, equals(t, e) {
353
- if (t.byteLength !== e.byteLength) return false;
354
- for (let n = 0; n < t.byteLength; n++) if (t[n] !== e[n]) return false;
355
- return true;
356
- }, fromNumberArray: (t) => Uint8Array.from(t), fromBase64: (t) => Uint8Array.from(atob(t), ((t2) => t2.charCodeAt(0))), fromUTF8: (t) => new TextEncoder().encode(t), toBase64: (t) => btoa(ut.toISO88591(t)), fromISO88591: (t) => Uint8Array.from(t, ((t2) => 255 & t2.charCodeAt(0))), toISO88591: (t) => Array.from(Uint16Array.from(t), ((t2) => String.fromCharCode(t2))).join(""), fromHex(t) {
357
- const e = t.length % 2 == 0 ? t : t.slice(0, t.length - 1), n = [];
358
- for (let t2 = 0; t2 < e.length; t2 += 2) {
359
- const l = e[t2], i2 = e[t2 + 1];
360
- if (!rt.test(l)) break;
361
- if (!rt.test(i2)) break;
362
- const o = Number.parseInt(`${l}${i2}`, 16);
363
- n.push(o);
364
- }
365
- return Uint8Array.from(n);
366
- }, toHex: (t) => Array.from(t, ((t2) => t2.toString(16).padStart(2, "0"))).join(""), toUTF8(t, e, n, l) {
367
- const i2 = n - e <= 20 ? ct(t, e, n) : null;
368
- return null != i2 ? i2 : ot(t, e, n, l);
369
- }, utf8ByteLength: (t) => new TextEncoder().encode(t).byteLength, encodeUTF8Into(t, e, n) {
370
- const l = new TextEncoder().encode(e);
371
- return t.set(l, n), l.byteLength;
372
- }, randomBytes: mt, swap32(t) {
373
- if (t.length % 4 != 0) throw new RangeError("Buffer size must be a multiple of 32-bits");
374
- for (let e = 0; e < t.length; e += 4) {
375
- const n = t[e], l = t[e + 1], i2 = t[e + 2], o = t[e + 3];
376
- t[e] = o, t[e + 1] = i2, t[e + 2] = l, t[e + 3] = n;
377
- }
378
- return t;
379
- } };
380
- var ht = "function" == typeof Buffer && true !== Buffer.prototype?._isBuffer ? bt : ut;
381
- var pt = /* @__PURE__ */ Symbol.for("@@mdb.bson.type");
382
- var yt = class {
383
- get [pt]() {
384
- return this._bsontype;
385
- }
386
- get [f]() {
387
- return W;
388
- }
389
- [/* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom")](t, e, n) {
390
- return this.inspect(t, e, n);
391
- }
392
- };
393
- var Xt = new Float64Array(1);
394
- var Gt = new Uint8Array(Xt.buffer, 0, 8);
395
- Xt[0] = -1;
396
- var Vt = 0 === Gt[7];
397
- var Wt = { isBigEndian: Vt, getNonnegativeInt32LE(t, e) {
398
- if (t[e + 3] > 127) throw new RangeError(`Size cannot be negative at offset: ${e}`);
399
- return t[e] | t[e + 1] << 8 | t[e + 2] << 16 | t[e + 3] << 24;
400
- }, getInt32LE: (t, e) => t[e] | t[e + 1] << 8 | t[e + 2] << 16 | t[e + 3] << 24, getUint32LE: (t, e) => t[e] + 256 * t[e + 1] + 65536 * t[e + 2] + 16777216 * t[e + 3], getUint32BE: (t, e) => t[e + 3] + 256 * t[e + 2] + 65536 * t[e + 1] + 16777216 * t[e], getBigInt64LE: (t, e) => (BigInt(t[e + 4] + 256 * t[e + 5] + 65536 * t[e + 6] + (t[e + 7] << 24)) << 32n) + BigInt(t[e] + 256 * t[e + 1] + 65536 * t[e + 2] + 16777216 * t[e + 3]), getFloat64LE: Vt ? (t, e) => (Gt[7] = t[e], Gt[6] = t[e + 1], Gt[5] = t[e + 2], Gt[4] = t[e + 3], Gt[3] = t[e + 4], Gt[2] = t[e + 5], Gt[1] = t[e + 6], Gt[0] = t[e + 7], Xt[0]) : (t, e) => (Gt[0] = t[e], Gt[1] = t[e + 1], Gt[2] = t[e + 2], Gt[3] = t[e + 3], Gt[4] = t[e + 4], Gt[5] = t[e + 5], Gt[6] = t[e + 6], Gt[7] = t[e + 7], Xt[0]), setInt32BE: (t, e, n) => (t[e + 3] = n, n >>>= 8, t[e + 2] = n, n >>>= 8, t[e + 1] = n, n >>>= 8, t[e] = n, 4), setInt32LE: (t, e, n) => (t[e] = n, n >>>= 8, t[e + 1] = n, n >>>= 8, t[e + 2] = n, n >>>= 8, t[e + 3] = n, 4), setBigInt64LE(t, e, n) {
401
- const l = 0xffffffffn;
402
- let i2 = Number(n & l);
403
- t[e] = i2, i2 >>= 8, t[e + 1] = i2, i2 >>= 8, t[e + 2] = i2, i2 >>= 8, t[e + 3] = i2;
404
- let o = Number(n >> 32n & l);
405
- return t[e + 4] = o, o >>= 8, t[e + 5] = o, o >>= 8, t[e + 6] = o, o >>= 8, t[e + 7] = o, 8;
406
- }, setFloat64LE: Vt ? (t, e, n) => (Xt[0] = n, t[e] = Gt[7], t[e + 1] = Gt[6], t[e + 2] = Gt[5], t[e + 3] = Gt[4], t[e + 4] = Gt[3], t[e + 5] = Gt[2], t[e + 6] = Gt[1], t[e + 7] = Gt[0], 8) : (t, e, n) => (Xt[0] = n, t[e] = Gt[0], t[e + 1] = Gt[1], t[e + 2] = Gt[2], t[e + 3] = Gt[3], t[e + 4] = Gt[4], t[e + 5] = Gt[5], t[e + 6] = Gt[6], t[e + 7] = Gt[7], 8) };
407
- var ft = class _ft extends yt {
408
- get _bsontype() {
409
- return "Binary";
410
- }
411
- static BSON_BINARY_SUBTYPE_DEFAULT = 0;
412
- static BUFFER_SIZE = 256;
413
- static SUBTYPE_DEFAULT = 0;
414
- static SUBTYPE_FUNCTION = 1;
415
- static SUBTYPE_BYTE_ARRAY = 2;
416
- static SUBTYPE_UUID_OLD = 3;
417
- static SUBTYPE_UUID = 4;
418
- static SUBTYPE_MD5 = 5;
419
- static SUBTYPE_ENCRYPTED = 6;
420
- static SUBTYPE_COLUMN = 7;
421
- static SUBTYPE_SENSITIVE = 8;
422
- static SUBTYPE_VECTOR = 9;
423
- static SUBTYPE_USER_DEFINED = 128;
424
- static VECTOR_TYPE = Object.freeze({ Int8: 3, Float32: 39, PackedBit: 16 });
425
- buffer;
426
- sub_type;
427
- position;
428
- constructor(t, e) {
429
- if (super(), null != t && "string" == typeof t && !ArrayBuffer.isView(t) && !p(t) && !Array.isArray(t)) throw new q("Binary can only be constructed from Uint8Array or number[]");
430
- this.sub_type = e ?? _ft.BSON_BINARY_SUBTYPE_DEFAULT, null == t ? (this.buffer = ht.allocate(_ft.BUFFER_SIZE), this.position = 0) : (this.buffer = Array.isArray(t) ? ht.fromNumberArray(t) : ht.toLocalBufferType(t), this.position = this.buffer.byteLength);
431
- }
432
- put(t) {
433
- if ("string" == typeof t && 1 !== t.length) throw new q("only accepts single character String");
434
- if ("number" != typeof t && 1 !== t.length) throw new q("only accepts single character Uint8Array or Array");
435
- let e;
436
- if (e = "string" == typeof t ? t.charCodeAt(0) : "number" == typeof t ? t : t[0], e < 0 || e > 255) throw new q("only accepts number in a valid unsigned byte range 0-255");
437
- if (this.buffer.byteLength > this.position) this.buffer[this.position++] = e;
438
- else {
439
- const t2 = ht.allocate(_ft.BUFFER_SIZE + this.buffer.length);
440
- t2.set(this.buffer, 0), this.buffer = t2, this.buffer[this.position++] = e;
441
- }
442
- }
443
- write(t, e) {
444
- if (e = "number" == typeof e ? e : this.position, this.buffer.byteLength < e + t.length) {
445
- const e2 = ht.allocate(this.buffer.byteLength + t.length);
446
- e2.set(this.buffer, 0), this.buffer = e2;
447
- }
448
- if (ArrayBuffer.isView(t)) this.buffer.set(ht.toLocalBufferType(t), e), this.position = e + t.byteLength > this.position ? e + t.length : this.position;
449
- else if ("string" == typeof t) throw new q("input cannot be string");
450
- }
451
- read(t, e) {
452
- const n = t + (e = e && e > 0 ? e : this.position);
453
- return this.buffer.subarray(t, n > this.position ? this.position : n);
454
- }
455
- value() {
456
- return this.buffer.length === this.position ? this.buffer : this.buffer.subarray(0, this.position);
457
- }
458
- length() {
459
- return this.position;
460
- }
461
- toJSON() {
462
- return ht.toBase64(this.buffer.subarray(0, this.position));
463
- }
464
- toString(t) {
465
- return "hex" === t ? ht.toHex(this.buffer.subarray(0, this.position)) : "base64" === t ? ht.toBase64(this.buffer.subarray(0, this.position)) : ht.toUTF8(this.buffer, 0, this.position, false);
466
- }
467
- toExtendedJSON(t) {
468
- t = t || {}, this.sub_type === _ft.SUBTYPE_VECTOR && gt(this);
469
- const e = ht.toBase64(this.buffer), n = Number(this.sub_type).toString(16);
470
- return t.legacy ? { $binary: e, $type: 1 === n.length ? "0" + n : n } : { $binary: { base64: e, subType: 1 === n.length ? "0" + n : n } };
471
- }
472
- toUUID() {
473
- if (this.sub_type === _ft.SUBTYPE_UUID) return new Rt(this.buffer.subarray(0, this.position));
474
- throw new q(`Binary sub_type "${this.sub_type}" is not supported for converting to UUID. Only "${_ft.SUBTYPE_UUID}" is currently supported.`);
475
- }
476
- static createFromHexString(t, e) {
477
- return new _ft(ht.fromHex(t), e);
478
- }
479
- static createFromBase64(t, e) {
480
- return new _ft(ht.fromBase64(t), e);
481
- }
482
- static fromExtendedJSON(t, e) {
483
- let n, l;
484
- if (e = e || {}, "$binary" in t ? e.legacy && "string" == typeof t.$binary && "$type" in t ? (l = t.$type ? parseInt(t.$type, 16) : 0, n = ht.fromBase64(t.$binary)) : "string" != typeof t.$binary && (l = t.$binary.subType ? parseInt(t.$binary.subType, 16) : 0, n = ht.fromBase64(t.$binary.base64)) : "$uuid" in t && (l = 4, n = Rt.bytesFromString(t.$uuid)), !n) throw new q(`Unexpected Binary Extended JSON format ${JSON.stringify(t)}`);
485
- return l === A ? new Rt(n) : new _ft(n, l);
486
- }
487
- inspect(t, e, n) {
488
- n ??= V;
489
- return `Binary.createFromBase64(${n(ht.toBase64(this.buffer.subarray(0, this.position)), e)}, ${n(this.sub_type, e)})`;
490
- }
491
- toInt8Array() {
492
- if (this.sub_type !== _ft.SUBTYPE_VECTOR) throw new q("Binary sub_type is not Vector");
493
- if (this.buffer[0] !== _ft.VECTOR_TYPE.Int8) throw new q("Binary datatype field is not Int8");
494
- return gt(this), new Int8Array(this.buffer.buffer.slice(this.buffer.byteOffset + 2, this.buffer.byteOffset + this.position));
495
- }
496
- toFloat32Array() {
497
- if (this.sub_type !== _ft.SUBTYPE_VECTOR) throw new q("Binary sub_type is not Vector");
498
- if (this.buffer[0] !== _ft.VECTOR_TYPE.Float32) throw new q("Binary datatype field is not Float32");
499
- gt(this);
500
- const t = new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset + 2, this.buffer.byteOffset + this.position));
501
- return Wt.isBigEndian && ht.swap32(t), new Float32Array(t.buffer);
502
- }
503
- toPackedBits() {
504
- if (this.sub_type !== _ft.SUBTYPE_VECTOR) throw new q("Binary sub_type is not Vector");
505
- if (this.buffer[0] !== _ft.VECTOR_TYPE.PackedBit) throw new q("Binary datatype field is not packed bit");
506
- return gt(this), new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset + 2, this.buffer.byteOffset + this.position));
507
- }
508
- toBits() {
509
- if (this.sub_type !== _ft.SUBTYPE_VECTOR) throw new q("Binary sub_type is not Vector");
510
- if (this.buffer[0] !== _ft.VECTOR_TYPE.PackedBit) throw new q("Binary datatype field is not packed bit");
511
- gt(this);
512
- const t = 8 * (this.length() - 2) - this.buffer[1], e = new Int8Array(t);
513
- for (let t2 = 0; t2 < e.length; t2++) {
514
- const n = t2 / 8 | 0, l = this.buffer[n + 2] >> 7 - t2 % 8 & 1;
515
- e[t2] = l;
516
- }
517
- return e;
518
- }
519
- static fromInt8Array(t) {
520
- const e = ht.allocate(t.byteLength + 2);
521
- e[0] = _ft.VECTOR_TYPE.Int8, e[1] = 0;
522
- const n = new Uint8Array(t.buffer, t.byteOffset, t.byteLength);
523
- e.set(n, 2);
524
- const l = new this(e, this.SUBTYPE_VECTOR);
525
- return gt(l), l;
526
- }
527
- static fromFloat32Array(t) {
528
- const e = ht.allocate(t.byteLength + 2);
529
- e[0] = _ft.VECTOR_TYPE.Float32, e[1] = 0;
530
- const n = new Uint8Array(t.buffer, t.byteOffset, t.byteLength);
531
- e.set(n, 2), Wt.isBigEndian && ht.swap32(new Uint8Array(e.buffer, 2));
532
- const l = new this(e, this.SUBTYPE_VECTOR);
533
- return gt(l), l;
534
- }
535
- static fromPackedBits(t, e = 0) {
536
- const n = ht.allocate(t.byteLength + 2);
537
- n[0] = _ft.VECTOR_TYPE.PackedBit, n[1] = e, n.set(t, 2);
538
- const l = new this(n, this.SUBTYPE_VECTOR);
539
- return gt(l), l;
540
- }
541
- static fromBits(t) {
542
- const e = t.length + 7 >>> 3, n = new Uint8Array(e + 2);
543
- n[0] = _ft.VECTOR_TYPE.PackedBit;
544
- const l = t.length % 8;
545
- n[1] = 0 === l ? 0 : 8 - l;
546
- for (let e2 = 0; e2 < t.length; e2++) {
547
- const l2 = e2 >>> 3, i2 = t[e2];
548
- if (0 !== i2 && 1 !== i2) throw new q(`Invalid bit value at ${e2}: must be 0 or 1, found ${t[e2]}`);
549
- if (0 === i2) continue;
550
- const o = 7 - e2 % 8;
551
- n[l2 + 2] |= i2 << o;
552
- }
553
- return new this(n, _ft.SUBTYPE_VECTOR);
554
- }
555
- };
556
- function gt(t) {
557
- if (t.sub_type !== ft.SUBTYPE_VECTOR) return;
558
- const e = t.position, n = t.buffer[0], l = t.buffer[1];
559
- if ((n === ft.VECTOR_TYPE.Float32 || n === ft.VECTOR_TYPE.Int8) && 0 !== l) throw new q("Invalid Vector: padding must be zero for int8 and float32 vectors");
560
- if (n === ft.VECTOR_TYPE.Float32 && 0 !== e && e - 2 != 0 && (e - 2) % 4 != 0) throw new q("Invalid Vector: Float32 vector must contain a multiple of 4 bytes");
561
- if (n === ft.VECTOR_TYPE.PackedBit && 0 !== l && 2 === e) throw new q("Invalid Vector: padding must be zero for packed bit vectors that are empty");
562
- if (n === ft.VECTOR_TYPE.PackedBit && l > 7) throw new q(`Invalid Vector: padding must be a value between 0 and 7. found: ${l}`);
563
- }
564
- var Yt = /^[0-9A-F]{32}$/i;
565
- var It = /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i;
566
- var Rt = class _Rt extends ft {
567
- constructor(t) {
568
- let e;
569
- if (null == t) e = _Rt.generate();
570
- else if (t instanceof _Rt) e = ht.toLocalBufferType(new Uint8Array(t.buffer));
571
- else if (ArrayBuffer.isView(t) && 16 === t.byteLength) e = ht.toLocalBufferType(t);
572
- else {
573
- if ("string" != typeof t) throw new q("Argument passed in UUID constructor must be a UUID, a 16 byte Buffer or a 32/36 character hex string (dashes excluded/included, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).");
574
- e = _Rt.bytesFromString(t);
575
- }
576
- super(e, A);
577
- }
578
- get id() {
579
- return this.buffer;
580
- }
581
- set id(t) {
582
- this.buffer = t;
583
- }
584
- toHexString(t = true) {
585
- return t ? [ht.toHex(this.buffer.subarray(0, 4)), ht.toHex(this.buffer.subarray(4, 6)), ht.toHex(this.buffer.subarray(6, 8)), ht.toHex(this.buffer.subarray(8, 10)), ht.toHex(this.buffer.subarray(10, 16))].join("-") : ht.toHex(this.buffer);
586
- }
587
- toString(t) {
588
- return "hex" === t ? ht.toHex(this.id) : "base64" === t ? ht.toBase64(this.id) : this.toHexString();
589
- }
590
- toJSON() {
591
- return this.toHexString();
592
- }
593
- equals(t) {
594
- if (!t) return false;
595
- if (t instanceof _Rt) return ht.equals(t.id, this.id);
596
- try {
597
- return ht.equals(new _Rt(t).id, this.id);
598
- } catch {
599
- return false;
600
- }
601
- }
602
- toBinary() {
603
- return new ft(this.id, ft.SUBTYPE_UUID);
604
- }
605
- static generate() {
606
- const t = ht.randomBytes(16);
607
- return t[6] = 15 & t[6] | 64, t[8] = 63 & t[8] | 128, t;
608
- }
609
- static isValid(t) {
610
- return !!t && ("string" == typeof t ? _Rt.isValidUUIDString(t) : h(t) ? 16 === t.byteLength : "Binary" === t._bsontype && t.sub_type === this.SUBTYPE_UUID && 16 === t.buffer.byteLength);
611
- }
612
- static createFromHexString(t) {
613
- const e = _Rt.bytesFromString(t);
614
- return new _Rt(e);
615
- }
616
- static createFromBase64(t) {
617
- return new _Rt(ht.fromBase64(t));
618
- }
619
- static bytesFromString(t) {
620
- if (!_Rt.isValidUUIDString(t)) throw new q("UUID string representation must be 32 hex digits or canonical hyphenated representation");
621
- return ht.fromHex(t.replace(/-/g, ""));
622
- }
623
- static isValidUUIDString(t) {
624
- return Yt.test(t) || It.test(t);
625
- }
626
- inspect(t, e, n) {
627
- return n ??= V, `new UUID(${n(this.toHexString(), e)})`;
628
- }
629
- };
630
- var Jt = class _Jt extends yt {
631
- get _bsontype() {
632
- return "Code";
633
- }
634
- code;
635
- scope;
636
- constructor(t, e) {
637
- super(), this.code = t.toString(), this.scope = e ?? null;
638
- }
639
- toJSON() {
640
- return null != this.scope ? { code: this.code, scope: this.scope } : { code: this.code };
641
- }
642
- toExtendedJSON() {
643
- return this.scope ? { $code: this.code, $scope: this.scope } : { $code: this.code };
644
- }
645
- static fromExtendedJSON(t) {
646
- return new _Jt(t.$code, t.$scope);
647
- }
648
- inspect(t, e, n) {
649
- n ??= V;
650
- let l = n(this.code, e);
651
- const i2 = l.includes("\n");
652
- null != this.scope && (l += `,${i2 ? "\n" : " "}${n(this.scope, e)}`);
653
- return `new Code(${i2 ? "\n" : ""}${l}${i2 && null === this.scope ? "\n" : ""})`;
654
- }
655
- };
656
- function St(t) {
657
- return null != t && "object" == typeof t && "$id" in t && null != t.$id && "$ref" in t && "string" == typeof t.$ref && (!("$db" in t) || "$db" in t && "string" == typeof t.$db);
658
- }
659
- var Kt = class _Kt extends yt {
660
- get _bsontype() {
661
- return "DBRef";
662
- }
663
- collection;
664
- oid;
665
- db;
666
- fields;
667
- constructor(t, e, n, l) {
668
- super();
669
- const i2 = t.split(".");
670
- 2 === i2.length && (n = i2.shift(), t = i2.shift()), this.collection = t, this.oid = e, this.db = n, this.fields = l || {};
671
- }
672
- get namespace() {
673
- return this.collection;
674
- }
675
- set namespace(t) {
676
- this.collection = t;
677
- }
678
- toJSON() {
679
- const t = Object.assign({ $ref: this.collection, $id: this.oid }, this.fields);
680
- return null != this.db && (t.$db = this.db), t;
681
- }
682
- toExtendedJSON(t) {
683
- t = t || {};
684
- let e = { $ref: this.collection, $id: this.oid };
685
- return t.legacy || (this.db && (e.$db = this.db), e = Object.assign(e, this.fields)), e;
686
- }
687
- static fromExtendedJSON(t) {
688
- const e = Object.assign({}, t);
689
- return delete e.$ref, delete e.$id, delete e.$db, new _Kt(t.$ref, t.$id, t.$db, e);
690
- }
691
- inspect(t, e, n) {
692
- n ??= V;
693
- const l = [n(this.namespace, e), n(this.oid, e), ...this.db ? [n(this.db, e)] : [], ...Object.keys(this.fields).length > 0 ? [n(this.fields, e)] : []];
694
- return l[1] = n === V ? `new ObjectId(${l[1]})` : l[1], `new DBRef(${l.join(", ")})`;
695
- }
696
- };
697
- function Tt(t) {
698
- if ("" === t) return t;
699
- let e = 0;
700
- const n = "-" === t[e], l = "+" === t[e];
701
- (l || n) && (e += 1);
702
- let i2 = false;
703
- for (; e < t.length && "0" === t[e]; ++e) i2 = true;
704
- return i2 ? `${n ? "-" : ""}${t.length === e ? "0" : t.slice(e)}` : l ? t.slice(1) : t;
705
- }
706
- var Lt;
707
- try {
708
- Lt = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11])), {}).exports;
709
- } catch {
710
- }
711
- var zt = 4294967296;
712
- var xt = 18446744073709552e3;
713
- var Ut = xt / 2;
714
- var Nt = {};
715
- var wt = {};
716
- var kt = /^(\+?0|(\+|-)?[1-9][0-9]*)$/;
717
- var Ht = class _Ht extends yt {
718
- get _bsontype() {
719
- return "Long";
720
- }
721
- get __isLong__() {
722
- return true;
723
- }
724
- high;
725
- low;
726
- unsigned;
727
- constructor(t = 0, e, n) {
728
- super();
729
- const l = "boolean" == typeof e ? e : Boolean(n), i2 = "number" == typeof e ? e : 0, o = "string" == typeof t ? _Ht.fromString(t, l) : "bigint" == typeof t ? _Ht.fromBigInt(t, l) : { low: 0 | t, high: 0 | i2, unsigned: l };
730
- this.low = o.low, this.high = o.high, this.unsigned = o.unsigned;
731
- }
732
- static TWO_PWR_24 = _Ht.fromInt(16777216);
733
- static MAX_UNSIGNED_VALUE = _Ht.fromBits(-1, -1, true);
734
- static ZERO = _Ht.fromInt(0);
735
- static UZERO = _Ht.fromInt(0, true);
736
- static ONE = _Ht.fromInt(1);
737
- static UONE = _Ht.fromInt(1, true);
738
- static NEG_ONE = _Ht.fromInt(-1);
739
- static MAX_VALUE = _Ht.fromBits(-1, 2147483647, false);
740
- static MIN_VALUE = _Ht.fromBits(0, -2147483648, false);
741
- static fromBits(t, e, n) {
742
- return new _Ht(t, e, n);
743
- }
744
- static fromInt(t, e) {
745
- let n, l, i2;
746
- return e ? (i2 = 0 <= (t >>>= 0) && t < 256) && (l = wt[t], l) ? l : (n = _Ht.fromBits(t, (0 | t) < 0 ? -1 : 0, true), i2 && (wt[t] = n), n) : (i2 = -128 <= (t |= 0) && t < 128) && (l = Nt[t], l) ? l : (n = _Ht.fromBits(t, t < 0 ? -1 : 0, false), i2 && (Nt[t] = n), n);
747
- }
748
- static fromNumber(t, e) {
749
- if (isNaN(t)) return e ? _Ht.UZERO : _Ht.ZERO;
750
- if (e) {
751
- if (t < 0) return _Ht.UZERO;
752
- if (t >= xt) return _Ht.MAX_UNSIGNED_VALUE;
753
- } else {
754
- if (t <= -Ut) return _Ht.MIN_VALUE;
755
- if (t + 1 >= Ut) return _Ht.MAX_VALUE;
756
- }
757
- return t < 0 ? _Ht.fromNumber(-t, e).neg() : _Ht.fromBits(t % zt | 0, t / zt | 0, e);
758
- }
759
- static fromBigInt(t, e) {
760
- const n = 0xffffffffn;
761
- return new _Ht(Number(t & n), Number(t >> 32n & n), e);
762
- }
763
- static _fromString(t, e, n) {
764
- if (0 === t.length) throw new q("empty string");
765
- if (n < 2 || 36 < n) throw new q("radix");
766
- let l;
767
- if ((l = t.indexOf("-")) > 0) throw new q("interior hyphen");
768
- if (0 === l) return _Ht._fromString(t.substring(1), e, n).neg();
769
- const i2 = _Ht.fromNumber(Math.pow(n, 8));
770
- let o = _Ht.ZERO;
771
- for (let e2 = 0; e2 < t.length; e2 += 8) {
772
- const l2 = Math.min(8, t.length - e2), c = parseInt(t.substring(e2, e2 + l2), n);
773
- if (l2 < 8) {
774
- const t2 = _Ht.fromNumber(Math.pow(n, l2));
775
- o = o.mul(t2).add(_Ht.fromNumber(c));
776
- } else o = o.mul(i2), o = o.add(_Ht.fromNumber(c));
777
- }
778
- return o.unsigned = e, o;
779
- }
780
- static fromStringStrict(t, e, n) {
781
- let l = false;
782
- if ("number" == typeof e ? (n = e, e = false) : l = !!e, n ??= 10, t.trim() !== t) throw new q(`Input: '${t}' contains leading and/or trailing whitespace`);
783
- if (!(function(t2, e2) {
784
- const n2 = "0123456789abcdefghijklmnopqrstuvwxyz".slice(0, e2 = e2 ?? 10);
785
- return !new RegExp(`[^-+${n2}]`, "i").test(t2) && t2;
786
- })(t, n)) throw new q(`Input: '${t}' contains invalid characters for radix: ${n}`);
787
- const i2 = Tt(t), o = _Ht._fromString(i2, l, n);
788
- if (o.toString(n).toLowerCase() !== i2.toLowerCase()) throw new q(`Input: ${t} is not representable as ${o.unsigned ? "an unsigned" : "a signed"} 64-bit Long ${null != n ? `with radix: ${n}` : ""}`);
789
- return o;
790
- }
791
- static fromString(t, e, n) {
792
- let l = false;
793
- return "number" == typeof e ? (n = e, e = false) : l = !!e, n ??= 10, "NaN" === t && n < 24 || ("Infinity" === t || "+Infinity" === t || "-Infinity" === t) && n < 35 ? _Ht.ZERO : _Ht._fromString(t, l, n);
794
- }
795
- static fromBytes(t, e, n) {
796
- return n ? _Ht.fromBytesLE(t, e) : _Ht.fromBytesBE(t, e);
797
- }
798
- static fromBytesLE(t, e) {
799
- return new _Ht(t[0] | t[1] << 8 | t[2] << 16 | t[3] << 24, t[4] | t[5] << 8 | t[6] << 16 | t[7] << 24, e);
800
- }
801
- static fromBytesBE(t, e) {
802
- return new _Ht(t[4] << 24 | t[5] << 16 | t[6] << 8 | t[7], t[0] << 24 | t[1] << 16 | t[2] << 8 | t[3], e);
803
- }
804
- static isLong(t) {
805
- return null != t && "object" == typeof t && "__isLong__" in t && true === t.__isLong__;
806
- }
807
- static fromValue(t, e) {
808
- return "number" == typeof t ? _Ht.fromNumber(t, e) : "string" == typeof t ? _Ht.fromString(t, e) : _Ht.fromBits(t.low, t.high, "boolean" == typeof e ? e : t.unsigned);
809
- }
810
- add(t) {
811
- _Ht.isLong(t) || (t = _Ht.fromValue(t));
812
- const e = this.high >>> 16, n = 65535 & this.high, l = this.low >>> 16, i2 = 65535 & this.low, o = t.high >>> 16, c = 65535 & t.high, a = t.low >>> 16;
813
- let s = 0, d = 0, b = 0, Z = 0;
814
- return Z += i2 + (65535 & t.low), b += Z >>> 16, Z &= 65535, b += l + a, d += b >>> 16, b &= 65535, d += n + c, s += d >>> 16, d &= 65535, s += e + o, s &= 65535, _Ht.fromBits(b << 16 | Z, s << 16 | d, this.unsigned);
815
- }
816
- and(t) {
817
- return _Ht.isLong(t) || (t = _Ht.fromValue(t)), _Ht.fromBits(this.low & t.low, this.high & t.high, this.unsigned);
818
- }
819
- compare(t) {
820
- if (_Ht.isLong(t) || (t = _Ht.fromValue(t)), this.eq(t)) return 0;
821
- const e = this.isNegative(), n = t.isNegative();
822
- return e && !n ? -1 : !e && n ? 1 : this.unsigned ? t.high >>> 0 > this.high >>> 0 || t.high === this.high && t.low >>> 0 > this.low >>> 0 ? -1 : 1 : this.sub(t).isNegative() ? -1 : 1;
823
- }
824
- comp(t) {
825
- return this.compare(t);
826
- }
827
- divide(t) {
828
- if (_Ht.isLong(t) || (t = _Ht.fromValue(t)), t.isZero()) throw new q("division by zero");
829
- if (Lt) {
830
- if (!this.unsigned && -2147483648 === this.high && -1 === t.low && -1 === t.high) return this;
831
- const e2 = (this.unsigned ? Lt.div_u : Lt.div_s)(this.low, this.high, t.low, t.high);
832
- return _Ht.fromBits(e2, Lt.get_high(), this.unsigned);
833
- }
834
- if (this.isZero()) return this.unsigned ? _Ht.UZERO : _Ht.ZERO;
835
- let e, n, l;
836
- if (this.unsigned) {
837
- if (t.unsigned || (t = t.toUnsigned()), t.gt(this)) return _Ht.UZERO;
838
- if (t.gt(this.shru(1))) return _Ht.UONE;
839
- l = _Ht.UZERO;
840
- } else {
841
- if (this.eq(_Ht.MIN_VALUE)) {
842
- if (t.eq(_Ht.ONE) || t.eq(_Ht.NEG_ONE)) return _Ht.MIN_VALUE;
843
- if (t.eq(_Ht.MIN_VALUE)) return _Ht.ONE;
844
- return e = this.shr(1).div(t).shl(1), e.eq(_Ht.ZERO) ? t.isNegative() ? _Ht.ONE : _Ht.NEG_ONE : (n = this.sub(t.mul(e)), l = e.add(n.div(t)), l);
845
- }
846
- if (t.eq(_Ht.MIN_VALUE)) return this.unsigned ? _Ht.UZERO : _Ht.ZERO;
847
- if (this.isNegative()) return t.isNegative() ? this.neg().div(t.neg()) : this.neg().div(t).neg();
848
- if (t.isNegative()) return this.div(t.neg()).neg();
849
- l = _Ht.ZERO;
850
- }
851
- for (n = this; n.gte(t); ) {
852
- e = Math.max(1, Math.floor(n.toNumber() / t.toNumber()));
853
- const i2 = Math.ceil(Math.log(e) / Math.LN2), o = i2 <= 48 ? 1 : Math.pow(2, i2 - 48);
854
- let c = _Ht.fromNumber(e), a = c.mul(t);
855
- for (; a.isNegative() || a.gt(n); ) e -= o, c = _Ht.fromNumber(e, this.unsigned), a = c.mul(t);
856
- c.isZero() && (c = _Ht.ONE), l = l.add(c), n = n.sub(a);
857
- }
858
- return l;
859
- }
860
- div(t) {
861
- return this.divide(t);
862
- }
863
- equals(t) {
864
- return _Ht.isLong(t) || (t = _Ht.fromValue(t)), (this.unsigned === t.unsigned || this.high >>> 31 != 1 || t.high >>> 31 != 1) && (this.high === t.high && this.low === t.low);
865
- }
866
- eq(t) {
867
- return this.equals(t);
868
- }
869
- getHighBits() {
870
- return this.high;
871
- }
872
- getHighBitsUnsigned() {
873
- return this.high >>> 0;
874
- }
875
- getLowBits() {
876
- return this.low;
877
- }
878
- getLowBitsUnsigned() {
879
- return this.low >>> 0;
880
- }
881
- getNumBitsAbs() {
882
- if (this.isNegative()) return this.eq(_Ht.MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();
883
- const t = 0 !== this.high ? this.high : this.low;
884
- let e;
885
- for (e = 31; e > 0 && !(t & 1 << e); e--) ;
886
- return 0 !== this.high ? e + 33 : e + 1;
887
- }
888
- greaterThan(t) {
889
- return this.comp(t) > 0;
890
- }
891
- gt(t) {
892
- return this.greaterThan(t);
893
- }
894
- greaterThanOrEqual(t) {
895
- return this.comp(t) >= 0;
896
- }
897
- gte(t) {
898
- return this.greaterThanOrEqual(t);
899
- }
900
- ge(t) {
901
- return this.greaterThanOrEqual(t);
902
- }
903
- isEven() {
904
- return !(1 & this.low);
905
- }
906
- isNegative() {
907
- return !this.unsigned && this.high < 0;
908
- }
909
- isOdd() {
910
- return !(1 & ~this.low);
911
- }
912
- isPositive() {
913
- return this.unsigned || this.high >= 0;
914
- }
915
- isZero() {
916
- return 0 === this.high && 0 === this.low;
917
- }
918
- lessThan(t) {
919
- return this.comp(t) < 0;
920
- }
921
- lt(t) {
922
- return this.lessThan(t);
923
- }
924
- lessThanOrEqual(t) {
925
- return this.comp(t) <= 0;
926
- }
927
- lte(t) {
928
- return this.lessThanOrEqual(t);
929
- }
930
- modulo(t) {
931
- if (_Ht.isLong(t) || (t = _Ht.fromValue(t)), Lt) {
932
- const e = (this.unsigned ? Lt.rem_u : Lt.rem_s)(this.low, this.high, t.low, t.high);
933
- return _Ht.fromBits(e, Lt.get_high(), this.unsigned);
934
- }
935
- return this.sub(this.div(t).mul(t));
936
- }
937
- mod(t) {
938
- return this.modulo(t);
939
- }
940
- rem(t) {
941
- return this.modulo(t);
942
- }
943
- multiply(t) {
944
- if (this.isZero()) return _Ht.ZERO;
945
- if (_Ht.isLong(t) || (t = _Ht.fromValue(t)), Lt) {
946
- const e2 = Lt.mul(this.low, this.high, t.low, t.high);
947
- return _Ht.fromBits(e2, Lt.get_high(), this.unsigned);
948
- }
949
- if (t.isZero()) return _Ht.ZERO;
950
- if (this.eq(_Ht.MIN_VALUE)) return t.isOdd() ? _Ht.MIN_VALUE : _Ht.ZERO;
951
- if (t.eq(_Ht.MIN_VALUE)) return this.isOdd() ? _Ht.MIN_VALUE : _Ht.ZERO;
952
- if (this.isNegative()) return t.isNegative() ? this.neg().mul(t.neg()) : this.neg().mul(t).neg();
953
- if (t.isNegative()) return this.mul(t.neg()).neg();
954
- if (this.lt(_Ht.TWO_PWR_24) && t.lt(_Ht.TWO_PWR_24)) return _Ht.fromNumber(this.toNumber() * t.toNumber(), this.unsigned);
955
- const e = this.high >>> 16, n = 65535 & this.high, l = this.low >>> 16, i2 = 65535 & this.low, o = t.high >>> 16, c = 65535 & t.high, a = t.low >>> 16, s = 65535 & t.low;
956
- let d = 0, b = 0, Z = 0, m = 0;
957
- return m += i2 * s, Z += m >>> 16, m &= 65535, Z += l * s, b += Z >>> 16, Z &= 65535, Z += i2 * a, b += Z >>> 16, Z &= 65535, b += n * s, d += b >>> 16, b &= 65535, b += l * a, d += b >>> 16, b &= 65535, b += i2 * c, d += b >>> 16, b &= 65535, d += e * s + n * a + l * c + i2 * o, d &= 65535, _Ht.fromBits(Z << 16 | m, d << 16 | b, this.unsigned);
958
- }
959
- mul(t) {
960
- return this.multiply(t);
961
- }
962
- negate() {
963
- return !this.unsigned && this.eq(_Ht.MIN_VALUE) ? _Ht.MIN_VALUE : this.not().add(_Ht.ONE);
964
- }
965
- neg() {
966
- return this.negate();
967
- }
968
- not() {
969
- return _Ht.fromBits(~this.low, ~this.high, this.unsigned);
970
- }
971
- notEquals(t) {
972
- return !this.equals(t);
973
- }
974
- neq(t) {
975
- return this.notEquals(t);
976
- }
977
- ne(t) {
978
- return this.notEquals(t);
979
- }
980
- or(t) {
981
- return _Ht.isLong(t) || (t = _Ht.fromValue(t)), _Ht.fromBits(this.low | t.low, this.high | t.high, this.unsigned);
982
- }
983
- shiftLeft(t) {
984
- return _Ht.isLong(t) && (t = t.toInt()), 0 == (t &= 63) ? this : t < 32 ? _Ht.fromBits(this.low << t, this.high << t | this.low >>> 32 - t, this.unsigned) : _Ht.fromBits(0, this.low << t - 32, this.unsigned);
985
- }
986
- shl(t) {
987
- return this.shiftLeft(t);
988
- }
989
- shiftRight(t) {
990
- return _Ht.isLong(t) && (t = t.toInt()), 0 == (t &= 63) ? this : t < 32 ? _Ht.fromBits(this.low >>> t | this.high << 32 - t, this.high >> t, this.unsigned) : _Ht.fromBits(this.high >> t - 32, this.high >= 0 ? 0 : -1, this.unsigned);
991
- }
992
- shr(t) {
993
- return this.shiftRight(t);
994
- }
995
- shiftRightUnsigned(t) {
996
- if (_Ht.isLong(t) && (t = t.toInt()), 0 === (t &= 63)) return this;
997
- {
998
- const e = this.high;
999
- if (t < 32) {
1000
- const n = this.low;
1001
- return _Ht.fromBits(n >>> t | e << 32 - t, e >>> t, this.unsigned);
1002
- }
1003
- return 32 === t ? _Ht.fromBits(e, 0, this.unsigned) : _Ht.fromBits(e >>> t - 32, 0, this.unsigned);
1004
- }
1005
- }
1006
- shr_u(t) {
1007
- return this.shiftRightUnsigned(t);
1008
- }
1009
- shru(t) {
1010
- return this.shiftRightUnsigned(t);
1011
- }
1012
- subtract(t) {
1013
- return _Ht.isLong(t) || (t = _Ht.fromValue(t)), this.add(t.neg());
1014
- }
1015
- sub(t) {
1016
- return this.subtract(t);
1017
- }
1018
- toInt() {
1019
- return this.unsigned ? this.low >>> 0 : this.low;
1020
- }
1021
- toNumber() {
1022
- return this.unsigned ? (this.high >>> 0) * zt + (this.low >>> 0) : this.high * zt + (this.low >>> 0);
1023
- }
1024
- toBigInt() {
1025
- return BigInt(this.toString());
1026
- }
1027
- toBytes(t) {
1028
- return t ? this.toBytesLE() : this.toBytesBE();
1029
- }
1030
- toBytesLE() {
1031
- const t = this.high, e = this.low;
1032
- return [255 & e, e >>> 8 & 255, e >>> 16 & 255, e >>> 24, 255 & t, t >>> 8 & 255, t >>> 16 & 255, t >>> 24];
1033
- }
1034
- toBytesBE() {
1035
- const t = this.high, e = this.low;
1036
- return [t >>> 24, t >>> 16 & 255, t >>> 8 & 255, 255 & t, e >>> 24, e >>> 16 & 255, e >>> 8 & 255, 255 & e];
1037
- }
1038
- toSigned() {
1039
- return this.unsigned ? _Ht.fromBits(this.low, this.high, false) : this;
1040
- }
1041
- toString(t) {
1042
- if ((t = t || 10) < 2 || 36 < t) throw new q("radix");
1043
- if (this.isZero()) return "0";
1044
- if (this.isNegative()) {
1045
- if (this.eq(_Ht.MIN_VALUE)) {
1046
- const e2 = _Ht.fromNumber(t), n2 = this.div(e2), l2 = n2.mul(e2).sub(this);
1047
- return n2.toString(t) + l2.toInt().toString(t);
1048
- }
1049
- return "-" + this.neg().toString(t);
1050
- }
1051
- const e = _Ht.fromNumber(Math.pow(t, 6), this.unsigned);
1052
- let n = this, l = "";
1053
- for (; ; ) {
1054
- const i2 = n.div(e);
1055
- let o = (n.sub(i2.mul(e)).toInt() >>> 0).toString(t);
1056
- if (n = i2, n.isZero()) return o + l;
1057
- for (; o.length < 6; ) o = "0" + o;
1058
- l = "" + o + l;
1059
- }
1060
- }
1061
- toUnsigned() {
1062
- return this.unsigned ? this : _Ht.fromBits(this.low, this.high, true);
1063
- }
1064
- xor(t) {
1065
- return _Ht.isLong(t) || (t = _Ht.fromValue(t)), _Ht.fromBits(this.low ^ t.low, this.high ^ t.high, this.unsigned);
1066
- }
1067
- eqz() {
1068
- return this.isZero();
1069
- }
1070
- le(t) {
1071
- return this.lessThanOrEqual(t);
1072
- }
1073
- toExtendedJSON(t) {
1074
- return t && t.relaxed ? this.toNumber() : { $numberLong: this.toString() };
1075
- }
1076
- static fromExtendedJSON(t, e) {
1077
- const { useBigInt64: n = false, relaxed: l = true } = { ...e };
1078
- if (t.$numberLong.length > 20) throw new q("$numberLong string is too long");
1079
- if (!kt.test(t.$numberLong)) throw new q(`$numberLong string "${t.$numberLong}" is in an invalid format`);
1080
- if (n) {
1081
- const e2 = BigInt(t.$numberLong);
1082
- return BigInt.asIntN(64, e2);
1083
- }
1084
- const i2 = _Ht.fromString(t.$numberLong);
1085
- return l ? i2.toNumber() : i2;
1086
- }
1087
- inspect(t, e, n) {
1088
- n ??= V;
1089
- return `new Long(${n(this.toString(), e)}${this.unsigned ? `, ${n(this.unsigned, e)}` : ""})`;
1090
- }
1091
- };
1092
- var Ct = /^(\+|-)?(\d+|(\d*\.\d*))?(E|e)?([-+])?(\d+)?$/;
1093
- var Bt = /^(\+|-)?(Infinity|inf)$/i;
1094
- var vt = /^(\+|-)?NaN$/i;
1095
- var jt = 6111;
1096
- var Mt = -6176;
1097
- var Pt = ht.fromNumberArray([124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].reverse());
1098
- var Ft = ht.fromNumberArray([248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].reverse());
1099
- var Qt = ht.fromNumberArray([120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].reverse());
1100
- var Ot = /^([-+])?(\d+)?$/;
1101
- function Et(t) {
1102
- return !isNaN(parseInt(t, 10));
1103
- }
1104
- function _t(t) {
1105
- const e = Ht.fromNumber(1e9);
1106
- let n = Ht.fromNumber(0);
1107
- if (!(t.parts[0] || t.parts[1] || t.parts[2] || t.parts[3])) return { quotient: t, rem: n };
1108
- for (let l = 0; l <= 3; l++) n = n.shiftLeft(32), n = n.add(new Ht(t.parts[l], 0)), t.parts[l] = n.div(e).low, n = n.modulo(e);
1109
- return { quotient: t, rem: n };
1110
- }
1111
- function Dt(t, e) {
1112
- throw new q(`"${t}" is not a valid Decimal128 string - ${e}`);
1113
- }
1114
- var At = class _At extends yt {
1115
- get _bsontype() {
1116
- return "Decimal128";
1117
- }
1118
- bytes;
1119
- constructor(t) {
1120
- if (super(), "string" == typeof t) this.bytes = _At.fromString(t).bytes;
1121
- else {
1122
- if (!(t instanceof Uint8Array || h(t))) throw new q("Decimal128 must take a Buffer or string");
1123
- if (16 !== t.byteLength) throw new q("Decimal128 must take a Buffer of 16 bytes");
1124
- this.bytes = t;
1125
- }
1126
- }
1127
- static fromString(t) {
1128
- return _At._fromString(t, { allowRounding: false });
1129
- }
1130
- static fromStringWithRounding(t) {
1131
- return _At._fromString(t, { allowRounding: true });
1132
- }
1133
- static _fromString(t, e) {
1134
- let n = false, l = false, i2 = false, o = false, c = 0, a = 0, s = 0, d = 0, b = 0;
1135
- const Z = [0];
1136
- let m = 0, r = 0, u2 = 0, h2 = 0, p2 = new Ht(0, 0), y2 = new Ht(0, 0), X2 = 0, G2 = 0;
1137
- if (t.length >= 7e3) throw new q(t + " not a valid Decimal128 string");
1138
- const V2 = t.match(Ct), W2 = t.match(Bt), f2 = t.match(vt);
1139
- if (!V2 && !W2 && !f2 || 0 === t.length) throw new q(t + " not a valid Decimal128 string");
1140
- if (V2) {
1141
- const e2 = V2[2], n2 = V2[4], l2 = V2[5], i3 = V2[6];
1142
- n2 && void 0 === i3 && Dt(t, "missing exponent power"), n2 && void 0 === e2 && Dt(t, "missing exponent base"), void 0 === n2 && (l2 || i3) && Dt(t, "missing e before exponent");
1143
- }
1144
- if ("+" !== t[G2] && "-" !== t[G2] || (l = true, n = "-" === t[G2++]), !Et(t[G2]) && "." !== t[G2]) {
1145
- if ("i" === t[G2] || "I" === t[G2]) return new _At(n ? Ft : Qt);
1146
- if ("N" === t[G2]) return new _At(Pt);
1147
- }
1148
- for (; Et(t[G2]) || "." === t[G2]; ) "." !== t[G2] ? (m < 34 && ("0" !== t[G2] || o) && (o || (b = a), o = true, Z[r++] = parseInt(t[G2], 10), m += 1), o && (s += 1), i2 && (d += 1), a += 1, G2 += 1) : (i2 && Dt(t, "contains multiple periods"), i2 = true, G2 += 1);
1149
- if (i2 && !a) throw new q(t + " not a valid Decimal128 string");
1150
- if ("e" === t[G2] || "E" === t[G2]) {
1151
- const e2 = t.substr(++G2).match(Ot);
1152
- if (!e2 || !e2[2]) return new _At(Pt);
1153
- h2 = parseInt(e2[0], 10), G2 += e2[0].length;
1154
- }
1155
- if (t[G2]) return new _At(Pt);
1156
- if (m) {
1157
- if (u2 = m - 1, c = s, 1 !== c) for (; "0" === t[b + c - 1 + Number(l) + Number(i2)]; ) c -= 1;
1158
- } else Z[0] = 0, s = 1, m = 1, c = 0;
1159
- for (h2 <= d && d > h2 + 16384 ? h2 = Mt : h2 -= d; h2 > jt; ) {
1160
- if (u2 += 1, u2 >= 34) {
1161
- if (0 === c) {
1162
- h2 = jt;
1163
- break;
1164
- }
1165
- Dt(t, "overflow");
1166
- }
1167
- h2 -= 1;
1168
- }
1169
- if (e.allowRounding) {
1170
- for (; h2 < Mt || m < s; ) {
1171
- if (0 === u2 && c < m) {
1172
- h2 = Mt, c = 0;
1173
- break;
1174
- }
1175
- if (m < s ? s -= 1 : u2 -= 1, h2 < jt) h2 += 1;
1176
- else {
1177
- if (Z.join("").match(/^0+$/)) {
1178
- h2 = jt;
1179
- break;
1180
- }
1181
- Dt(t, "overflow");
1182
- }
1183
- }
1184
- if (u2 + 1 < c) {
1185
- let e2 = a;
1186
- i2 && (b += 1, e2 += 1), l && (b += 1, e2 += 1);
1187
- const o2 = parseInt(t[b + u2 + 1], 10);
1188
- let c2 = 0;
1189
- if (o2 >= 5 && (c2 = 1, 5 === o2)) {
1190
- c2 = Z[u2] % 2 == 1 ? 1 : 0;
1191
- for (let n2 = b + u2 + 2; n2 < e2; n2++) if (parseInt(t[n2], 10)) {
1192
- c2 = 1;
1193
- break;
1194
- }
1195
- }
1196
- if (c2) {
1197
- let t2 = u2;
1198
- for (; t2 >= 0 && ++Z[t2] > 9; t2--) if (Z[t2] = 0, 0 === t2) {
1199
- if (!(h2 < jt)) return new _At(n ? Ft : Qt);
1200
- h2 += 1, Z[t2] = 1;
1201
- }
1202
- }
1203
- }
1204
- } else {
1205
- for (; h2 < Mt || m < s; ) {
1206
- if (0 === u2) {
1207
- if (0 === c) {
1208
- h2 = Mt;
1209
- break;
1210
- }
1211
- Dt(t, "exponent underflow");
1212
- }
1213
- m < s ? ("0" !== t[s - 1 + Number(l) + Number(i2)] && 0 !== c && Dt(t, "inexact rounding"), s -= 1) : (0 !== Z[u2] && Dt(t, "inexact rounding"), u2 -= 1), h2 < jt ? h2 += 1 : Dt(t, "overflow");
1214
- }
1215
- if (u2 + 1 < c) {
1216
- i2 && (b += 1), l && (b += 1);
1217
- 0 !== parseInt(t[b + u2 + 1], 10) && Dt(t, "inexact rounding");
1218
- }
1219
- }
1220
- if (p2 = Ht.fromNumber(0), y2 = Ht.fromNumber(0), 0 === c) p2 = Ht.fromNumber(0), y2 = Ht.fromNumber(0);
1221
- else if (u2 < 17) {
1222
- let t2 = 0;
1223
- for (y2 = Ht.fromNumber(Z[t2++]), p2 = new Ht(0, 0); t2 <= u2; t2++) y2 = y2.multiply(Ht.fromNumber(10)), y2 = y2.add(Ht.fromNumber(Z[t2]));
1224
- } else {
1225
- let t2 = 0;
1226
- for (p2 = Ht.fromNumber(Z[t2++]); t2 <= u2 - 17; t2++) p2 = p2.multiply(Ht.fromNumber(10)), p2 = p2.add(Ht.fromNumber(Z[t2]));
1227
- for (y2 = Ht.fromNumber(Z[t2++]); t2 <= u2; t2++) y2 = y2.multiply(Ht.fromNumber(10)), y2 = y2.add(Ht.fromNumber(Z[t2]));
1228
- }
1229
- const g2 = (function(t2, e2) {
1230
- if (!t2 && !e2) return { high: Ht.fromNumber(0), low: Ht.fromNumber(0) };
1231
- const n2 = t2.shiftRightUnsigned(32), l2 = new Ht(t2.getLowBits(), 0), i3 = e2.shiftRightUnsigned(32), o2 = new Ht(e2.getLowBits(), 0);
1232
- let c2 = n2.multiply(i3), a2 = n2.multiply(o2);
1233
- const s2 = l2.multiply(i3);
1234
- let d2 = l2.multiply(o2);
1235
- return c2 = c2.add(a2.shiftRightUnsigned(32)), a2 = new Ht(a2.getLowBits(), 0).add(s2).add(d2.shiftRightUnsigned(32)), c2 = c2.add(a2.shiftRightUnsigned(32)), d2 = a2.shiftLeft(32).add(new Ht(d2.getLowBits(), 0)), { high: c2, low: d2 };
1236
- })(p2, Ht.fromString("100000000000000000"));
1237
- g2.low = g2.low.add(y2), (function(t2, e2) {
1238
- const n2 = t2.high >>> 0, l2 = e2.high >>> 0;
1239
- if (n2 < l2) return true;
1240
- if (n2 === l2 && t2.low >>> 0 < e2.low >>> 0) return true;
1241
- return false;
1242
- })(g2.low, y2) && (g2.high = g2.high.add(Ht.fromNumber(1))), X2 = h2 + 6176;
1243
- const Y2 = { low: Ht.fromNumber(0), high: Ht.fromNumber(0) };
1244
- g2.high.shiftRightUnsigned(49).and(Ht.fromNumber(1)).equals(Ht.fromNumber(1)) ? (Y2.high = Y2.high.or(Ht.fromNumber(3).shiftLeft(61)), Y2.high = Y2.high.or(Ht.fromNumber(X2).and(Ht.fromNumber(16383).shiftLeft(47))), Y2.high = Y2.high.or(g2.high.and(Ht.fromNumber(140737488355327)))) : (Y2.high = Y2.high.or(Ht.fromNumber(16383 & X2).shiftLeft(49)), Y2.high = Y2.high.or(g2.high.and(Ht.fromNumber(562949953421311)))), Y2.low = g2.low, n && (Y2.high = Y2.high.or(Ht.fromString("9223372036854775808")));
1245
- const I2 = ht.allocateUnsafe(16);
1246
- return G2 = 0, I2[G2++] = 255 & Y2.low.low, I2[G2++] = Y2.low.low >> 8 & 255, I2[G2++] = Y2.low.low >> 16 & 255, I2[G2++] = Y2.low.low >> 24 & 255, I2[G2++] = 255 & Y2.low.high, I2[G2++] = Y2.low.high >> 8 & 255, I2[G2++] = Y2.low.high >> 16 & 255, I2[G2++] = Y2.low.high >> 24 & 255, I2[G2++] = 255 & Y2.high.low, I2[G2++] = Y2.high.low >> 8 & 255, I2[G2++] = Y2.high.low >> 16 & 255, I2[G2++] = Y2.high.low >> 24 & 255, I2[G2++] = 255 & Y2.high.high, I2[G2++] = Y2.high.high >> 8 & 255, I2[G2++] = Y2.high.high >> 16 & 255, I2[G2++] = Y2.high.high >> 24 & 255, new _At(I2);
1247
- }
1248
- toString() {
1249
- let t, e = 0;
1250
- const n = new Array(36);
1251
- for (let t2 = 0; t2 < n.length; t2++) n[t2] = 0;
1252
- let l, i2, o, c = 0, a = false, s = { parts: [0, 0, 0, 0] };
1253
- const d = [];
1254
- c = 0;
1255
- const b = this.bytes, Z = b[c++] | b[c++] << 8 | b[c++] << 16 | b[c++] << 24, m = b[c++] | b[c++] << 8 | b[c++] << 16 | b[c++] << 24, r = b[c++] | b[c++] << 8 | b[c++] << 16 | b[c++] << 24, u2 = b[c++] | b[c++] << 8 | b[c++] << 16 | b[c++] << 24;
1256
- c = 0;
1257
- ({ low: new Ht(Z, m), high: new Ht(r, u2) }).high.lessThan(Ht.ZERO) && d.push("-");
1258
- const h2 = u2 >> 26 & 31;
1259
- if (h2 >> 3 == 3) {
1260
- if (30 === h2) return d.join("") + "Infinity";
1261
- if (31 === h2) return "NaN";
1262
- t = u2 >> 15 & 16383, l = 8 + (u2 >> 14 & 1);
1263
- } else l = u2 >> 14 & 7, t = u2 >> 17 & 16383;
1264
- const p2 = t - 6176;
1265
- if (s.parts[0] = (16383 & u2) + ((15 & l) << 14), s.parts[1] = r, s.parts[2] = m, s.parts[3] = Z, 0 === s.parts[0] && 0 === s.parts[1] && 0 === s.parts[2] && 0 === s.parts[3]) a = true;
1266
- else for (o = 3; o >= 0; o--) {
1267
- let t2 = 0;
1268
- const e2 = _t(s);
1269
- if (s = e2.quotient, t2 = e2.rem.low, t2) for (i2 = 8; i2 >= 0; i2--) n[9 * o + i2] = t2 % 10, t2 = Math.floor(t2 / 10);
1270
- }
1271
- if (a) e = 1, n[c] = 0;
1272
- else for (e = 36; !n[c]; ) e -= 1, c += 1;
1273
- const y2 = e - 1 + p2;
1274
- if (y2 >= 34 || y2 <= -7 || p2 > 0) {
1275
- if (e > 34) return d.push("0"), p2 > 0 ? d.push(`E+${p2}`) : p2 < 0 && d.push(`E${p2}`), d.join("");
1276
- d.push(`${n[c++]}`), e -= 1, e && d.push(".");
1277
- for (let t2 = 0; t2 < e; t2++) d.push(`${n[c++]}`);
1278
- d.push("E"), y2 > 0 ? d.push(`+${y2}`) : d.push(`${y2}`);
1279
- } else if (p2 >= 0) for (let t2 = 0; t2 < e; t2++) d.push(`${n[c++]}`);
1280
- else {
1281
- let t2 = e + p2;
1282
- if (t2 > 0) for (let e2 = 0; e2 < t2; e2++) d.push(`${n[c++]}`);
1283
- else d.push("0");
1284
- for (d.push("."); t2++ < 0; ) d.push("0");
1285
- for (let l2 = 0; l2 < e - Math.max(t2 - 1, 0); l2++) d.push(`${n[c++]}`);
1286
- }
1287
- return d.join("");
1288
- }
1289
- toJSON() {
1290
- return { $numberDecimal: this.toString() };
1291
- }
1292
- toExtendedJSON() {
1293
- return { $numberDecimal: this.toString() };
1294
- }
1295
- static fromExtendedJSON(t) {
1296
- return _At.fromString(t.$numberDecimal);
1297
- }
1298
- inspect(t, e, n) {
1299
- n ??= V;
1300
- return `new Decimal128(${n(this.toString(), e)})`;
1301
- }
1302
- };
1303
- var $t = class _$t extends yt {
1304
- get _bsontype() {
1305
- return "Double";
1306
- }
1307
- value;
1308
- constructor(t) {
1309
- super(), t instanceof Number && (t = t.valueOf()), this.value = +t;
1310
- }
1311
- static fromString(t) {
1312
- const e = Number(t);
1313
- if ("NaN" === t) return new _$t(NaN);
1314
- if ("Infinity" === t) return new _$t(1 / 0);
1315
- if ("-Infinity" === t) return new _$t(-1 / 0);
1316
- if (!Number.isFinite(e)) throw new q(`Input: ${t} is not representable as a Double`);
1317
- if (t.trim() !== t) throw new q(`Input: '${t}' contains whitespace`);
1318
- if ("" === t) throw new q("Input is an empty string");
1319
- if (/[^-0-9.+eE]/.test(t)) throw new q(`Input: '${t}' is not in decimal or exponential notation`);
1320
- return new _$t(e);
1321
- }
1322
- valueOf() {
1323
- return this.value;
1324
- }
1325
- toJSON() {
1326
- return this.value;
1327
- }
1328
- toString(t) {
1329
- return this.value.toString(t);
1330
- }
1331
- toExtendedJSON(t) {
1332
- return t && (t.legacy || t.relaxed && isFinite(this.value)) ? this.value : Object.is(Math.sign(this.value), -0) ? { $numberDouble: "-0.0" } : { $numberDouble: Number.isInteger(this.value) ? this.value.toFixed(1) : this.value.toString() };
1333
- }
1334
- static fromExtendedJSON(t, e) {
1335
- const n = parseFloat(t.$numberDouble);
1336
- return e && e.relaxed ? n : new _$t(n);
1337
- }
1338
- inspect(t, e, n) {
1339
- return n ??= V, `new Double(${n(this.value, e)})`;
1340
- }
1341
- };
1342
- var qt = class _qt extends yt {
1343
- get _bsontype() {
1344
- return "Int32";
1345
- }
1346
- value;
1347
- constructor(t) {
1348
- super(), t instanceof Number && (t = t.valueOf()), this.value = 0 | +t;
1349
- }
1350
- static fromString(t) {
1351
- const e = Tt(t), n = Number(t);
1352
- if (g < n) throw new q(`Input: '${t}' is larger than the maximum value for Int32`);
1353
- if (Y > n) throw new q(`Input: '${t}' is smaller than the minimum value for Int32`);
1354
- if (!Number.isSafeInteger(n)) throw new q(`Input: '${t}' is not a safe integer`);
1355
- if (n.toString() !== e) throw new q(`Input: '${t}' is not a valid Int32 string`);
1356
- return new _qt(n);
1357
- }
1358
- valueOf() {
1359
- return this.value;
1360
- }
1361
- toString(t) {
1362
- return this.value.toString(t);
1363
- }
1364
- toJSON() {
1365
- return this.value;
1366
- }
1367
- toExtendedJSON(t) {
1368
- return t && (t.relaxed || t.legacy) ? this.value : { $numberInt: this.value.toString() };
1369
- }
1370
- static fromExtendedJSON(t, e) {
1371
- return e && e.relaxed ? parseInt(t.$numberInt, 10) : new _qt(t.$numberInt);
1372
- }
1373
- inspect(t, e, n) {
1374
- return n ??= V, `new Int32(${n(this.value, e)})`;
1375
- }
1376
- };
1377
- var te = class _te extends yt {
1378
- get _bsontype() {
1379
- return "MaxKey";
1380
- }
1381
- toExtendedJSON() {
1382
- return { $maxKey: 1 };
1383
- }
1384
- static fromExtendedJSON() {
1385
- return new _te();
1386
- }
1387
- inspect() {
1388
- return "new MaxKey()";
1389
- }
1390
- };
1391
- var ee = class _ee extends yt {
1392
- get _bsontype() {
1393
- return "MinKey";
1394
- }
1395
- toExtendedJSON() {
1396
- return { $minKey: 1 };
1397
- }
1398
- static fromExtendedJSON() {
1399
- return new _ee();
1400
- }
1401
- inspect() {
1402
- return "new MinKey()";
1403
- }
1404
- };
1405
- var ne = null;
1406
- var le = /* @__PURE__ */ new WeakMap();
1407
- var ie = class _ie extends yt {
1408
- get _bsontype() {
1409
- return "ObjectId";
1410
- }
1411
- static index = Math.floor(16777215 * Math.random());
1412
- static cacheHexString;
1413
- buffer;
1414
- constructor(t) {
1415
- let e;
1416
- if (super(), "object" == typeof t && t && "id" in t) {
1417
- if ("string" != typeof t.id && !ArrayBuffer.isView(t.id)) throw new q("Argument passed in must have an id that is of type string or Buffer");
1418
- e = "toHexString" in t && "function" == typeof t.toHexString ? ht.fromHex(t.toHexString()) : t.id;
1419
- } else e = t;
1420
- if (null == e) this.buffer = _ie.generate();
1421
- else if (ArrayBuffer.isView(e) && 12 === e.byteLength) this.buffer = ht.toLocalBufferType(e);
1422
- else {
1423
- if ("string" != typeof e) throw new q("Argument passed in does not match the accepted types");
1424
- if (!_ie.validateHexString(e)) throw new q("input must be a 24 character hex string, 12 byte Uint8Array, or an integer");
1425
- this.buffer = ht.fromHex(e), _ie.cacheHexString && le.set(this, e);
1426
- }
1427
- }
1428
- get id() {
1429
- return this.buffer;
1430
- }
1431
- set id(t) {
1432
- this.buffer = t, _ie.cacheHexString && le.set(this, ht.toHex(t));
1433
- }
1434
- static validateHexString(t) {
1435
- if (24 !== t?.length) return false;
1436
- for (let e = 0; e < 24; e++) {
1437
- const n = t.charCodeAt(e);
1438
- if (!(n >= 48 && n <= 57 || n >= 97 && n <= 102 || n >= 65 && n <= 70)) return false;
1439
- }
1440
- return true;
1441
- }
1442
- toHexString() {
1443
- if (_ie.cacheHexString) {
1444
- const t2 = le.get(this);
1445
- if (t2) return t2;
1446
- }
1447
- const t = ht.toHex(this.id);
1448
- return _ie.cacheHexString && le.set(this, t), t;
1449
- }
1450
- static getInc() {
1451
- return _ie.index = (_ie.index + 1) % 16777215;
1452
- }
1453
- static generate(t) {
1454
- "number" != typeof t && (t = Math.floor(Date.now() / 1e3));
1455
- const e = _ie.getInc(), n = ht.allocateUnsafe(12);
1456
- return Wt.setInt32BE(n, 0, t), null === ne && (ne = ht.randomBytes(5)), n[4] = ne[0], n[5] = ne[1], n[6] = ne[2], n[7] = ne[3], n[8] = ne[4], n[11] = 255 & e, n[10] = e >> 8 & 255, n[9] = e >> 16 & 255, n;
1457
- }
1458
- toString(t) {
1459
- return "base64" === t ? ht.toBase64(this.id) : this.toHexString();
1460
- }
1461
- toJSON() {
1462
- return this.toHexString();
1463
- }
1464
- static is(t) {
1465
- return null != t && "object" == typeof t && "_bsontype" in t && "ObjectId" === t._bsontype;
1466
- }
1467
- equals(t) {
1468
- if (null == t) return false;
1469
- if (_ie.is(t)) return this.buffer[11] === t.buffer[11] && ht.equals(this.buffer, t.buffer);
1470
- if ("string" == typeof t) return t.toLowerCase() === this.toHexString();
1471
- if ("object" == typeof t && "function" == typeof t.toHexString) {
1472
- const e = t.toHexString(), n = this.toHexString();
1473
- return "string" == typeof e && e.toLowerCase() === n;
1474
- }
1475
- return false;
1476
- }
1477
- getTimestamp() {
1478
- const t = /* @__PURE__ */ new Date(), e = Wt.getUint32BE(this.buffer, 0);
1479
- return t.setTime(1e3 * Math.floor(e)), t;
1480
- }
1481
- static createPk() {
1482
- return new _ie();
1483
- }
1484
- serializeInto(t, e) {
1485
- return t[e] = this.buffer[0], t[e + 1] = this.buffer[1], t[e + 2] = this.buffer[2], t[e + 3] = this.buffer[3], t[e + 4] = this.buffer[4], t[e + 5] = this.buffer[5], t[e + 6] = this.buffer[6], t[e + 7] = this.buffer[7], t[e + 8] = this.buffer[8], t[e + 9] = this.buffer[9], t[e + 10] = this.buffer[10], t[e + 11] = this.buffer[11], 12;
1486
- }
1487
- static createFromTime(t) {
1488
- const e = ht.allocate(12);
1489
- for (let t2 = 11; t2 >= 4; t2--) e[t2] = 0;
1490
- return Wt.setInt32BE(e, 0, t), new _ie(e);
1491
- }
1492
- static createFromHexString(t) {
1493
- if (24 !== t?.length) throw new q("hex string must be 24 characters");
1494
- return new _ie(ht.fromHex(t));
1495
- }
1496
- static createFromBase64(t) {
1497
- if (16 !== t?.length) throw new q("base64 string must be 16 characters");
1498
- return new _ie(ht.fromBase64(t));
1499
- }
1500
- static isValid(t) {
1501
- if (null == t) return false;
1502
- if ("string" == typeof t) return _ie.validateHexString(t);
1503
- try {
1504
- return new _ie(t), true;
1505
- } catch {
1506
- return false;
1507
- }
1508
- }
1509
- toExtendedJSON() {
1510
- return this.toHexString ? { $oid: this.toHexString() } : { $oid: this.toString("hex") };
1511
- }
1512
- static fromExtendedJSON(t) {
1513
- return new _ie(t.$oid);
1514
- }
1515
- isCached() {
1516
- return _ie.cacheHexString && le.has(this);
1517
- }
1518
- inspect(t, e, n) {
1519
- return n ??= V, `new ObjectId(${n(this.toHexString(), e)})`;
1520
- }
1521
- };
1522
- function oe(t, e, n) {
1523
- let l = 5;
1524
- if (Array.isArray(t)) for (let i2 = 0; i2 < t.length; i2++) l += ce(i2.toString(), t[i2], e, true, n);
1525
- else {
1526
- "function" == typeof t?.toBSON && (t = t.toBSON());
1527
- for (const i2 of Object.keys(t)) l += ce(i2, t[i2], e, false, n);
1528
- }
1529
- return l;
1530
- }
1531
- function ce(t, e, n = false, l = false, i2 = false) {
1532
- switch ("function" == typeof e?.toBSON && (e = e.toBSON()), typeof e) {
1533
- case "string":
1534
- return 1 + ht.utf8ByteLength(t) + 1 + 4 + ht.utf8ByteLength(e) + 1;
1535
- case "number":
1536
- return Math.floor(e) === e && e >= S && e <= J && e >= Y && e <= g ? (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 5 : (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 9;
1537
- case "undefined":
1538
- return l || !i2 ? (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 1 : 0;
1539
- case "boolean":
1540
- return (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 2;
1541
- case "object":
1542
- if (null != e && "string" == typeof e._bsontype && e[f] !== W) throw new tt();
1543
- if (null == e || "MinKey" === e._bsontype || "MaxKey" === e._bsontype) return (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 1;
1544
- if ("ObjectId" === e._bsontype) return (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 13;
1545
- if (e instanceof Date || G(e)) return (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 9;
1546
- if (ArrayBuffer.isView(e) || e instanceof ArrayBuffer || p(e)) return (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 6 + e.byteLength;
1547
- if ("Long" === e._bsontype || "Double" === e._bsontype || "Timestamp" === e._bsontype) return (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 9;
1548
- if ("Decimal128" === e._bsontype) return (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 17;
1549
- if ("Code" === e._bsontype) return null != e.scope && Object.keys(e.scope).length > 0 ? (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 1 + 4 + 4 + ht.utf8ByteLength(e.code.toString()) + 1 + oe(e.scope, n, i2) : (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 1 + 4 + ht.utf8ByteLength(e.code.toString()) + 1;
1550
- if ("Binary" === e._bsontype) {
1551
- const n2 = e;
1552
- return n2.sub_type === ft.SUBTYPE_BYTE_ARRAY ? (null != t ? ht.utf8ByteLength(t) + 1 : 0) + (n2.position + 1 + 4 + 1 + 4) : (null != t ? ht.utf8ByteLength(t) + 1 : 0) + (n2.position + 1 + 4 + 1);
1553
- }
1554
- if ("Symbol" === e._bsontype) return (null != t ? ht.utf8ByteLength(t) + 1 : 0) + ht.utf8ByteLength(e.value) + 4 + 1 + 1;
1555
- if ("DBRef" === e._bsontype) {
1556
- const l2 = Object.assign({ $ref: e.collection, $id: e.oid }, e.fields);
1557
- return null != e.db && (l2.$db = e.db), (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 1 + oe(l2, n, i2);
1558
- }
1559
- return e instanceof RegExp || y(e) ? (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 1 + ht.utf8ByteLength(e.source) + 1 + (e.global ? 1 : 0) + (e.ignoreCase ? 1 : 0) + (e.multiline ? 1 : 0) + 1 : "BSONRegExp" === e._bsontype ? (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 1 + ht.utf8ByteLength(e.pattern) + 1 + ht.utf8ByteLength(e.options) + 1 : (null != t ? ht.utf8ByteLength(t) + 1 : 0) + oe(e, n, i2) + 1;
1560
- case "function":
1561
- return n ? (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 1 + 4 + ht.utf8ByteLength(e.toString()) + 1 : 0;
1562
- case "bigint":
1563
- return (null != t ? ht.utf8ByteLength(t) + 1 : 0) + 9;
1564
- case "symbol":
1565
- return 0;
1566
- default:
1567
- throw new q("Unrecognized JS type: " + typeof e);
1568
- }
1569
- }
1570
- var ae = class _ae extends yt {
1571
- get _bsontype() {
1572
- return "BSONRegExp";
1573
- }
1574
- pattern;
1575
- options;
1576
- constructor(t, e) {
1577
- if (super(), this.pattern = t, this.options = (e ?? "").split("").sort().join(""), -1 !== this.pattern.indexOf("\0")) throw new q(`BSON Regex patterns cannot contain null bytes, found: ${JSON.stringify(this.pattern)}`);
1578
- if (-1 !== this.options.indexOf("\0")) throw new q(`BSON Regex options cannot contain null bytes, found: ${JSON.stringify(this.options)}`);
1579
- for (let t2 = 0; t2 < this.options.length; t2++) if ("i" !== this.options[t2] && "m" !== this.options[t2] && "x" !== this.options[t2] && "l" !== this.options[t2] && "s" !== this.options[t2] && "u" !== this.options[t2]) throw new q(`The regular expression option [${this.options[t2]}] is not supported`);
1580
- }
1581
- static parseOptions(t) {
1582
- return t ? t.split("").sort().join("") : "";
1583
- }
1584
- toExtendedJSON(t) {
1585
- return (t = t || {}).legacy ? { $regex: this.pattern, $options: this.options } : { $regularExpression: { pattern: this.pattern, options: this.options } };
1586
- }
1587
- static fromExtendedJSON(t) {
1588
- if ("$regex" in t) {
1589
- if ("string" == typeof t.$regex) return new _ae(t.$regex, _ae.parseOptions(t.$options));
1590
- if ("BSONRegExp" === t.$regex._bsontype) return t;
1591
- }
1592
- if ("$regularExpression" in t) return new _ae(t.$regularExpression.pattern, _ae.parseOptions(t.$regularExpression.options));
1593
- throw new q(`Unexpected BSONRegExp EJSON object form: ${JSON.stringify(t)}`);
1594
- }
1595
- inspect(t, e, n) {
1596
- const l = (function(t2) {
1597
- if (null != t2 && "object" == typeof t2 && "stylize" in t2 && "function" == typeof t2.stylize) return t2.stylize;
1598
- })(e) ?? ((t2) => t2);
1599
- n ??= V;
1600
- return `new BSONRegExp(${l(n(this.pattern), "regexp")}, ${l(n(this.options), "regexp")})`;
1601
- }
1602
- };
1603
- var se = class _se extends yt {
1604
- get _bsontype() {
1605
- return "BSONSymbol";
1606
- }
1607
- value;
1608
- constructor(t) {
1609
- super(), this.value = t;
1610
- }
1611
- valueOf() {
1612
- return this.value;
1613
- }
1614
- toString() {
1615
- return this.value;
1616
- }
1617
- toJSON() {
1618
- return this.value;
1619
- }
1620
- toExtendedJSON() {
1621
- return { $symbol: this.value };
1622
- }
1623
- static fromExtendedJSON(t) {
1624
- return new _se(t.$symbol);
1625
- }
1626
- inspect(t, e, n) {
1627
- return n ??= V, `new BSONSymbol(${n(this.value, e)})`;
1628
- }
1629
- };
1630
- var de = Ht;
1631
- var be = class _be extends de {
1632
- get _bsontype() {
1633
- return "Timestamp";
1634
- }
1635
- get [pt]() {
1636
- return "Timestamp";
1637
- }
1638
- static MAX_VALUE = Ht.MAX_UNSIGNED_VALUE;
1639
- get i() {
1640
- return this.low >>> 0;
1641
- }
1642
- get t() {
1643
- return this.high >>> 0;
1644
- }
1645
- constructor(t) {
1646
- if (null == t) super(0, 0, true);
1647
- else if ("bigint" == typeof t) super(t, true);
1648
- else if (Ht.isLong(t)) super(t.low, t.high, true);
1649
- else {
1650
- if ("object" != typeof t || !("t" in t) || !("i" in t)) throw new q("A Timestamp can only be constructed with: bigint, Long, or { t: number; i: number }");
1651
- {
1652
- if ("number" != typeof t.t && ("object" != typeof t.t || "Int32" !== t.t._bsontype)) throw new q("Timestamp constructed from { t, i } must provide t as a number");
1653
- if ("number" != typeof t.i && ("object" != typeof t.i || "Int32" !== t.i._bsontype)) throw new q("Timestamp constructed from { t, i } must provide i as a number");
1654
- const e = Number(t.t), n = Number(t.i);
1655
- if (e < 0 || Number.isNaN(e)) throw new q("Timestamp constructed from { t, i } must provide a positive t");
1656
- if (n < 0 || Number.isNaN(n)) throw new q("Timestamp constructed from { t, i } must provide a positive i");
1657
- if (e > 4294967295) throw new q("Timestamp constructed from { t, i } must provide t equal or less than uint32 max");
1658
- if (n > 4294967295) throw new q("Timestamp constructed from { t, i } must provide i equal or less than uint32 max");
1659
- super(n, e, true);
1660
- }
1661
- }
1662
- }
1663
- toJSON() {
1664
- return { $timestamp: this.toString() };
1665
- }
1666
- static fromInt(t) {
1667
- return new _be(Ht.fromInt(t, true));
1668
- }
1669
- static fromNumber(t) {
1670
- return new _be(Ht.fromNumber(t, true));
1671
- }
1672
- static fromBits(t, e) {
1673
- return new _be({ i: t, t: e });
1674
- }
1675
- static fromString(t, e) {
1676
- return new _be(Ht.fromString(t, true, e));
1677
- }
1678
- toExtendedJSON() {
1679
- return { $timestamp: { t: this.t, i: this.i } };
1680
- }
1681
- static fromExtendedJSON(t) {
1682
- const e = Ht.isLong(t.$timestamp.i) ? t.$timestamp.i.getLowBitsUnsigned() : t.$timestamp.i, n = Ht.isLong(t.$timestamp.t) ? t.$timestamp.t.getLowBitsUnsigned() : t.$timestamp.t;
1683
- return new _be({ t: n, i: e });
1684
- }
1685
- inspect(t, e, n) {
1686
- n ??= V;
1687
- return `new Timestamp({ t: ${n(this.t, e)}, i: ${n(this.i, e)} })`;
1688
- }
1689
- };
1690
- var Ze = Ht.fromNumber(J);
1691
- var me = Ht.fromNumber(S);
1692
- function re(t, e, n) {
1693
- const l = (e = null == e ? {} : e) && e.index ? e.index : 0, i2 = Wt.getInt32LE(t, l);
1694
- if (i2 < 5) throw new q(`bson size must be >= 5, is ${i2}`);
1695
- if (e.allowObjectSmallerThanBufferSize && t.length < i2) throw new q(`buffer length ${t.length} must be >= bson size ${i2}`);
1696
- if (!e.allowObjectSmallerThanBufferSize && t.length !== i2) throw new q(`buffer length ${t.length} must === bson size ${i2}`);
1697
- if (i2 + l > t.byteLength) throw new q(`(bson size ${i2} + options.index ${l} must be <= buffer length ${t.byteLength})`);
1698
- if (0 !== t[l + i2 - 1]) throw new q("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00");
1699
- return he(t, l, e, n);
1700
- }
1701
- var ue = /^\$ref$|^\$id$|^\$db$/;
1702
- function he(t, e, n, l = false) {
1703
- const i2 = null == n.fieldsAsRaw ? null : n.fieldsAsRaw, o = null != n.raw && n.raw, c = "boolean" == typeof n.bsonRegExp && n.bsonRegExp, a = n.promoteBuffers ?? false, s = n.promoteLongs ?? true, d = n.promoteValues ?? true, b = n.useBigInt64 ?? false;
1704
- if (b && !d) throw new q("Must either request bigint or Long for int64 deserialization");
1705
- if (b && !s) throw new q("Must either request bigint or Long for int64 deserialization");
1706
- let Z, m, r = true;
1707
- const u2 = (null == n.validation ? { utf8: true } : n.validation).utf8;
1708
- if ("boolean" == typeof u2) Z = u2;
1709
- else {
1710
- r = false;
1711
- const t2 = Object.keys(u2).map((function(t3) {
1712
- return u2[t3];
1713
- }));
1714
- if (0 === t2.length) throw new q("UTF-8 validation setting cannot be empty");
1715
- if ("boolean" != typeof t2[0]) throw new q("Invalid UTF-8 validation option, must specify boolean values");
1716
- if (Z = t2[0], !t2.every(((t3) => t3 === Z))) throw new q("Invalid UTF-8 validation option - keys must be all true or all false");
1717
- }
1718
- if (!r) {
1719
- m = /* @__PURE__ */ new Set();
1720
- for (const t2 of Object.keys(u2)) m.add(t2);
1721
- }
1722
- const h2 = e;
1723
- if (t.length < 5) throw new q("corrupt bson message < 5 bytes long");
1724
- const p2 = Wt.getInt32LE(t, e);
1725
- if (e += 4, p2 < 5 || p2 > t.length) throw new q("corrupt bson message");
1726
- const y2 = l ? [] : {};
1727
- let X2 = 0, G2 = !l && null;
1728
- for (; ; ) {
1729
- const u3 = t[e++];
1730
- if (0 === u3) break;
1731
- let h3 = e;
1732
- for (; 0 !== t[h3] && h3 < t.length; ) h3++;
1733
- if (h3 >= t.byteLength) throw new q("Bad BSON Document: illegal CString");
1734
- const p3 = l ? X2++ : ht.toUTF8(t, e, h3, false);
1735
- let V2, W2 = true;
1736
- if (W2 = r || m?.has(p3) ? Z : !Z, false !== G2 && "$" === p3[0] && (G2 = ue.test(p3)), e = h3 + 1, u3 === T) {
1737
- const n2 = Wt.getInt32LE(t, e);
1738
- if (e += 4, n2 <= 0 || n2 > t.length - e || 0 !== t[e + n2 - 1]) throw new q("bad string length in bson");
1739
- V2 = ht.toUTF8(t, e, e + n2 - 1, W2), e += n2;
1740
- } else if (u3 === N) {
1741
- const n2 = ht.allocateUnsafe(12);
1742
- for (let l2 = 0; l2 < 12; l2++) n2[l2] = t[e + l2];
1743
- V2 = new ie(n2), e += 12;
1744
- } else if (u3 === P && false === d) V2 = new qt(Wt.getInt32LE(t, e)), e += 4;
1745
- else if (u3 === P) V2 = Wt.getInt32LE(t, e), e += 4;
1746
- else if (u3 === K) V2 = Wt.getFloat64LE(t, e), e += 8, false === d && (V2 = new $t(V2));
1747
- else if (u3 === k) {
1748
- const n2 = Wt.getInt32LE(t, e), l2 = Wt.getInt32LE(t, e + 4);
1749
- e += 8, V2 = new Date(new Ht(n2, l2).toNumber());
1750
- } else if (u3 === w) {
1751
- if (0 !== t[e] && 1 !== t[e]) throw new q("illegal boolean type value");
1752
- V2 = 1 === t[e++];
1753
- } else if (u3 === L) {
1754
- const l2 = e, i3 = Wt.getInt32LE(t, e);
1755
- if (i3 <= 0 || i3 > t.length - e) throw new q("bad embedded document length in bson");
1756
- if (o) V2 = t.subarray(e, e + i3);
1757
- else {
1758
- let e2 = n;
1759
- r || (e2 = { ...n, validation: { utf8: W2 } }), V2 = he(t, l2, e2, false);
1760
- }
1761
- e += i3;
1762
- } else if (u3 === z) {
1763
- const l2 = e, o2 = Wt.getInt32LE(t, e);
1764
- let c2 = n;
1765
- const a2 = e + o2;
1766
- if (i2 && i2[p3] && (c2 = { ...n, raw: true }), r || (c2 = { ...c2, validation: { utf8: W2 } }), V2 = he(t, l2, c2, true), 0 !== t[(e += o2) - 1]) throw new q("invalid array terminator byte");
1767
- if (e !== a2) throw new q("corrupted array bson");
1768
- } else if (u3 === U) V2 = void 0;
1769
- else if (u3 === H) V2 = null;
1770
- else if (u3 === Q) if (b) V2 = Wt.getBigInt64LE(t, e), e += 8;
1771
- else {
1772
- const n2 = Wt.getInt32LE(t, e), l2 = Wt.getInt32LE(t, e + 4);
1773
- e += 8;
1774
- const i3 = new Ht(n2, l2);
1775
- V2 = s && true === d && i3.lessThanOrEqual(Ze) && i3.greaterThanOrEqual(me) ? i3.toNumber() : i3;
1776
- }
1777
- else if (u3 === O) {
1778
- const n2 = ht.allocateUnsafe(16);
1779
- for (let l2 = 0; l2 < 16; l2++) n2[l2] = t[e + l2];
1780
- e += 16, V2 = new At(n2);
1781
- } else if (u3 === x) {
1782
- let n2 = Wt.getInt32LE(t, e);
1783
- e += 4;
1784
- const l2 = n2, i3 = t[e++];
1785
- if (n2 < 0) throw new q("Negative binary type element size found");
1786
- if (n2 > t.byteLength) throw new q("Binary type size larger than document size");
1787
- if (i3 === ft.SUBTYPE_BYTE_ARRAY) {
1788
- if (n2 = Wt.getInt32LE(t, e), e += 4, n2 < 0) throw new q("Negative binary type element size found for subtype 0x02");
1789
- if (n2 > l2 - 4) throw new q("Binary type with subtype 0x02 contains too long binary size");
1790
- if (n2 < l2 - 4) throw new q("Binary type with subtype 0x02 contains too short binary size");
1791
- }
1792
- a && d ? V2 = ht.toLocalBufferType(t.subarray(e, e + n2)) : (V2 = new ft(t.subarray(e, e + n2), i3), i3 === A && Rt.isValid(V2) && (V2 = V2.toUUID())), e += n2;
1793
- } else if (u3 === C && false === c) {
1794
- for (h3 = e; 0 !== t[h3] && h3 < t.length; ) h3++;
1795
- if (h3 >= t.length) throw new q("Bad BSON Document: illegal CString");
1796
- const n2 = ht.toUTF8(t, e, h3, false);
1797
- for (h3 = e = h3 + 1; 0 !== t[h3] && h3 < t.length; ) h3++;
1798
- if (h3 >= t.length) throw new q("Bad BSON Document: illegal CString");
1799
- const l2 = ht.toUTF8(t, e, h3, false);
1800
- e = h3 + 1;
1801
- const i3 = new Array(l2.length);
1802
- for (h3 = 0; h3 < l2.length; h3++) switch (l2[h3]) {
1803
- case "m":
1804
- i3[h3] = "m";
1805
- break;
1806
- case "s":
1807
- i3[h3] = "g";
1808
- break;
1809
- case "i":
1810
- i3[h3] = "i";
1811
- }
1812
- V2 = new RegExp(n2, i3.join(""));
1813
- } else if (u3 === C && true === c) {
1814
- for (h3 = e; 0 !== t[h3] && h3 < t.length; ) h3++;
1815
- if (h3 >= t.length) throw new q("Bad BSON Document: illegal CString");
1816
- const n2 = ht.toUTF8(t, e, h3, false);
1817
- for (h3 = e = h3 + 1; 0 !== t[h3] && h3 < t.length; ) h3++;
1818
- if (h3 >= t.length) throw new q("Bad BSON Document: illegal CString");
1819
- const l2 = ht.toUTF8(t, e, h3, false);
1820
- e = h3 + 1, V2 = new ae(n2, l2);
1821
- } else if (u3 === j) {
1822
- const n2 = Wt.getInt32LE(t, e);
1823
- if (e += 4, n2 <= 0 || n2 > t.length - e || 0 !== t[e + n2 - 1]) throw new q("bad string length in bson");
1824
- const l2 = ht.toUTF8(t, e, e + n2 - 1, W2);
1825
- V2 = d ? l2 : new se(l2), e += n2;
1826
- } else if (u3 === F) V2 = new be({ i: Wt.getUint32LE(t, e), t: Wt.getUint32LE(t, e + 4) }), e += 8;
1827
- else if (u3 === E) V2 = new ee();
1828
- else if (u3 === _) V2 = new te();
1829
- else if (u3 === v) {
1830
- const n2 = Wt.getInt32LE(t, e);
1831
- if (e += 4, n2 <= 0 || n2 > t.length - e || 0 !== t[e + n2 - 1]) throw new q("bad string length in bson");
1832
- const l2 = ht.toUTF8(t, e, e + n2 - 1, W2);
1833
- V2 = new Jt(l2), e += n2;
1834
- } else if (u3 === M) {
1835
- const l2 = Wt.getInt32LE(t, e);
1836
- if (e += 4, l2 < 13) throw new q("code_w_scope total size shorter minimum expected length");
1837
- const i3 = Wt.getInt32LE(t, e);
1838
- if (e += 4, i3 <= 0 || i3 > t.length - e || 0 !== t[e + i3 - 1]) throw new q("bad string length in bson");
1839
- const o2 = ht.toUTF8(t, e, e + i3 - 1, W2), c2 = e += i3, a2 = Wt.getInt32LE(t, e), s2 = he(t, c2, n, false);
1840
- if (e += a2, l2 < 8 + a2 + i3) throw new q("code_w_scope total size is too short, truncating scope");
1841
- if (l2 > 8 + a2 + i3) throw new q("code_w_scope total size is too long, clips outer document");
1842
- V2 = new Jt(o2, s2);
1843
- } else {
1844
- if (u3 !== B) throw new q(`Detected unknown BSON type ${u3.toString(16)} for fieldname "${p3}"`);
1845
- {
1846
- const n2 = Wt.getInt32LE(t, e);
1847
- if (e += 4, n2 <= 0 || n2 > t.length - e || 0 !== t[e + n2 - 1]) throw new q("bad string length in bson");
1848
- const l2 = ht.toUTF8(t, e, e + n2 - 1, W2);
1849
- e += n2;
1850
- const i3 = ht.allocateUnsafe(12);
1851
- for (let n3 = 0; n3 < 12; n3++) i3[n3] = t[e + n3];
1852
- const o2 = new ie(i3);
1853
- e += 12, V2 = new Kt(l2, o2);
1854
- }
1855
- }
1856
- "__proto__" === p3 ? Object.defineProperty(y2, p3, { value: V2, writable: true, enumerable: true, configurable: true }) : y2[p3] = V2;
1857
- }
1858
- if (p2 !== e - h2) {
1859
- if (l) throw new q("corrupt array bson");
1860
- throw new q("corrupt object bson");
1861
- }
1862
- if (!G2) return y2;
1863
- if (St(y2)) {
1864
- const t2 = Object.assign({}, y2);
1865
- return delete t2.$ref, delete t2.$id, delete t2.$db, new Kt(y2.$ref, y2.$id, y2.$db, t2);
1866
- }
1867
- return y2;
1868
- }
1869
- var pe = /\x00/;
1870
- var ye = /* @__PURE__ */ new Set(["$db", "$ref", "$id", "$clusterTime"]);
1871
- function Xe(t, e, n, l) {
1872
- t[l++] = T;
1873
- t[(l = l + ht.encodeUTF8Into(t, e, l) + 1) - 1] = 0;
1874
- const i2 = ht.encodeUTF8Into(t, n, l + 4);
1875
- return Wt.setInt32LE(t, l, i2 + 1), l = l + 4 + i2, t[l++] = 0, l;
1876
- }
1877
- function Ge(t, e, n, l) {
1878
- const i2 = !Object.is(n, -0) && Number.isSafeInteger(n) && n <= g && n >= Y ? P : K;
1879
- t[l++] = i2;
1880
- return l += ht.encodeUTF8Into(t, e, l), t[l++] = 0, l += i2 === P ? Wt.setInt32LE(t, l, n) : Wt.setFloat64LE(t, l, n);
1881
- }
1882
- function Ve(t, e, n, l) {
1883
- t[l++] = Q;
1884
- return l += ht.encodeUTF8Into(t, e, l), t[l++] = 0, l += Wt.setBigInt64LE(t, l, n);
1885
- }
1886
- function We(t, e, n, l) {
1887
- t[l++] = H;
1888
- return l += ht.encodeUTF8Into(t, e, l), t[l++] = 0, l;
1889
- }
1890
- function fe(t, e, n, l) {
1891
- t[l++] = w;
1892
- return l += ht.encodeUTF8Into(t, e, l), t[l++] = 0, t[l++] = n ? 1 : 0, l;
1893
- }
1894
- function ge(t, e, n, l) {
1895
- t[l++] = k;
1896
- l += ht.encodeUTF8Into(t, e, l), t[l++] = 0;
1897
- const i2 = Ht.fromNumber(n.getTime()), o = i2.getLowBits(), c = i2.getHighBits();
1898
- return l += Wt.setInt32LE(t, l, o), l += Wt.setInt32LE(t, l, c);
1899
- }
1900
- function Ye(t, e, n, l) {
1901
- t[l++] = C;
1902
- if (l += ht.encodeUTF8Into(t, e, l), t[l++] = 0, n.source && null != n.source.match(pe)) throw new q("value " + n.source + " must not contain null bytes");
1903
- return l += ht.encodeUTF8Into(t, n.source, l), t[l++] = 0, n.ignoreCase && (t[l++] = 105), n.global && (t[l++] = 115), n.multiline && (t[l++] = 109), t[l++] = 0, l;
1904
- }
1905
- function Ie(t, e, n, l) {
1906
- t[l++] = C;
1907
- if (l += ht.encodeUTF8Into(t, e, l), t[l++] = 0, null != n.pattern.match(pe)) throw new q("pattern " + n.pattern + " must not contain null bytes");
1908
- l += ht.encodeUTF8Into(t, n.pattern, l), t[l++] = 0;
1909
- const i2 = n.options.split("").sort().join("");
1910
- return l += ht.encodeUTF8Into(t, i2, l), t[l++] = 0, l;
1911
- }
1912
- function Re(t, e, n, l) {
1913
- null === n ? t[l++] = H : "MinKey" === n._bsontype ? t[l++] = E : t[l++] = _;
1914
- return l += ht.encodeUTF8Into(t, e, l), t[l++] = 0, l;
1915
- }
1916
- function Je(t, e, n, l) {
1917
- t[l++] = N;
1918
- return l += ht.encodeUTF8Into(t, e, l), t[l++] = 0, l += n.serializeInto(t, l);
1919
- }
1920
- function Se(t, e, n, l) {
1921
- t[l++] = x;
1922
- l += ht.encodeUTF8Into(t, e, l), t[l++] = 0;
1923
- const i2 = n.length;
1924
- if (l += Wt.setInt32LE(t, l, i2), t[l++] = D, i2 <= 16) for (let e2 = 0; e2 < i2; e2++) t[l + e2] = n[e2];
1925
- else t.set(n, l);
1926
- return l += i2;
1927
- }
1928
- function Ke(t, e, n, l, i2, o, c, a, s) {
1929
- if (s.has(n)) throw new q("Cannot convert circular structure to BSON");
1930
- s.add(n), t[l++] = Array.isArray(n) ? z : L;
1931
- l += ht.encodeUTF8Into(t, e, l), t[l++] = 0;
1932
- const d = Ce(t, n, i2, l, o + 1, c, a, s);
1933
- return s.delete(n), d;
1934
- }
1935
- function Te(t, e, n, l) {
1936
- t[l++] = O;
1937
- l += ht.encodeUTF8Into(t, e, l), t[l++] = 0;
1938
- for (let e2 = 0; e2 < 16; e2++) t[l + e2] = n.bytes[e2];
1939
- return l + 16;
1940
- }
1941
- function Le(t, e, n, l) {
1942
- t[l++] = "Long" === n._bsontype ? Q : F;
1943
- l += ht.encodeUTF8Into(t, e, l), t[l++] = 0;
1944
- const i2 = n.getLowBits(), o = n.getHighBits();
1945
- return l += Wt.setInt32LE(t, l, i2), l += Wt.setInt32LE(t, l, o);
1946
- }
1947
- function ze(t, e, n, l) {
1948
- n = n.valueOf(), t[l++] = P;
1949
- return l += ht.encodeUTF8Into(t, e, l), t[l++] = 0, l += Wt.setInt32LE(t, l, n);
1950
- }
1951
- function xe(t, e, n, l) {
1952
- t[l++] = K;
1953
- return l += ht.encodeUTF8Into(t, e, l), t[l++] = 0, l += Wt.setFloat64LE(t, l, n.value);
1954
- }
1955
- function Ue(t, e, n, l) {
1956
- t[l++] = v;
1957
- l += ht.encodeUTF8Into(t, e, l), t[l++] = 0;
1958
- const i2 = n.toString(), o = ht.encodeUTF8Into(t, i2, l + 4) + 1;
1959
- return Wt.setInt32LE(t, l, o), l = l + 4 + o - 1, t[l++] = 0, l;
1960
- }
1961
- function Ne(t, e, n, l, i2 = false, o = 0, c = false, a = true, s) {
1962
- if (n.scope && "object" == typeof n.scope) {
1963
- t[l++] = M;
1964
- l += ht.encodeUTF8Into(t, e, l), t[l++] = 0;
1965
- let d = l;
1966
- const b = n.code;
1967
- l += 4;
1968
- const Z = ht.encodeUTF8Into(t, b, l + 4) + 1;
1969
- Wt.setInt32LE(t, l, Z), t[l + 4 + Z - 1] = 0, l = l + Z + 4;
1970
- const m = Ce(t, n.scope, i2, l, o + 1, c, a, s);
1971
- l = m - 1;
1972
- const r = m - d;
1973
- d += Wt.setInt32LE(t, d, r), t[l++] = 0;
1974
- } else {
1975
- t[l++] = v;
1976
- l += ht.encodeUTF8Into(t, e, l), t[l++] = 0;
1977
- const i3 = n.code.toString(), o2 = ht.encodeUTF8Into(t, i3, l + 4) + 1;
1978
- Wt.setInt32LE(t, l, o2), l = l + 4 + o2 - 1, t[l++] = 0;
1979
- }
1980
- return l;
1981
- }
1982
- function we(t, e, n, l) {
1983
- t[l++] = x;
1984
- l += ht.encodeUTF8Into(t, e, l), t[l++] = 0;
1985
- const i2 = n.buffer;
1986
- let o = n.position;
1987
- if (n.sub_type === ft.SUBTYPE_BYTE_ARRAY && (o += 4), l += Wt.setInt32LE(t, l, o), t[l++] = n.sub_type, n.sub_type === ft.SUBTYPE_BYTE_ARRAY && (o -= 4, l += Wt.setInt32LE(t, l, o)), n.sub_type === ft.SUBTYPE_VECTOR && gt(n), o <= 16) for (let e2 = 0; e2 < o; e2++) t[l + e2] = i2[e2];
1988
- else t.set(i2, l);
1989
- return l += n.position;
1990
- }
1991
- function ke(t, e, n, l) {
1992
- t[l++] = j;
1993
- l += ht.encodeUTF8Into(t, e, l), t[l++] = 0;
1994
- const i2 = ht.encodeUTF8Into(t, n.value, l + 4) + 1;
1995
- return Wt.setInt32LE(t, l, i2), l = l + 4 + i2 - 1, t[l++] = 0, l;
1996
- }
1997
- function He(t, e, n, l, i2, o, c) {
1998
- t[l++] = L;
1999
- l += ht.encodeUTF8Into(t, e, l), t[l++] = 0;
2000
- let a = l, s = { $ref: n.collection || n.namespace, $id: n.oid };
2001
- null != n.db && (s.$db = n.db), s = Object.assign(s, n.fields);
2002
- const d = Ce(t, s, false, l, i2 + 1, o, true, c), b = d - a;
2003
- return a += Wt.setInt32LE(t, l, b), d;
2004
- }
2005
- function Ce(t, e, n, l, i2, o, c, a) {
2006
- if (null == a) {
2007
- if (null == e) return t[0] = 5, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, 5;
2008
- if (Array.isArray(e)) throw new q("serialize does not support an array as the root input");
2009
- if ("object" != typeof e) throw new q("serialize does not support non-object as the root input");
2010
- if ("_bsontype" in e && "string" == typeof e._bsontype) throw new q("BSON types cannot be serialized as a document");
2011
- if (G(e) || y(e) || h(e) || p(e)) throw new q("date, regexp, typedarray, and arraybuffer cannot be BSON documents");
2012
- a = /* @__PURE__ */ new Set();
2013
- }
2014
- a.add(e);
2015
- let s = l + 4;
2016
- if (Array.isArray(e)) for (let l2 = 0; l2 < e.length; l2++) {
2017
- const d2 = `${l2}`;
2018
- let b = e[l2];
2019
- "function" == typeof b?.toBSON && (b = b.toBSON());
2020
- const Z = typeof b;
2021
- if (void 0 === b) s = We(t, d2, 0, s);
2022
- else if (null === b) s = We(t, d2, 0, s);
2023
- else if ("string" === Z) s = Xe(t, d2, b, s);
2024
- else if ("number" === Z) s = Ge(t, d2, b, s);
2025
- else if ("bigint" === Z) s = Ve(t, d2, b, s);
2026
- else if ("boolean" === Z) s = fe(t, d2, b, s);
2027
- else if ("object" === Z && null == b._bsontype) s = b instanceof Date || G(b) ? ge(t, d2, b, s) : b instanceof Uint8Array || h(b) ? Se(t, d2, b, s) : b instanceof RegExp || y(b) ? Ye(t, d2, b, s) : Ke(t, d2, b, s, n, i2, o, c, a);
2028
- else if ("object" === Z) {
2029
- if (b[f] !== W) throw new tt();
2030
- if ("ObjectId" === b._bsontype) s = Je(t, d2, b, s);
2031
- else if ("Decimal128" === b._bsontype) s = Te(t, d2, b, s);
2032
- else if ("Long" === b._bsontype || "Timestamp" === b._bsontype) s = Le(t, d2, b, s);
2033
- else if ("Double" === b._bsontype) s = xe(t, d2, b, s);
2034
- else if ("Code" === b._bsontype) s = Ne(t, d2, b, s, n, i2, o, c, a);
2035
- else if ("Binary" === b._bsontype) s = we(t, d2, b, s);
2036
- else if ("BSONSymbol" === b._bsontype) s = ke(t, d2, b, s);
2037
- else if ("DBRef" === b._bsontype) s = He(t, d2, b, s, i2, o, a);
2038
- else if ("BSONRegExp" === b._bsontype) s = Ie(t, d2, b, s);
2039
- else if ("Int32" === b._bsontype) s = ze(t, d2, b, s);
2040
- else if ("MinKey" === b._bsontype || "MaxKey" === b._bsontype) s = Re(t, d2, b, s);
2041
- else if (void 0 !== b._bsontype) throw new q(`Unrecognized or invalid _bsontype: ${String(b._bsontype)}`);
2042
- } else "function" === Z && o && (s = Ue(t, d2, b, s));
2043
- }
2044
- else if (e instanceof Map || X(e)) {
2045
- const l2 = e.entries();
2046
- let d2 = false;
2047
- for (; !d2; ) {
2048
- const e2 = l2.next();
2049
- if (d2 = !!e2.done, d2) continue;
2050
- const b = e2.value ? e2.value[0] : void 0;
2051
- let Z = e2.value ? e2.value[1] : void 0;
2052
- "function" == typeof Z?.toBSON && (Z = Z.toBSON());
2053
- const m = typeof Z;
2054
- if ("string" == typeof b && !ye.has(b)) {
2055
- if (null != b.match(pe)) throw new q("key " + b + " must not contain null bytes");
2056
- if (n) {
2057
- if ("$" === b[0]) throw new q("key " + b + " must not start with '$'");
2058
- if (b.includes(".")) throw new q("key " + b + " must not contain '.'");
2059
- }
2060
- }
2061
- if (void 0 === Z) false === c && (s = We(t, b, 0, s));
2062
- else if (null === Z) s = We(t, b, 0, s);
2063
- else if ("string" === m) s = Xe(t, b, Z, s);
2064
- else if ("number" === m) s = Ge(t, b, Z, s);
2065
- else if ("bigint" === m) s = Ve(t, b, Z, s);
2066
- else if ("boolean" === m) s = fe(t, b, Z, s);
2067
- else if ("object" === m && null == Z._bsontype) s = Z instanceof Date || G(Z) ? ge(t, b, Z, s) : Z instanceof Uint8Array || h(Z) ? Se(t, b, Z, s) : Z instanceof RegExp || y(Z) ? Ye(t, b, Z, s) : Ke(t, b, Z, s, n, i2, o, c, a);
2068
- else if ("object" === m) {
2069
- if (Z[f] !== W) throw new tt();
2070
- if ("ObjectId" === Z._bsontype) s = Je(t, b, Z, s);
2071
- else if ("Decimal128" === Z._bsontype) s = Te(t, b, Z, s);
2072
- else if ("Long" === Z._bsontype || "Timestamp" === Z._bsontype) s = Le(t, b, Z, s);
2073
- else if ("Double" === Z._bsontype) s = xe(t, b, Z, s);
2074
- else if ("Code" === Z._bsontype) s = Ne(t, b, Z, s, n, i2, o, c, a);
2075
- else if ("Binary" === Z._bsontype) s = we(t, b, Z, s);
2076
- else if ("BSONSymbol" === Z._bsontype) s = ke(t, b, Z, s);
2077
- else if ("DBRef" === Z._bsontype) s = He(t, b, Z, s, i2, o, a);
2078
- else if ("BSONRegExp" === Z._bsontype) s = Ie(t, b, Z, s);
2079
- else if ("Int32" === Z._bsontype) s = ze(t, b, Z, s);
2080
- else if ("MinKey" === Z._bsontype || "MaxKey" === Z._bsontype) s = Re(t, b, Z, s);
2081
- else if (void 0 !== Z._bsontype) throw new q(`Unrecognized or invalid _bsontype: ${String(Z._bsontype)}`);
2082
- } else "function" === m && o && (s = Ue(t, b, Z, s));
2083
- }
2084
- } else {
2085
- if ("function" == typeof e?.toBSON && null != (e = e.toBSON()) && "object" != typeof e) throw new q("toBSON function did not return an object");
2086
- for (const l2 of Object.keys(e)) {
2087
- let d2 = e[l2];
2088
- "function" == typeof d2?.toBSON && (d2 = d2.toBSON());
2089
- const b = typeof d2;
2090
- if ("string" == typeof l2 && !ye.has(l2)) {
2091
- if (null != l2.match(pe)) throw new q("key " + l2 + " must not contain null bytes");
2092
- if (n) {
2093
- if ("$" === l2[0]) throw new q("key " + l2 + " must not start with '$'");
2094
- if (l2.includes(".")) throw new q("key " + l2 + " must not contain '.'");
2095
- }
2096
- }
2097
- if (void 0 === d2) false === c && (s = We(t, l2, 0, s));
2098
- else if (null === d2) s = We(t, l2, 0, s);
2099
- else if ("string" === b) s = Xe(t, l2, d2, s);
2100
- else if ("number" === b) s = Ge(t, l2, d2, s);
2101
- else if ("bigint" === b) s = Ve(t, l2, d2, s);
2102
- else if ("boolean" === b) s = fe(t, l2, d2, s);
2103
- else if ("object" === b && null == d2._bsontype) s = d2 instanceof Date || G(d2) ? ge(t, l2, d2, s) : d2 instanceof Uint8Array || h(d2) ? Se(t, l2, d2, s) : d2 instanceof RegExp || y(d2) ? Ye(t, l2, d2, s) : Ke(t, l2, d2, s, n, i2, o, c, a);
2104
- else if ("object" === b) {
2105
- if (d2[f] !== W) throw new tt();
2106
- if ("ObjectId" === d2._bsontype) s = Je(t, l2, d2, s);
2107
- else if ("Decimal128" === d2._bsontype) s = Te(t, l2, d2, s);
2108
- else if ("Long" === d2._bsontype || "Timestamp" === d2._bsontype) s = Le(t, l2, d2, s);
2109
- else if ("Double" === d2._bsontype) s = xe(t, l2, d2, s);
2110
- else if ("Code" === d2._bsontype) s = Ne(t, l2, d2, s, n, i2, o, c, a);
2111
- else if ("Binary" === d2._bsontype) s = we(t, l2, d2, s);
2112
- else if ("BSONSymbol" === d2._bsontype) s = ke(t, l2, d2, s);
2113
- else if ("DBRef" === d2._bsontype) s = He(t, l2, d2, s, i2, o, a);
2114
- else if ("BSONRegExp" === d2._bsontype) s = Ie(t, l2, d2, s);
2115
- else if ("Int32" === d2._bsontype) s = ze(t, l2, d2, s);
2116
- else if ("MinKey" === d2._bsontype || "MaxKey" === d2._bsontype) s = Re(t, l2, d2, s);
2117
- else if (void 0 !== d2._bsontype) throw new q(`Unrecognized or invalid _bsontype: ${String(d2._bsontype)}`);
2118
- } else "function" === b && o && (s = Ue(t, l2, d2, s));
2119
- }
2120
- }
2121
- a.delete(e), t[s++] = 0;
2122
- const d = s - l;
2123
- return l += Wt.setInt32LE(t, l, d), s;
2124
- }
2125
- var Be = { $oid: ie, $binary: ft, $uuid: ft, $symbol: se, $numberInt: qt, $numberDecimal: At, $numberDouble: $t, $numberLong: Ht, $minKey: ee, $maxKey: te, $regex: ae, $regularExpression: ae, $timestamp: be };
2126
- function ve(t, e = {}) {
2127
- if ("number" == typeof t) {
2128
- const n2 = t <= g && t >= Y, l = t <= I && t >= R;
2129
- if (e.relaxed || e.legacy) return t;
2130
- if (Number.isInteger(t) && !Object.is(t, -0)) {
2131
- if (n2) return new qt(t);
2132
- if (l) return e.useBigInt64 ? BigInt(t) : Ht.fromNumber(t);
2133
- }
2134
- return new $t(t);
2135
- }
2136
- if (null == t || "object" != typeof t) return t;
2137
- if (t.$undefined) return null;
2138
- const n = Object.keys(t).filter(((e2) => e2.startsWith("$") && null != t[e2]));
2139
- for (let l = 0; l < n.length; l++) {
2140
- const i2 = Be[n[l]];
2141
- if (i2) return i2.fromExtendedJSON(t, e);
2142
- }
2143
- if (null != t.$date) {
2144
- const n2 = t.$date, l = /* @__PURE__ */ new Date();
2145
- if (e.legacy) if ("number" == typeof n2) l.setTime(n2);
2146
- else if ("string" == typeof n2) l.setTime(Date.parse(n2));
2147
- else {
2148
- if ("bigint" != typeof n2) throw new et("Unrecognized type for EJSON date: " + typeof n2);
2149
- l.setTime(Number(n2));
2150
- }
2151
- else if ("string" == typeof n2) l.setTime(Date.parse(n2));
2152
- else if (Ht.isLong(n2)) l.setTime(n2.toNumber());
2153
- else if ("number" == typeof n2 && e.relaxed) l.setTime(n2);
2154
- else {
2155
- if ("bigint" != typeof n2) throw new et("Unrecognized type for EJSON date: " + typeof n2);
2156
- l.setTime(Number(n2));
2157
- }
2158
- return l;
2159
- }
2160
- if (null != t.$code) {
2161
- const e2 = Object.assign({}, t);
2162
- return t.$scope && (e2.$scope = ve(t.$scope)), Jt.fromExtendedJSON(t);
2163
- }
2164
- if (St(t) || t.$dbPointer) {
2165
- const e2 = t.$ref ? t : t.$dbPointer;
2166
- if (e2 instanceof Kt) return e2;
2167
- const n2 = Object.keys(e2).filter(((t2) => t2.startsWith("$")));
2168
- let l = true;
2169
- if (n2.forEach(((t2) => {
2170
- -1 === ["$ref", "$id", "$db"].indexOf(t2) && (l = false);
2171
- })), l) return Kt.fromExtendedJSON(e2);
2172
- }
2173
- return t;
2174
- }
2175
- function je(t) {
2176
- const e = t.toISOString();
2177
- return 0 !== t.getUTCMilliseconds() ? e : e.slice(0, -5) + "Z";
2178
- }
2179
- function Me(t, e) {
2180
- if (t instanceof Map || X(t)) {
2181
- const n = /* @__PURE__ */ Object.create(null);
2182
- for (const [e2, l] of t) {
2183
- if ("string" != typeof e2) throw new q("Can only serialize maps with string keys");
2184
- n[e2] = l;
2185
- }
2186
- return Me(n, e);
2187
- }
2188
- if (("object" == typeof t || "function" == typeof t) && null !== t) {
2189
- const n = e.seenObjects.findIndex(((e2) => e2.obj === t));
2190
- if (-1 !== n) {
2191
- const t2 = e.seenObjects.map(((t3) => t3.propertyName)), l = t2.slice(0, n).map(((t3) => `${t3} -> `)).join(""), i2 = t2[n], o = " -> " + t2.slice(n + 1, t2.length - 1).map(((t3) => `${t3} -> `)).join(""), c = t2[t2.length - 1], a = " ".repeat(l.length + i2.length / 2), s = "-".repeat(o.length + (i2.length + c.length) / 2 - 1);
2192
- throw new q(`Converting circular structure to EJSON:
2193
- ${l}${i2}${o}${c}
2194
- ${a}\\${s}/`);
2195
- }
2196
- e.seenObjects[e.seenObjects.length - 1].obj = t;
2197
- }
2198
- if (Array.isArray(t)) return (function(t2, e2) {
2199
- return t2.map(((t3, n) => {
2200
- e2.seenObjects.push({ propertyName: `index ${n}`, obj: null });
2201
- try {
2202
- return Me(t3, e2);
2203
- } finally {
2204
- e2.seenObjects.pop();
2205
- }
2206
- }));
2207
- })(t, e);
2208
- if (void 0 === t) return e.ignoreUndefined ? void 0 : null;
2209
- if (t instanceof Date || G(t)) {
2210
- const n = t.getTime(), l = n > -1 && n < 2534023188e5;
2211
- return e.legacy ? e.relaxed && l ? { $date: t.getTime() } : { $date: je(t) } : e.relaxed && l ? { $date: je(t) } : { $date: { $numberLong: t.getTime().toString() } };
2212
- }
2213
- if (!("number" != typeof t || e.relaxed && isFinite(t))) {
2214
- if (Number.isInteger(t) && !Object.is(t, -0)) {
2215
- if (t >= Y && t <= g) return { $numberInt: t.toString() };
2216
- if (t >= R && t <= I) return { $numberLong: t.toString() };
2217
- }
2218
- return { $numberDouble: Object.is(t, -0) ? "-0.0" : t.toString() };
2219
- }
2220
- if ("bigint" == typeof t) return e.relaxed ? Number(BigInt.asIntN(64, t)) : { $numberLong: BigInt.asIntN(64, t).toString() };
2221
- if (t instanceof RegExp || y(t)) {
2222
- let n = t.flags;
2223
- if (void 0 === n) {
2224
- const e2 = t.toString().match(/[gimuy]*$/);
2225
- e2 && (n = e2[0]);
2226
- }
2227
- return new ae(t.source, n).toExtendedJSON(e);
2228
- }
2229
- return null != t && "object" == typeof t ? (function(t2, e2) {
2230
- if (null == t2 || "object" != typeof t2) throw new q("not an object instance");
2231
- const n = t2._bsontype;
2232
- if (void 0 === n) {
2233
- const n2 = {};
2234
- for (const l of Object.keys(t2)) {
2235
- e2.seenObjects.push({ propertyName: l, obj: null });
2236
- try {
2237
- const i2 = Me(t2[l], e2);
2238
- "__proto__" === l ? Object.defineProperty(n2, l, { value: i2, writable: true, enumerable: true, configurable: true }) : n2[l] = i2;
2239
- } finally {
2240
- e2.seenObjects.pop();
2241
- }
2242
- }
2243
- return n2;
2244
- }
2245
- if (null != t2 && "object" == typeof t2 && "string" == typeof t2._bsontype && t2[f] !== W) throw new tt();
2246
- if ((function(t3) {
2247
- return null != t3 && "object" == typeof t3 && "_bsontype" in t3 && "string" == typeof t3._bsontype;
2248
- })(t2)) {
2249
- let l = t2;
2250
- if ("function" != typeof l.toExtendedJSON) {
2251
- const e3 = Pe[t2._bsontype];
2252
- if (!e3) throw new q("Unrecognized or invalid _bsontype: " + t2._bsontype);
2253
- l = e3(l);
2254
- }
2255
- return "Code" === n && l.scope ? l = new Jt(l.code, Me(l.scope, e2)) : "DBRef" === n && l.oid && (l = new Kt(Me(l.collection, e2), Me(l.oid, e2), Me(l.db, e2), Me(l.fields, e2))), l.toExtendedJSON(e2);
2256
- }
2257
- throw new q("_bsontype must be a string, but was: " + typeof n);
2258
- })(t, e) : t;
2259
- }
2260
- var Pe = { Binary: (t) => new ft(t.value(), t.sub_type), Code: (t) => new Jt(t.code, t.scope), DBRef: (t) => new Kt(t.collection || t.namespace, t.oid, t.db, t.fields), Decimal128: (t) => new At(t.bytes), Double: (t) => new $t(t.value), Int32: (t) => new qt(t.value), Long: (t) => Ht.fromBits(null != t.low ? t.low : t.low_, null != t.low ? t.high : t.high_, null != t.low ? t.unsigned : t.unsigned_), MaxKey: () => new te(), MinKey: () => new ee(), ObjectId: (t) => new ie(t), BSONRegExp: (t) => new ae(t.pattern, t.options), BSONSymbol: (t) => new se(t.value), Timestamp: (t) => be.fromBits(t.low, t.high) };
2261
- function Fe(t, e) {
2262
- const n = { useBigInt64: e?.useBigInt64 ?? false, relaxed: e?.relaxed ?? true, legacy: e?.legacy ?? false };
2263
- return JSON.parse(t, ((t2, e2) => {
2264
- if (-1 !== t2.indexOf("\0")) throw new q(`BSON Document field names cannot contain null bytes, found: ${JSON.stringify(t2)}`);
2265
- return ve(e2, n);
2266
- }));
2267
- }
2268
- function Qe(t, e, n, l) {
2269
- null != n && "object" == typeof n && (l = n, n = 0), null == e || "object" != typeof e || Array.isArray(e) || (l = e, e = void 0, n = 0);
2270
- const i2 = Me(t, Object.assign({ relaxed: true, legacy: false }, l, { seenObjects: [{ propertyName: "(root)", obj: null }] }));
2271
- return JSON.stringify(i2, e, n);
2272
- }
2273
- var Oe = /* @__PURE__ */ Object.create(null);
2274
- Oe.parse = Fe, Oe.stringify = Qe, Oe.serialize = function(t, e) {
2275
- return e = e || {}, JSON.parse(Qe(t, e));
2276
- }, Oe.deserialize = function(t, e) {
2277
- return e = e || {}, Fe(JSON.stringify(t), e);
2278
- }, Object.freeze(Oe);
2279
- var Ee = 1;
2280
- var _e = 2;
2281
- var De = 3;
2282
- var Ae = 4;
2283
- var $e = 5;
2284
- var qe = 6;
2285
- var tn = 7;
2286
- var en = 8;
2287
- var nn = 9;
2288
- var ln = 10;
2289
- var on = 11;
2290
- var cn = 12;
2291
- var an = 13;
2292
- var sn = 14;
2293
- var dn = 15;
2294
- var bn = 16;
2295
- var Zn = 17;
2296
- var mn = 18;
2297
- var rn = 19;
2298
- var un = 255;
2299
- var hn = 127;
2300
- function pn(t, e) {
2301
- try {
2302
- return Wt.getNonnegativeInt32LE(t, e);
2303
- } catch (t2) {
2304
- throw new nt("BSON size cannot be negative", e, { cause: t2 });
2305
- }
2306
- }
2307
- function yn(t, e) {
2308
- let n = e;
2309
- for (; 0 !== t[n]; n++) ;
2310
- if (n === t.length - 1) throw new nt("Null terminator not found", e);
2311
- return n;
2312
- }
2313
- var Xn = /* @__PURE__ */ Object.create(null);
2314
- Xn.parseToElements = function(t, e = 0) {
2315
- if (e ??= 0, t.length < 5) throw new nt(`Input must be at least 5 bytes, got ${t.length} bytes`, e);
2316
- const n = pn(t, e);
2317
- if (n > t.length - e) throw new nt(`Parsed documentSize (${n} bytes) does not match input length (${t.length} bytes)`, e);
2318
- if (0 !== t[e + n - 1]) throw new nt("BSON documents must end in 0x00", e + n);
2319
- const l = [];
2320
- let i2 = e + 4;
2321
- for (; i2 <= n + e; ) {
2322
- const o = t[i2];
2323
- if (i2 += 1, 0 === o) {
2324
- if (i2 - e !== n) throw new nt("Invalid 0x00 type byte", i2);
2325
- break;
2326
- }
2327
- const c = i2, a = yn(t, i2) - c;
2328
- let s;
2329
- if (i2 += a + 1, o === Ee || o === mn || o === nn || o === Zn) s = 8;
2330
- else if (o === bn) s = 4;
2331
- else if (o === tn) s = 12;
2332
- else if (o === rn) s = 16;
2333
- else if (o === en) s = 1;
2334
- else if (o === ln || o === qe || o === hn || o === un) s = 0;
2335
- else if (o === on) s = yn(t, yn(t, i2) + 1) + 1 - i2;
2336
- else if (o === De || o === Ae || o === dn) s = pn(t, i2);
2337
- else {
2338
- if (o !== _e && o !== $e && o !== cn && o !== an && o !== sn) throw new nt(`Invalid 0x${o.toString(16).padStart(2, "0")} type byte`, i2);
2339
- s = pn(t, i2) + 4, o === $e && (s += 1), o === cn && (s += 12);
2340
- }
2341
- if (s > n) throw new nt("value reports length larger than document", i2);
2342
- l.push([o, c, a, i2, s]), i2 += s;
2343
- }
2344
- return l;
2345
- }, Xn.ByteUtils = ht, Xn.NumberUtils = Wt, Object.freeze(Xn);
2346
- var Gn = 17825792;
2347
- var Vn = ht.allocate(Gn);
2348
- var Wn = Object.freeze({ __proto__: null, BSONError: q, BSONOffsetError: nt, BSONRegExp: ae, BSONRuntimeError: et, BSONSymbol: se, BSONType: $, BSONValue: yt, BSONVersionError: tt, Binary: ft, ByteUtils: ht, Code: Jt, DBRef: Kt, Decimal128: At, Double: $t, EJSON: Oe, Int32: qt, Long: Ht, MaxKey: te, MinKey: ee, NumberUtils: Wt, ObjectId: ie, Timestamp: be, UUID: Rt, bsonType: pt, calculateObjectSize: function(t, e = {}) {
2349
- return oe(t, "boolean" == typeof (e = e || {}).serializeFunctions && e.serializeFunctions, "boolean" != typeof e.ignoreUndefined || e.ignoreUndefined);
2350
- }, deserialize: function(t, e = {}) {
2351
- return re(ht.toLocalBufferType(t), e);
2352
- }, deserializeStream: function(t, e, n, l, i2, o) {
2353
- const c = Object.assign({ allowObjectSmallerThanBufferSize: true, index: 0 }, o), a = ht.toLocalBufferType(t);
2354
- let s = e;
2355
- for (let t2 = 0; t2 < n; t2++) {
2356
- const e2 = Wt.getInt32LE(a, s);
2357
- c.index = s, l[i2 + t2] = re(a, c), s += e2;
2358
- }
2359
- return s;
2360
- }, onDemand: Xn, serialize: function(t, e = {}) {
2361
- const n = "boolean" == typeof e.checkKeys && e.checkKeys, l = "boolean" == typeof e.serializeFunctions && e.serializeFunctions, i2 = "boolean" != typeof e.ignoreUndefined || e.ignoreUndefined, o = "number" == typeof e.minInternalBufferSize ? e.minInternalBufferSize : Gn;
2362
- Vn.length < o && (Vn = ht.allocate(o));
2363
- const c = Ce(Vn, t, n, 0, 0, l, i2, null), a = ht.allocateUnsafe(c);
2364
- return a.set(Vn.subarray(0, c), 0), a;
2365
- }, serializeWithBufferAndIndex: function(t, e, n = {}) {
2366
- const l = "boolean" == typeof n.checkKeys && n.checkKeys, i2 = "boolean" == typeof n.serializeFunctions && n.serializeFunctions, o = "boolean" != typeof n.ignoreUndefined || n.ignoreUndefined, c = "number" == typeof n.index ? n.index : 0, a = Ce(Vn, t, l, 0, 0, i2, o, null);
2367
- return e.set(Vn.subarray(0, a), c), c + a - 1;
2368
- }, setInternalBufferSize: function(t) {
2369
- Vn.length < t && (Vn = ht.allocate(t));
2370
- } });
2371
- function fn(t) {
2372
- return !!t && "object" == typeof t && "buffer" in t && t.buffer instanceof ArrayBuffer && "number" == typeof t.byteOffset && "number" == typeof t.byteLength;
2373
- }
2374
- var In = class {
2375
- constructor() {
2376
- }
2377
- static urlConstructFrom(t) {
2378
- const e = "/ws/modeling/commands" + i({ video_res_width: t.video_res_width, video_res_height: t.video_res_height, fps: t.fps, unlocked_framerate: t.unlocked_framerate, post_effect: t.post_effect, webrtc: t.webrtc, pool: t.pool, show_grid: t.show_grid, replay: t.replay, api_call_id: t.api_call_id, order_independent_transparency: t.order_independent_transparency, pr: t.pr }), n = ((t.client?.baseUrl || "https://api.zoo.dev") + e).replace(/^http/, "ws");
2379
- return new URL(n);
2380
- }
2381
- static authenticate(t, e) {
2382
- const n = t.client && t.client.token || "";
2383
- if (n) try {
2384
- const t2 = { type: "headers", headers: { Authorization: `Bearer ${n}` } };
2385
- e.send(JSON.stringify(t2));
2386
- } catch {
2387
- }
2388
- }
2389
- static toBSON(t) {
2390
- return Wn.serialize(t);
2391
- }
2392
- static parseMessage(t) {
2393
- const e = t?.data;
2394
- if ("string" == typeof e) return JSON.parse(e);
2395
- if ("undefined" != typeof Buffer && Buffer.isBuffer?.(e)) {
2396
- const t2 = e;
2397
- try {
2398
- return JSON.parse(t2.toString("utf8"));
2399
- } catch {
2400
- }
2401
- return Wn.deserialize(t2);
2402
- }
2403
- if (e instanceof ArrayBuffer) {
2404
- const t2 = new Uint8Array(e);
2405
- try {
2406
- const e2 = new TextDecoder().decode(t2);
2407
- return JSON.parse(e2);
2408
- } catch {
2409
- }
2410
- return Wn.deserialize(t2);
2411
- }
2412
- if (fn(e)) {
2413
- const t2 = new Uint8Array(e.buffer, e.byteOffset, e.byteLength);
2414
- try {
2415
- const e2 = new TextDecoder().decode(t2);
2416
- return JSON.parse(e2);
2417
- } catch {
2418
- }
2419
- return Wn.deserialize(t2);
2420
- }
2421
- return e;
2422
- }
2423
- };
2424
- var Cn = null;
2425
- try {
2426
- Bn = "undefined" != typeof module && "function" == typeof module.require && module.require("worker_threads") || "function" == typeof __non_webpack_require__ && __non_webpack_require__("worker_threads") || "function" == typeof __require && __require("worker_threads");
2427
- Cn = Bn.Worker;
2428
- } catch (t) {
2429
- }
2430
- var Bn;
2431
- function vn(t, e, n) {
2432
- var l = void 0 === e ? null : e, i2 = (function(t2, e2) {
2433
- return Buffer.from(t2, "base64").toString(e2 ? "utf16" : "utf8");
2434
- })(t, void 0 !== n && n), o = i2.indexOf("\n", 10) + 1, c = i2.substring(o) + (l ? "//# sourceMappingURL=" + l : "");
2435
- return function(t2) {
2436
- return new Cn(c, Object.assign({}, t2, { eval: true }));
41
+ // src/index.ts
42
+ window.zoo ??= {};
43
+ window.zoo.kittycadWebViews ??= [];
44
+ var preventDefault = (e) => e.preventDefault();
45
+ var ZooWebView = class _ZooWebView extends EventTarget {
46
+ el;
47
+ rtc = void 0;
48
+ size;
49
+ state = "fresh" /* Fresh */;
50
+ constructor(args) {
51
+ super();
52
+ this.size = args.size;
53
+ const sizeAdjusted = {
54
+ width: args.size.width - args.size.width % 4,
55
+ height: args.size.height - args.size.height % 4
2437
56
  };
2438
- }
2439
- function jn(t, e, n) {
2440
- var l = void 0 === e ? null : e, i2 = (function(t2, e2) {
2441
- var n2 = atob(t2);
2442
- if (e2) {
2443
- for (var l2 = new Uint8Array(n2.length), i3 = 0, o2 = n2.length; i3 < o2; ++i3) l2[i3] = n2.charCodeAt(i3);
2444
- return new TextDecoder("utf-16le").decode(new Uint16Array(l2.buffer));
2445
- }
2446
- return n2;
2447
- })(t, void 0 !== n && n), o = i2.indexOf("\n", 10) + 1, c = i2.substring(o) + (l ? "//# sourceMappingURL=" + l : ""), a = new Blob([c], { type: "application/javascript" });
2448
- return URL.createObjectURL(a);
2449
- }
2450
- var Mn = "[object process]" === Object.prototype.toString.call("undefined" != typeof process ? process : 0);
2451
- function Pn(t, e, n) {
2452
- return Mn ? vn(t, e, n) : /* @__PURE__ */ (function(t2, e2, n2) {
2453
- var l;
2454
- return function(i2) {
2455
- return l = l || jn(t2, e2, n2), new Worker(l, i2);
2456
- };
2457
- })(t, e, n);
2458
- }
2459
- var Fn = Pn("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Y29uc3QgZT1uZXcgVGV4dEVuY29kZXI7ZnVuY3Rpb24gdCh0LG4scil7dC5sZW5ndGg+NTA/ZnVuY3Rpb24odCxuLHIpe2UuZW5jb2RlSW50byh0LG4uc3ViYXJyYXkocikpfSh0LG4scik6ZnVuY3Rpb24oZSx0LG4pe2NvbnN0IHI9ZS5sZW5ndGg7bGV0IGk9bixvPTA7Zm9yKDtvPHI7KXtsZXQgbj1lLmNoYXJDb2RlQXQobysrKTtpZig0Mjk0OTY3MTY4Jm4pe2lmKDQyOTQ5NjUyNDgmbil7aWYobj49NTUyOTYmJm48PTU2MzE5JiZvPHIpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KG8pOzU2MzIwPT0oNjQ1MTImdCkmJigrK28sbj0oKDEwMjMmbik8PDEwKSsoMTAyMyZ0KSs2NTUzNil9NDI5NDkwMTc2MCZuPyh0W2krK109bj4+MTgmN3wyNDAsdFtpKytdPW4+PjEyJjYzfDEyOCx0W2krK109bj4+NiY2M3wxMjgpOih0W2krK109bj4+MTImMTV8MjI0LHRbaSsrXT1uPj42JjYzfDEyOCl9ZWxzZSB0W2krK109bj4+NiYzMXwxOTI7dFtpKytdPTYzJm58MTI4fWVsc2UgdFtpKytdPW59fSh0LG4scil9bmV3IFRleHREZWNvZGVyO2NsYXNzIG57dHlwZTtkYXRhO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXR9fWNsYXNzIHIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdCB0PU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6ci5uYW1lfSl9fWZ1bmN0aW9uIGkoZSx0LG4pe2NvbnN0IHI9TWF0aC5mbG9vcihuLzQyOTQ5NjcyOTYpLGk9bjtlLnNldFVpbnQzMih0LHIpLGUuc2V0VWludDMyKHQrNCxpKX1jb25zdCBvPTQyOTQ5NjcyOTUscz0xNzE3OTg2OTE4Mztjb25zdCBhPXt0eXBlOi0xLGVuY29kZTpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgRGF0ZSl7cmV0dXJuIGZ1bmN0aW9uKHtzZWM6ZSxuc2VjOnR9KXtpZihlPj0wJiZ0Pj0wJiZlPD1zKXtpZigwPT09dCYmZTw9byl7Y29uc3QgdD1uZXcgVWludDhBcnJheSg0KTtyZXR1cm4gbmV3IERhdGFWaWV3KHQuYnVmZmVyKS5zZXRVaW50MzIoMCxlKSx0fXtjb25zdCBuPWUvNDI5NDk2NzI5NixyPTQyOTQ5NjcyOTUmZSxpPW5ldyBVaW50OEFycmF5KDgpLG89bmV3IERhdGFWaWV3KGkuYnVmZmVyKTtyZXR1cm4gby5zZXRVaW50MzIoMCx0PDwyfDMmbiksby5zZXRVaW50MzIoNCxyKSxpfX17Y29uc3Qgbj1uZXcgVWludDhBcnJheSgxMikscj1uZXcgRGF0YVZpZXcobi5idWZmZXIpO3JldHVybiByLnNldFVpbnQzMigwLHQpLGkociw0LGUpLG59fShmdW5jdGlvbihlKXtjb25zdCB0PWUuZ2V0VGltZSgpLG49TWF0aC5mbG9vcih0LzFlMykscj0xZTYqKHQtMWUzKm4pLGk9TWF0aC5mbG9vcihyLzFlOSk7cmV0dXJue3NlYzpuK2ksbnNlYzpyLTFlOSppfX0oZSkpfXJldHVybiBudWxsfSxkZWNvZGU6ZnVuY3Rpb24oZSl7Y29uc3QgdD1mdW5jdGlvbihlKXtjb25zdCB0PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtzd2l0Y2goZS5ieXRlTGVuZ3RoKXtjYXNlIDQ6cmV0dXJue3NlYzp0LmdldFVpbnQzMigwKSxuc2VjOjB9O2Nhc2UgODp7Y29uc3QgZT10LmdldFVpbnQzMigwKTtyZXR1cm57c2VjOjQyOTQ5NjcyOTYqKDMmZSkrdC5nZXRVaW50MzIoNCksbnNlYzplPj4+Mn19Y2FzZSAxMjp7Y29uc3QgZT1mdW5jdGlvbihlLHQpe3JldHVybiA0Mjk0OTY3Mjk2KmUuZ2V0SW50MzIodCkrZS5nZXRVaW50MzIodCs0KX0odCw0KTtyZXR1cm57c2VjOmUsbnNlYzp0LmdldFVpbnQzMigwKX19ZGVmYXVsdDp0aHJvdyBuZXcgcihgVW5yZWNvZ25pemVkIGRhdGEgc2l6ZSBmb3IgdGltZXN0YW1wIChleHBlY3RlZCA0LCA4LCBvciAxMik6ICR7ZS5sZW5ndGh9YCl9fShlKTtyZXR1cm4gbmV3IERhdGUoMWUzKnQuc2VjK3QubnNlYy8xZTYpfX07Y2xhc3MgY3tzdGF0aWMgZGVmYXVsdENvZGVjPW5ldyBjO19fYnJhbmQ7YnVpbHRJbkVuY29kZXJzPVtdO2J1aWx0SW5EZWNvZGVycz1bXTtlbmNvZGVycz1bXTtkZWNvZGVycz1bXTtjb25zdHJ1Y3Rvcigpe3RoaXMucmVnaXN0ZXIoYSl9cmVnaXN0ZXIoe3R5cGU6ZSxlbmNvZGU6dCxkZWNvZGU6bn0pe2lmKGU+PTApdGhpcy5lbmNvZGVyc1tlXT10LHRoaXMuZGVjb2RlcnNbZV09bjtlbHNle2NvbnN0IHI9LTEtZTt0aGlzLmJ1aWx0SW5FbmNvZGVyc1tyXT10LHRoaXMuYnVpbHRJbkRlY29kZXJzW3JdPW59fXRyeVRvRW5jb2RlKGUsdCl7Zm9yKGxldCByPTA7cjx0aGlzLmJ1aWx0SW5FbmNvZGVycy5sZW5ndGg7cisrKXtjb25zdCBpPXRoaXMuYnVpbHRJbkVuY29kZXJzW3JdO2lmKG51bGwhPWkpe2NvbnN0IG89aShlLHQpO2lmKG51bGwhPW8pe3JldHVybiBuZXcgbigtMS1yLG8pfX19Zm9yKGxldCByPTA7cjx0aGlzLmVuY29kZXJzLmxlbmd0aDtyKyspe2NvbnN0IGk9dGhpcy5lbmNvZGVyc1tyXTtpZihudWxsIT1pKXtjb25zdCBvPWkoZSx0KTtpZihudWxsIT1vKXtyZXR1cm4gbmV3IG4ocixvKX19fXJldHVybiBlIGluc3RhbmNlb2Ygbj9lOm51bGx9ZGVjb2RlKGUsdCxyKXtjb25zdCBpPXQ8MD90aGlzLmJ1aWx0SW5EZWNvZGVyc1stMS10XTp0aGlzLmRlY29kZXJzW3RdO3JldHVybiBpP2koZSx0LHIpOm5ldyBuKHQsZSl9fWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5P2U6QXJyYXlCdWZmZXIuaXNWaWV3KGUpP25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpOmZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJ1bmRlZmluZWQiIT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcn0oZSk/bmV3IFVpbnQ4QXJyYXkoZSk6VWludDhBcnJheS5mcm9tKGUpfWNsYXNzIGZ7ZXh0ZW5zaW9uQ29kZWM7Y29udGV4dDt1c2VCaWdJbnQ2NDttYXhEZXB0aDtpbml0aWFsQnVmZmVyU2l6ZTtzb3J0S2V5cztmb3JjZUZsb2F0MzI7aWdub3JlVW5kZWZpbmVkO2ZvcmNlSW50ZWdlclRvRmxvYXQ7cG9zO3ZpZXc7Ynl0ZXM7ZW50ZXJlZD0hMTtjb25zdHJ1Y3RvcihlKXt0aGlzLmV4dGVuc2lvbkNvZGVjPWU/LmV4dGVuc2lvbkNvZGVjPz9jLmRlZmF1bHRDb2RlYyx0aGlzLmNvbnRleHQ9ZT8uY29udGV4dCx0aGlzLnVzZUJpZ0ludDY0PWU/LnVzZUJpZ0ludDY0Pz8hMSx0aGlzLm1heERlcHRoPWU/Lm1heERlcHRoPz8xMDAsdGhpcy5pbml0aWFsQnVmZmVyU2l6ZT1lPy5pbml0aWFsQnVmZmVyU2l6ZT8/MjA0OCx0aGlzLnNvcnRLZXlzPWU/LnNvcnRLZXlzPz8hMSx0aGlzLmZvcmNlRmxvYXQzMj1lPy5mb3JjZUZsb2F0MzI/PyExLHRoaXMuaWdub3JlVW5kZWZpbmVkPWU/Lmlnbm9yZVVuZGVmaW5lZD8/ITEsdGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0PWU/LmZvcmNlSW50ZWdlclRvRmxvYXQ/PyExLHRoaXMucG9zPTAsdGhpcy52aWV3PW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIodGhpcy5pbml0aWFsQnVmZmVyU2l6ZSkpLHRoaXMuYnl0ZXM9bmV3IFVpbnQ4QXJyYXkodGhpcy52aWV3LmJ1ZmZlcil9Y2xvbmUoKXtyZXR1cm4gbmV3IGYoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxtYXhEZXB0aDp0aGlzLm1heERlcHRoLGluaXRpYWxCdWZmZXJTaXplOnRoaXMuaW5pdGlhbEJ1ZmZlclNpemUsc29ydEtleXM6dGhpcy5zb3J0S2V5cyxmb3JjZUZsb2F0MzI6dGhpcy5mb3JjZUZsb2F0MzIsaWdub3JlVW5kZWZpbmVkOnRoaXMuaWdub3JlVW5kZWZpbmVkLGZvcmNlSW50ZWdlclRvRmxvYXQ6dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0fSl9cmVpbml0aWFsaXplU3RhdGUoKXt0aGlzLnBvcz0wfWVuY29kZVNoYXJlZFJlZihlKXtpZih0aGlzLmVudGVyZWQpe3JldHVybiB0aGlzLmNsb25lKCkuZW5jb2RlU2hhcmVkUmVmKGUpfXRyeXtyZXR1cm4gdGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLmRvRW5jb2RlKGUsMSksdGhpcy5ieXRlcy5zdWJhcnJheSgwLHRoaXMucG9zKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZW5jb2RlKGUpe2lmKHRoaXMuZW50ZXJlZCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGUoZSl9dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoZSwxKSx0aGlzLmJ5dGVzLnNsaWNlKDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1kb0VuY29kZShlLHQpe2lmKHQ+dGhpcy5tYXhEZXB0aCl0aHJvdyBuZXcgRXJyb3IoYFRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggJHt0fWApO251bGw9PWU/dGhpcy5lbmNvZGVOaWwoKToiYm9vbGVhbiI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQm9vbGVhbihlKToibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0P3RoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTp0aGlzLmVuY29kZU51bWJlcihlKToic3RyaW5nIj09dHlwZW9mIGU/dGhpcy5lbmNvZGVTdHJpbmcoZSk6dGhpcy51c2VCaWdJbnQ2NCYmImJpZ2ludCI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQmlnSW50NjQoZSk6dGhpcy5lbmNvZGVPYmplY3QoZSx0KX1lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZShlKXtjb25zdCB0PXRoaXMucG9zK2U7dGhpcy52aWV3LmJ5dGVMZW5ndGg8dCYmdGhpcy5yZXNpemVCdWZmZXIoMip0KX1yZXNpemVCdWZmZXIoZSl7Y29uc3QgdD1uZXcgQXJyYXlCdWZmZXIoZSksbj1uZXcgVWludDhBcnJheSh0KSxyPW5ldyBEYXRhVmlldyh0KTtuLnNldCh0aGlzLmJ5dGVzKSx0aGlzLnZpZXc9cix0aGlzLmJ5dGVzPW59ZW5jb2RlTmlsKCl7dGhpcy53cml0ZVU4KDE5Mil9ZW5jb2RlQm9vbGVhbihlKXshMT09PWU/dGhpcy53cml0ZVU4KDE5NCk6dGhpcy53cml0ZVU4KDE5NSl9ZW5jb2RlTnVtYmVyKGUpeyF0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXQmJk51bWJlci5pc1NhZmVJbnRlZ2VyKGUpP2U+PTA/ZTwxMjg/dGhpcy53cml0ZVU4KGUpOmU8MjU2Pyh0aGlzLndyaXRlVTgoMjA0KSx0aGlzLndyaXRlVTgoZSkpOmU8NjU1MzY/KHRoaXMud3JpdGVVOCgyMDUpLHRoaXMud3JpdGVVMTYoZSkpOmU8NDI5NDk2NzI5Nj8odGhpcy53cml0ZVU4KDIwNiksdGhpcy53cml0ZVUzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVVNjQoZSkpOmU+PS0zMj90aGlzLndyaXRlVTgoMjI0fGUrMzIpOmU+PS0xMjg/KHRoaXMud3JpdGVVOCgyMDgpLHRoaXMud3JpdGVJOChlKSk6ZT49LTMyNzY4Pyh0aGlzLndyaXRlVTgoMjA5KSx0aGlzLndyaXRlSTE2KGUpKTplPj0tMjE0NzQ4MzY0OD8odGhpcy53cml0ZVU4KDIxMCksdGhpcy53cml0ZUkzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMTEpLHRoaXMud3JpdGVJNjQoZSkpOnRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKX1lbmNvZGVOdW1iZXJBc0Zsb2F0KGUpe3RoaXMuZm9yY2VGbG9hdDMyPyh0aGlzLndyaXRlVTgoMjAyKSx0aGlzLndyaXRlRjMyKGUpKToodGhpcy53cml0ZVU4KDIwMyksdGhpcy53cml0ZUY2NChlKSl9ZW5jb2RlQmlnSW50NjQoZSl7ZT49QmlnSW50KDApPyh0aGlzLndyaXRlVTgoMjA3KSx0aGlzLndyaXRlQmlnVWludDY0KGUpKToodGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUJpZ0ludDY0KGUpKX13cml0ZVN0cmluZ0hlYWRlcihlKXtpZihlPDMyKXRoaXMud3JpdGVVOCgxNjArZSk7ZWxzZSBpZihlPDI1Nil0aGlzLndyaXRlVTgoMjE3KSx0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDY1NTM2KXRoaXMud3JpdGVVOCgyMTgpLHRoaXMud3JpdGVVMTYoZSk7ZWxzZXtpZighKGU8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbG9uZyBzdHJpbmc6ICR7ZX0gYnl0ZXMgaW4gVVRGLThgKTt0aGlzLndyaXRlVTgoMjE5KSx0aGlzLndyaXRlVTMyKGUpfX1lbmNvZGVTdHJpbmcoZSl7Y29uc3Qgbj1mdW5jdGlvbihlKXtjb25zdCB0PWUubGVuZ3RoO2xldCBuPTAscj0wO2Zvcig7cjx0Oyl7bGV0IGk9ZS5jaGFyQ29kZUF0KHIrKyk7aWYoNDI5NDk2NzE2OCZpKWlmKDQyOTQ5NjUyNDgmaSl7aWYoaT49NTUyOTYmJmk8PTU2MzE5JiZyPHQpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KHIpOzU2MzIwPT0oNjQ1MTImdCkmJigrK3IsaT0oKDEwMjMmaSk8PDEwKSsoMTAyMyZ0KSs2NTUzNil9bis9NDI5NDkwMTc2MCZpPzQ6M31lbHNlIG4rPTI7ZWxzZSBuKyt9cmV0dXJuIG59KGUpO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNStuKSx0aGlzLndyaXRlU3RyaW5nSGVhZGVyKG4pLHQoZSx0aGlzLmJ5dGVzLHRoaXMucG9zKSx0aGlzLnBvcys9bn1lbmNvZGVPYmplY3QoZSx0KXtjb25zdCBuPXRoaXMuZXh0ZW5zaW9uQ29kZWMudHJ5VG9FbmNvZGUoZSx0aGlzLmNvbnRleHQpO2lmKG51bGwhPW4pdGhpcy5lbmNvZGVFeHRlbnNpb24obik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuZW5jb2RlQXJyYXkoZSx0KTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl0aGlzLmVuY29kZUJpbmFyeShlKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBvYmplY3Q6ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShlKX1gKTt0aGlzLmVuY29kZU1hcChlLHQpfX1lbmNvZGVCaW5hcnkoZSl7Y29uc3QgdD1lLmJ5dGVMZW5ndGg7aWYodDwyNTYpdGhpcy53cml0ZVU4KDE5NiksdGhpcy53cml0ZVU4KHQpO2Vsc2UgaWYodDw2NTUzNil0aGlzLndyaXRlVTgoMTk3KSx0aGlzLndyaXRlVTE2KHQpO2Vsc2V7aWYoISh0PDQyOTQ5NjcyOTYpKXRocm93IG5ldyBFcnJvcihgVG9vIGxhcmdlIGJpbmFyeTogJHt0fWApO3RoaXMud3JpdGVVOCgxOTgpLHRoaXMud3JpdGVVMzIodCl9Y29uc3Qgbj1sKGUpO3RoaXMud3JpdGVVOGEobil9ZW5jb2RlQXJyYXkoZSx0KXtjb25zdCBuPWUubGVuZ3RoO2lmKG48MTYpdGhpcy53cml0ZVU4KDE0NCtuKTtlbHNlIGlmKG48NjU1MzYpdGhpcy53cml0ZVU4KDIyMCksdGhpcy53cml0ZVUxNihuKTtlbHNle2lmKCEobjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBhcnJheTogJHtufWApO3RoaXMud3JpdGVVOCgyMjEpLHRoaXMud3JpdGVVMzIobil9Zm9yKGNvbnN0IG4gb2YgZSl0aGlzLmRvRW5jb2RlKG4sdCsxKX1jb3VudFdpdGhvdXRVbmRlZmluZWQoZSx0KXtsZXQgbj0wO2Zvcihjb25zdCByIG9mIHQpdm9pZCAwIT09ZVtyXSYmbisrO3JldHVybiBufWVuY29kZU1hcChlLHQpe2NvbnN0IG49T2JqZWN0LmtleXMoZSk7dGhpcy5zb3J0S2V5cyYmbi5zb3J0KCk7Y29uc3Qgcj10aGlzLmlnbm9yZVVuZGVmaW5lZD90aGlzLmNvdW50V2l0aG91dFVuZGVmaW5lZChlLG4pOm4ubGVuZ3RoO2lmKHI8MTYpdGhpcy53cml0ZVU4KDEyOCtyKTtlbHNlIGlmKHI8NjU1MzYpdGhpcy53cml0ZVU4KDIyMiksdGhpcy53cml0ZVUxNihyKTtlbHNle2lmKCEocjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBtYXAgb2JqZWN0OiAke3J9YCk7dGhpcy53cml0ZVU4KDIyMyksdGhpcy53cml0ZVUzMihyKX1mb3IoY29uc3QgciBvZiBuKXtjb25zdCBuPWVbcl07dGhpcy5pZ25vcmVVbmRlZmluZWQmJnZvaWQgMD09PW58fCh0aGlzLmVuY29kZVN0cmluZyhyKSx0aGlzLmRvRW5jb2RlKG4sdCsxKSl9fWVuY29kZUV4dGVuc2lvbihlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZS5kYXRhKXtjb25zdCB0PWUuZGF0YSh0aGlzLnBvcys2KSxuPXQubGVuZ3RoO2lmKG4+PTQyOTQ5NjcyOTYpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHtufWApO3JldHVybiB0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKG4pLHRoaXMud3JpdGVJOChlLnR5cGUpLHZvaWQgdGhpcy53cml0ZVU4YSh0KX1jb25zdCB0PWUuZGF0YS5sZW5ndGg7aWYoMT09PXQpdGhpcy53cml0ZVU4KDIxMik7ZWxzZSBpZigyPT09dCl0aGlzLndyaXRlVTgoMjEzKTtlbHNlIGlmKDQ9PT10KXRoaXMud3JpdGVVOCgyMTQpO2Vsc2UgaWYoOD09PXQpdGhpcy53cml0ZVU4KDIxNSk7ZWxzZSBpZigxNj09PXQpdGhpcy53cml0ZVU4KDIxNik7ZWxzZSBpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk5KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgyMDApLHRoaXMud3JpdGVVMTYodCk7ZWxzZXtpZighKHQ8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHt0fWApO3RoaXMud3JpdGVVOCgyMDEpLHRoaXMud3JpdGVVMzIodCl9dGhpcy53cml0ZUk4KGUudHlwZSksdGhpcy53cml0ZVU4YShlLmRhdGEpfXdyaXRlVTgoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgxKSx0aGlzLnZpZXcuc2V0VWludDgodGhpcy5wb3MsZSksdGhpcy5wb3MrK313cml0ZVU4YShlKXtjb25zdCB0PWUubGVuZ3RoO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUodCksdGhpcy5ieXRlcy5zZXQoZSx0aGlzLnBvcyksdGhpcy5wb3MrPXR9d3JpdGVJOChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDEpLHRoaXMudmlldy5zZXRJbnQ4KHRoaXMucG9zLGUpLHRoaXMucG9zKyt9d3JpdGVVMTYoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKSx0aGlzLnZpZXcuc2V0VWludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlSTE2KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMiksdGhpcy52aWV3LnNldEludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlVTMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldFVpbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUkzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRJbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUYzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRGbG9hdDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlRjY0KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCksdGhpcy52aWV3LnNldEZsb2F0NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVVNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxmdW5jdGlvbihlLHQsbil7Y29uc3Qgcj1uLzQyOTQ5NjcyOTYsaT1uO2Uuc2V0VWludDMyKHQsciksZS5zZXRVaW50MzIodCs0LGkpfSh0aGlzLnZpZXcsdGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVJNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxpKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUJpZ1VpbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdVaW50NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVCaWdJbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdJbnQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH19dHJ5e2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZmV0Y2gmJiJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy52ZXJzaW9ucz8ubm9kZSl7bmV3IEZ1bmN0aW9uKCJtIiwicmV0dXJuIGltcG9ydChtKSIpKCJjcm9zcy1mZXRjaC9wb2x5ZmlsbCIpLmNhdGNoKCgoKT0+e30pKX19Y2F0Y2h7fXRyeXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MudmVyc2lvbnM/Lm5vZGUmJiJ3aW4zMiI9PT1wcm9jZXNzLnBsYXRmb3JtKXtuZXcgRnVuY3Rpb24oIm0iLCJyZXR1cm4gaW1wb3J0KG0pIikoIndpbi1jYSIpfX1jYXRjaHt9Y29uc3QgdT0oKCk9Pntjb25zdCBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKSxTeW1ib2wudG9TdHJpbmdUYWcpLmdldDtyZXR1cm4gdD0+ZS5jYWxsKHQpfSkoKTtmdW5jdGlvbiBfKGUpe3JldHVybiJVaW50OEFycmF5Ij09PXUoZSl9ZnVuY3Rpb24gZyhlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYoIkFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXXx8IlNoYXJlZEFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSl9ZnVuY3Rpb24gaChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFJlZ0V4cHx8IltvYmplY3QgUmVnRXhwXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gYihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYiTWFwIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXX1mdW5jdGlvbiBkKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRGF0ZXx8IltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIHcoZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSwoKGUsdCk9PiJiaWdpbnQiPT10eXBlb2YgdD97JG51bWJlckxvbmc6YCR7dH1gfTpiKHQpP09iamVjdC5mcm9tRW50cmllcyh0KTp0KSl9Y29uc3QgcD03LHk9U3ltYm9sLmZvcigiQEBtZGIuYnNvbi52ZXJzaW9uIiksbT0yMTQ3NDgzNjQ3LFM9LTIxNDc0ODM2NDgsQj1NYXRoLnBvdygyLDYzKS0xLHg9LU1hdGgucG93KDIsNjMpLEU9TWF0aC5wb3coMiw1MyksVT0tTWF0aC5wb3coMiw1MyksTz0xLE49MixJPTMsdj00LFQ9NSwkPTYsTD03LEE9OCxSPTksaj0xMCxGPTExLGs9MTIsej0xMyxEPTE0LEM9MTUsTT0xNixWPTE3LFA9MTgsSj0xOSxXPTI1NSxZPTEyNyxxPTAsSD00LEs9T2JqZWN0LmZyZWV6ZSh7ZG91YmxlOjEsc3RyaW5nOjIsb2JqZWN0OjMsYXJyYXk6NCxiaW5EYXRhOjUsdW5kZWZpbmVkOjYsb2JqZWN0SWQ6Nyxib29sOjgsZGF0ZTo5LG51bGw6MTAscmVnZXg6MTEsZGJQb2ludGVyOjEyLGphdmFzY3JpcHQ6MTMsc3ltYm9sOjE0LGphdmFzY3JpcHRXaXRoU2NvcGU6MTUsaW50OjE2LHRpbWVzdGFtcDoxNyxsb25nOjE4LGRlY2ltYWw6MTksbWluS2V5Oi0xLG1heEtleToxMjd9KTtjbGFzcyBaIGV4dGVuZHMgRXJyb3J7Z2V0IGJzb25FcnJvcigpe3JldHVybiEwfWdldCBuYW1lKCl7cmV0dXJuIkJTT05FcnJvciJ9Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpfXN0YXRpYyBpc0JTT05FcnJvcihlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiYnNvbkVycm9yImluIGUmJiEwPT09ZS5ic29uRXJyb3ImJiJuYW1lImluIGUmJiJtZXNzYWdlImluIGUmJiJzdGFjayJpbiBlfX1jbGFzcyBHIGV4dGVuZHMgWntnZXQgbmFtZSgpe3JldHVybiJCU09OVmVyc2lvbkVycm9yIn1jb25zdHJ1Y3Rvcigpe3N1cGVyKGBVbnN1cHBvcnRlZCBCU09OIHZlcnNpb24sIGJzb24gdHlwZXMgbXVzdCBiZSBmcm9tIGJzb24gJHtwfS54LnhgKX19Y2xhc3MgWCBleHRlbmRzIFp7Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTlJ1bnRpbWVFcnJvciJ9Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9fWNsYXNzIFEgZXh0ZW5kcyBae2dldCBuYW1lKCl7cmV0dXJuIkJTT05PZmZzZXRFcnJvciJ9b2Zmc2V0O2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihgJHtlfS4gb2Zmc2V0OiAke3R9YCxuKSx0aGlzLm9mZnNldD10fX1sZXQgZWUsdGU7ZnVuY3Rpb24gbmUoZSx0LG4scil7aWYocil7ZWU/Pz1uZXcgVGV4dERlY29kZXIoInV0ZjgiLHtmYXRhbDohMH0pO3RyeXtyZXR1cm4gZWUuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9Y2F0Y2goZSl7dGhyb3cgbmV3IFooIkludmFsaWQgVVRGLTggc3RyaW5nIGluIEJTT04gZG9jdW1lbnQiLHtjYXVzZTplfSl9fXJldHVybiB0ZT8/PW5ldyBUZXh0RGVjb2RlcigidXRmOCIse2ZhdGFsOiExfSksdGUuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9ZnVuY3Rpb24gcmUoZSx0LG4pe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4iIjtjb25zdCByPW4tdDtpZigwPT09cilyZXR1cm4iIjtpZihyPjIwKXJldHVybiBudWxsO2lmKDE9PT1yJiZlW3RdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKTtpZigyPT09ciYmZVt0XTwxMjgmJmVbdCsxXTwxMjgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZVt0XSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMV0pO2lmKDM9PT1yJiZlW3RdPDEyOCYmZVt0KzFdPDEyOCYmZVt0KzJdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKStTdHJpbmcuZnJvbUNoYXJDb2RlKGVbdCsxXSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMl0pO2NvbnN0IGk9W107Zm9yKGxldCByPXQ7cjxuO3IrKyl7Y29uc3QgdD1lW3JdO2lmKHQ+MTI3KXJldHVybiBudWxsO2kucHVzaCh0KX1yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5pKX1mdW5jdGlvbiBpZShlKXtyZXR1cm4gYWUuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWZ1bmN0aW9uIG9lKGUpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFlLmFsbG9jYXRlKGUpKX1jb25zdCBzZT0oKCk9Pntjb25zdHtjcnlwdG86ZX09Z2xvYmFsVGhpcztyZXR1cm4gbnVsbCE9ZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0UmFuZG9tVmFsdWVzP29lOmllfSkoKSxhZT17aXNVaW50OEFycmF5Ol8sdG9Mb2NhbEJ1ZmZlclR5cGUoZSl7aWYoQnVmZmVyLmlzQnVmZmVyKGUpKXJldHVybiBlO2lmKEFycmF5QnVmZmVyLmlzVmlldyhlKSlyZXR1cm4gQnVmZmVyLmZyb20oZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7Y29uc3QgdD1lPy5bU3ltYm9sLnRvU3RyaW5nVGFnXT8/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpO2lmKCJBcnJheUJ1ZmZlciI9PT10fHwiU2hhcmVkQXJyYXlCdWZmZXIiPT09dHx8IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXR8fCJbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXSI9PT10KXJldHVybiBCdWZmZXIuZnJvbShlKTt0aHJvdyBuZXcgWigiQ2Fubm90IGNyZWF0ZSBCdWZmZXIgZnJvbSB0aGUgcGFzc2VkIHBvdGVudGlhbEJ1ZmZlci4iKX0sYWxsb2NhdGU6ZT0+QnVmZmVyLmFsbG9jKGUpLGFsbG9jYXRlVW5zYWZlOmU9PkJ1ZmZlci5hbGxvY1Vuc2FmZShlKSxjb21wYXJlOihlLHQpPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS5jb21wYXJlKHQpLGNvbmNhdDplPT5CdWZmZXIuY29uY2F0KGUpLGNvcHk6KGUsdCxuLHIsaSk9PmFlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLmNvcHkodCxuPz8wLHI/PzAsaT8/ZS5sZW5ndGgpLGVxdWFsczooZSx0KT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkuZXF1YWxzKHQpLGZyb21OdW1iZXJBcnJheTplPT5CdWZmZXIuZnJvbShlKSxmcm9tQmFzZTY0OmU9PkJ1ZmZlci5mcm9tKGUsImJhc2U2NCIpLGZyb21VVEY4OmU9PkJ1ZmZlci5mcm9tKGUsInV0ZjgiKSx0b0Jhc2U2NDplPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS50b1N0cmluZygiYmFzZTY0IiksZnJvbUlTTzg4NTkxOmU9PkJ1ZmZlci5mcm9tKGUsImJpbmFyeSIpLHRvSVNPODg1OTE6ZT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImJpbmFyeSIpLGZyb21IZXg6ZT0+QnVmZmVyLmZyb20oZSwiaGV4IiksdG9IZXg6ZT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImhleCIpLHRvVVRGOChlLHQsbixyKXtjb25zdCBpPW4tdDw9MjA/cmUoZSx0LG4pOm51bGw7aWYobnVsbCE9aSlyZXR1cm4gaTtjb25zdCBvPWFlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLnRvU3RyaW5nKCJ1dGY4Iix0LG4pO2lmKHIpZm9yKGxldCByPTA7cjxvLmxlbmd0aDtyKyspaWYoNjU1MzM9PT1vLmNoYXJDb2RlQXQocikpe25lKGUsdCxuLCEwKTticmVha31yZXR1cm4gb30sdXRmOEJ5dGVMZW5ndGg6ZT0+QnVmZmVyLmJ5dGVMZW5ndGgoZSwidXRmOCIpLGVuY29kZVVURjhJbnRvKGUsdCxuKXtjb25zdCByPWZ1bmN0aW9uKGUsdCxuKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIDA7aWYodC5sZW5ndGg+MjUpcmV0dXJuIG51bGw7aWYoZS5sZW5ndGgtbjx0Lmxlbmd0aClyZXR1cm4gbnVsbDtmb3IobGV0IHI9MCxpPW47cjx0Lmxlbmd0aDtyKyssaSsrKXtjb25zdCBuPXQuY2hhckNvZGVBdChyKTtpZihuPjEyNylyZXR1cm4gbnVsbDtlW2ldPW59cmV0dXJuIHQubGVuZ3RofShlLHQsbik7cmV0dXJuIG51bGwhPXI/cjphZS50b0xvY2FsQnVmZmVyVHlwZShlKS53cml0ZSh0LG4sdm9pZCAwLCJ1dGY4Iil9LHJhbmRvbUJ5dGVzOnNlLHN3YXAzMjplPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS5zd2FwMzIoKX07ZnVuY3Rpb24gY2UoZSl7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgYXJndW1lbnQgJ2J5dGVMZW5ndGgnIGlzIGludmFsaWQuIFJlY2VpdmVkICR7ZX1gKTtyZXR1cm4gdWUuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWNvbnN0IGxlPSgoKT0+e2NvbnN0e2NyeXB0bzplfT1nbG9iYWxUaGlzO2lmKG51bGwhPWUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldFJhbmRvbVZhbHVlcylyZXR1cm4gdD0+ZS5nZXRSYW5kb21WYWx1ZXModWUuYWxsb2NhdGUodCkpO2lmKGZ1bmN0aW9uKCl7Y29uc3R7bmF2aWdhdG9yOmV9PWdsb2JhbFRoaXM7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiYiUmVhY3ROYXRpdmUiPT09ZS5wcm9kdWN0fSgpKXtjb25zdHtjb25zb2xlOmV9PWdsb2JhbFRoaXM7ZT8ud2Fybj8uKCJCU09OOiBGb3IgUmVhY3QgTmF0aXZlIHBsZWFzZSBwb2x5ZmlsbCBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLCBlLmcuIHVzaW5nOiBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9yZWFjdC1uYXRpdmUtZ2V0LXJhbmRvbS12YWx1ZXMuIil9cmV0dXJuIGNlfSkoKSxmZT0vKFxkfFthLWZdKS9pLHVlPXtpc1VpbnQ4QXJyYXk6Xyx0b0xvY2FsQnVmZmVyVHlwZShlKXtjb25zdCB0PWU/LltTeW1ib2wudG9TdHJpbmdUYWddPz9PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7aWYoIlVpbnQ4QXJyYXkiPT09dClyZXR1cm4gZTtpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUuYnVmZmVyLnNsaWNlKGUuYnl0ZU9mZnNldCxlLmJ5dGVPZmZzZXQrZS5ieXRlTGVuZ3RoKSk7aWYoIkFycmF5QnVmZmVyIj09PXR8fCJTaGFyZWRBcnJheUJ1ZmZlciI9PT10fHwiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09dHx8IltvYmplY3QgU2hhcmVkQXJyYXlCdWZmZXJdIj09PXQpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUpO3Rocm93IG5ldyBaKCJDYW5ub3QgbWFrZSBhIFVpbnQ4QXJyYXkgZnJvbSBwYXNzZWQgcG90ZW50aWFsQnVmZmVyLiIpfSxhbGxvY2F0ZShlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhlICJzaXplIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCAke1N0cmluZyhlKX1gKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSl9LGFsbG9jYXRlVW5zYWZlOmU9PnVlLmFsbG9jYXRlKGUpLGNvbXBhcmUoZSx0KXtpZihlPT09dClyZXR1cm4gMDtjb25zdCBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPG47cisrKXtpZihlW3JdPHRbcl0pcmV0dXJuLTE7aWYoZVtyXT50W3JdKXJldHVybiAxfXJldHVybiBlLmxlbmd0aDx0Lmxlbmd0aD8tMTplLmxlbmd0aD50Lmxlbmd0aD8xOjB9LGNvbmNhdChlKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHVlLmFsbG9jYXRlKDApO2xldCB0PTA7Zm9yKGNvbnN0IG4gb2YgZSl0Kz1uLmxlbmd0aDtjb25zdCBuPXVlLmFsbG9jYXRlKHQpO2xldCByPTA7Zm9yKGNvbnN0IHQgb2YgZSluLnNldCh0LHIpLHIrPXQubGVuZ3RoO3JldHVybiBufSxjb3B5KGUsdCxuLHIsaSl7aWYodm9pZCAwIT09aSYmaTwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgdmFsdWUgb2YgInNvdXJjZUVuZCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAuIFJlY2VpdmVkICR7aX1gKTtpZihpPWk/P2UubGVuZ3RoLHZvaWQgMCE9PXImJihyPDB8fHI+aSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSB2YWx1ZSBvZiAic291cmNlU3RhcnQiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSA+PSAwIGFuZCA8PSAke2l9LiBSZWNlaXZlZCAke3J9YCk7aWYocj1yPz8wLHZvaWQgMCE9PW4mJm48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIHZhbHVlIG9mICJ0YXJnZXRTdGFydCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAuIFJlY2VpdmVkICR7bn1gKTtuPW4/PzA7Y29uc3Qgbz1lLnN1YmFycmF5KHIsaSkscz1NYXRoLm1pbihvLmxlbmd0aCx0Lmxlbmd0aC1uKTtyZXR1cm4gczw9MD8wOih0LnNldChvLnN1YmFycmF5KDAscyksbikscyl9LGVxdWFscyhlLHQpe2lmKGUuYnl0ZUxlbmd0aCE9PXQuYnl0ZUxlbmd0aClyZXR1cm4hMTtmb3IobGV0IG49MDtuPGUuYnl0ZUxlbmd0aDtuKyspaWYoZVtuXSE9PXRbbl0pcmV0dXJuITE7cmV0dXJuITB9LGZyb21OdW1iZXJBcnJheTplPT5VaW50OEFycmF5LmZyb20oZSksZnJvbUJhc2U2NDplPT5VaW50OEFycmF5LmZyb20oYXRvYihlKSwoZT0+ZS5jaGFyQ29kZUF0KDApKSksZnJvbVVURjg6ZT0+KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpLHRvQmFzZTY0OmU9PmJ0b2EodWUudG9JU084ODU5MShlKSksZnJvbUlTTzg4NTkxOmU9PlVpbnQ4QXJyYXkuZnJvbShlLChlPT4yNTUmZS5jaGFyQ29kZUF0KDApKSksdG9JU084ODU5MTplPT5BcnJheS5mcm9tKFVpbnQxNkFycmF5LmZyb20oZSksKGU9PlN0cmluZy5mcm9tQ2hhckNvZGUoZSkpKS5qb2luKCIiKSxmcm9tSGV4KGUpe2NvbnN0IHQ9ZS5sZW5ndGglMj09MD9lOmUuc2xpY2UoMCxlLmxlbmd0aC0xKSxuPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9Mil7Y29uc3Qgcj10W2VdLGk9dFtlKzFdO2lmKCFmZS50ZXN0KHIpKWJyZWFrO2lmKCFmZS50ZXN0KGkpKWJyZWFrO2NvbnN0IG89TnVtYmVyLnBhcnNlSW50KGAke3J9JHtpfWAsMTYpO24ucHVzaChvKX1yZXR1cm4gVWludDhBcnJheS5mcm9tKG4pfSx0b0hleDplPT5BcnJheS5mcm9tKGUsKGU9PmUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSkpLmpvaW4oIiIpLHRvVVRGOChlLHQsbixyKXtjb25zdCBpPW4tdDw9MjA/cmUoZSx0LG4pOm51bGw7cmV0dXJuIG51bGwhPWk/aTpuZShlLHQsbixyKX0sdXRmOEJ5dGVMZW5ndGg6ZT0+KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpLmJ5dGVMZW5ndGgsZW5jb2RlVVRGOEludG8oZSx0LG4pe2NvbnN0IHI9KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpO3JldHVybiBlLnNldChyLG4pLHIuYnl0ZUxlbmd0aH0scmFuZG9tQnl0ZXM6bGUsc3dhcDMyKGUpe2lmKGUubGVuZ3RoJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz00KXtjb25zdCBuPWVbdF0scj1lW3QrMV0saT1lW3QrMl0sbz1lW3QrM107ZVt0XT1vLGVbdCsxXT1pLGVbdCsyXT1yLGVbdCszXT1ufXJldHVybiBlfX0sX2U9ImZ1bmN0aW9uIj09dHlwZW9mIEJ1ZmZlciYmITAhPT1CdWZmZXIucHJvdG90eXBlPy5faXNCdWZmZXI/YWU6dWUsZ2U9U3ltYm9sLmZvcigiQEBtZGIuYnNvbi50eXBlIik7Y2xhc3MgaGV7Z2V0W2dlXSgpe3JldHVybiB0aGlzLl9ic29udHlwZX1nZXRbeV0oKXtyZXR1cm4gcH1bU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV0oZSx0LG4pe3JldHVybiB0aGlzLmluc3BlY3QoZSx0LG4pfX1jb25zdCBiZT1uZXcgRmxvYXQ2NEFycmF5KDEpLGRlPW5ldyBVaW50OEFycmF5KGJlLmJ1ZmZlciwwLDgpO2JlWzBdPS0xO2NvbnN0IHdlPTA9PT1kZVs3XSxwZT17aXNCaWdFbmRpYW46d2UsZ2V0Tm9ubmVnYXRpdmVJbnQzMkxFKGUsdCl7aWYoZVt0KzNdPjEyNyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU2l6ZSBjYW5ub3QgYmUgbmVnYXRpdmUgYXQgb2Zmc2V0OiAke3R9YCk7cmV0dXJuIGVbdF18ZVt0KzFdPDw4fGVbdCsyXTw8MTZ8ZVt0KzNdPDwyNH0sZ2V0SW50MzJMRTooZSx0KT0+ZVt0XXxlW3QrMV08PDh8ZVt0KzJdPDwxNnxlW3QrM108PDI0LGdldFVpbnQzMkxFOihlLHQpPT5lW3RdKzI1NiplW3QrMV0rNjU1MzYqZVt0KzJdKzE2Nzc3MjE2KmVbdCszXSxnZXRVaW50MzJCRTooZSx0KT0+ZVt0KzNdKzI1NiplW3QrMl0rNjU1MzYqZVt0KzFdKzE2Nzc3MjE2KmVbdF0sZ2V0QmlnSW50NjRMRTooZSx0KT0+KEJpZ0ludChlW3QrNF0rMjU2KmVbdCs1XSs2NTUzNiplW3QrNl0rKGVbdCs3XTw8MjQpKTw8MzJuKStCaWdJbnQoZVt0XSsyNTYqZVt0KzFdKzY1NTM2KmVbdCsyXSsxNjc3NzIxNiplW3QrM10pLGdldEZsb2F0NjRMRTp3ZT8oZSx0KT0+KGRlWzddPWVbdF0sZGVbNl09ZVt0KzFdLGRlWzVdPWVbdCsyXSxkZVs0XT1lW3QrM10sZGVbM109ZVt0KzRdLGRlWzJdPWVbdCs1XSxkZVsxXT1lW3QrNl0sZGVbMF09ZVt0KzddLGJlWzBdKTooZSx0KT0+KGRlWzBdPWVbdF0sZGVbMV09ZVt0KzFdLGRlWzJdPWVbdCsyXSxkZVszXT1lW3QrM10sZGVbNF09ZVt0KzRdLGRlWzVdPWVbdCs1XSxkZVs2XT1lW3QrNl0sZGVbN109ZVt0KzddLGJlWzBdKSxzZXRJbnQzMkJFOihlLHQsbik9PihlW3QrM109bixuPj4+PTgsZVt0KzJdPW4sbj4+Pj04LGVbdCsxXT1uLG4+Pj49OCxlW3RdPW4sNCksc2V0SW50MzJMRTooZSx0LG4pPT4oZVt0XT1uLG4+Pj49OCxlW3QrMV09bixuPj4+PTgsZVt0KzJdPW4sbj4+Pj04LGVbdCszXT1uLDQpLHNldEJpZ0ludDY0TEUoZSx0LG4pe2NvbnN0IHI9MHhmZmZmZmZmZm47bGV0IGk9TnVtYmVyKG4mcik7ZVt0XT1pLGk+Pj04LGVbdCsxXT1pLGk+Pj04LGVbdCsyXT1pLGk+Pj04LGVbdCszXT1pO2xldCBvPU51bWJlcihuPj4zMm4mcik7cmV0dXJuIGVbdCs0XT1vLG8+Pj04LGVbdCs1XT1vLG8+Pj04LGVbdCs2XT1vLG8+Pj04LGVbdCs3XT1vLDh9LHNldEZsb2F0NjRMRTp3ZT8oZSx0LG4pPT4oYmVbMF09bixlW3RdPWRlWzddLGVbdCsxXT1kZVs2XSxlW3QrMl09ZGVbNV0sZVt0KzNdPWRlWzRdLGVbdCs0XT1kZVszXSxlW3QrNV09ZGVbMl0sZVt0KzZdPWRlWzFdLGVbdCs3XT1kZVswXSw4KTooZSx0LG4pPT4oYmVbMF09bixlW3RdPWRlWzBdLGVbdCsxXT1kZVsxXSxlW3QrMl09ZGVbMl0sZVt0KzNdPWRlWzNdLGVbdCs0XT1kZVs0XSxlW3QrNV09ZGVbNV0sZVt0KzZdPWRlWzZdLGVbdCs3XT1kZVs3XSw4KX07Y2xhc3MgeWUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJpbmFyeSJ9c3RhdGljIEJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVD0wO3N0YXRpYyBCVUZGRVJfU0laRT0yNTY7c3RhdGljIFNVQlRZUEVfREVGQVVMVD0wO3N0YXRpYyBTVUJUWVBFX0ZVTkNUSU9OPTE7c3RhdGljIFNVQlRZUEVfQllURV9BUlJBWT0yO3N0YXRpYyBTVUJUWVBFX1VVSURfT0xEPTM7c3RhdGljIFNVQlRZUEVfVVVJRD00O3N0YXRpYyBTVUJUWVBFX01ENT01O3N0YXRpYyBTVUJUWVBFX0VOQ1JZUFRFRD02O3N0YXRpYyBTVUJUWVBFX0NPTFVNTj03O3N0YXRpYyBTVUJUWVBFX1NFTlNJVElWRT04O3N0YXRpYyBTVUJUWVBFX1ZFQ1RPUj05O3N0YXRpYyBTVUJUWVBFX1VTRVJfREVGSU5FRD0xMjg7c3RhdGljIFZFQ1RPUl9UWVBFPU9iamVjdC5mcmVlemUoe0ludDg6MyxGbG9hdDMyOjM5LFBhY2tlZEJpdDoxNn0pO2J1ZmZlcjtzdWJfdHlwZTtwb3NpdGlvbjtjb25zdHJ1Y3RvcihlLHQpe2lmKHN1cGVyKCksbnVsbCE9ZSYmInN0cmluZyI9PXR5cGVvZiBlJiYhQXJyYXlCdWZmZXIuaXNWaWV3KGUpJiYhZyhlKSYmIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFooIkJpbmFyeSBjYW4gb25seSBiZSBjb25zdHJ1Y3RlZCBmcm9tIFVpbnQ4QXJyYXkgb3IgbnVtYmVyW10iKTt0aGlzLnN1Yl90eXBlPXQ/P3llLkJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVCxudWxsPT1lPyh0aGlzLmJ1ZmZlcj1fZS5hbGxvY2F0ZSh5ZS5CVUZGRVJfU0laRSksdGhpcy5wb3NpdGlvbj0wKToodGhpcy5idWZmZXI9QXJyYXkuaXNBcnJheShlKT9fZS5mcm9tTnVtYmVyQXJyYXkoZSk6X2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSksdGhpcy5wb3NpdGlvbj10aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKX1wdXQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IFooIm9ubHkgYWNjZXB0cyBzaW5nbGUgY2hhcmFjdGVyIFN0cmluZyIpO2lmKCJudW1iZXIiIT10eXBlb2YgZSYmMSE9PWUubGVuZ3RoKXRocm93IG5ldyBaKCJvbmx5IGFjY2VwdHMgc2luZ2xlIGNoYXJhY3RlciBVaW50OEFycmF5IG9yIEFycmF5Iik7bGV0IHQ7aWYodD0ic3RyaW5nIj09dHlwZW9mIGU/ZS5jaGFyQ29kZUF0KDApOiJudW1iZXIiPT10eXBlb2YgZT9lOmVbMF0sdDwwfHx0PjI1NSl0aHJvdyBuZXcgWigib25seSBhY2NlcHRzIG51bWJlciBpbiBhIHZhbGlkIHVuc2lnbmVkIGJ5dGUgcmFuZ2UgMC0yNTUiKTtpZih0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPnRoaXMucG9zaXRpb24pdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10O2Vsc2V7Y29uc3QgZT1fZS5hbGxvY2F0ZSh5ZS5CVUZGRVJfU0laRSt0aGlzLmJ1ZmZlci5sZW5ndGgpO2Uuc2V0KHRoaXMuYnVmZmVyLDApLHRoaXMuYnVmZmVyPWUsdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10fX13cml0ZShlLHQpe2lmKHQ9Im51bWJlciI9PXR5cGVvZiB0P3Q6dGhpcy5wb3NpdGlvbix0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPHQrZS5sZW5ndGgpe2NvbnN0IHQ9X2UuYWxsb2NhdGUodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCtlLmxlbmd0aCk7dC5zZXQodGhpcy5idWZmZXIsMCksdGhpcy5idWZmZXI9dH1pZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpdGhpcy5idWZmZXIuc2V0KF9lLnRvTG9jYWxCdWZmZXJUeXBlKGUpLHQpLHRoaXMucG9zaXRpb249dCtlLmJ5dGVMZW5ndGg+dGhpcy5wb3NpdGlvbj90K2UubGVuZ3RoOnRoaXMucG9zaXRpb247ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IFooImlucHV0IGNhbm5vdCBiZSBzdHJpbmciKX1yZWFkKGUsdCl7Y29uc3Qgbj1lKyh0PXQmJnQ+MD90OnRoaXMucG9zaXRpb24pO3JldHVybiB0aGlzLmJ1ZmZlci5zdWJhcnJheShlLG4+dGhpcy5wb3NpdGlvbj90aGlzLnBvc2l0aW9uOm4pfXZhbHVlKCl7cmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aD09PXRoaXMucG9zaXRpb24/dGhpcy5idWZmZXI6dGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKX1sZW5ndGgoKXtyZXR1cm4gdGhpcy5wb3NpdGlvbn10b0pTT04oKXtyZXR1cm4gX2UudG9CYXNlNjQodGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKSl9dG9TdHJpbmcoZSl7cmV0dXJuImhleCI9PT1lP19lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpOiJiYXNlNjQiPT09ZT9fZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKTpfZS50b1VURjgodGhpcy5idWZmZXIsMCx0aGlzLnBvc2l0aW9uLCExKX10b0V4dGVuZGVkSlNPTihlKXtlPWV8fHt9LHRoaXMuc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1ZFQ1RPUiYmbWUodGhpcyk7Y29uc3QgdD1fZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlciksbj1OdW1iZXIodGhpcy5zdWJfdHlwZSkudG9TdHJpbmcoMTYpO3JldHVybiBlLmxlZ2FjeT97JGJpbmFyeTp0LCR0eXBlOjE9PT1uLmxlbmd0aD8iMCIrbjpufTp7JGJpbmFyeTp7YmFzZTY0OnQsc3ViVHlwZToxPT09bi5sZW5ndGg/IjAiK246bn19fXRvVVVJRCgpe2lmKHRoaXMuc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1VVSUQpcmV0dXJuIG5ldyB4ZSh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKTt0aHJvdyBuZXcgWihgQmluYXJ5IHN1Yl90eXBlICIke3RoaXMuc3ViX3R5cGV9IiBpcyBub3Qgc3VwcG9ydGVkIGZvciBjb252ZXJ0aW5nIHRvIFVVSUQuIE9ubHkgIiR7eWUuU1VCVFlQRV9VVUlEfSIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5gKX1zdGF0aWMgY3JlYXRlRnJvbUhleFN0cmluZyhlLHQpe3JldHVybiBuZXcgeWUoX2UuZnJvbUhleChlKSx0KX1zdGF0aWMgY3JlYXRlRnJvbUJhc2U2NChlLHQpe3JldHVybiBuZXcgeWUoX2UuZnJvbUJhc2U2NChlKSx0KX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlLHQpe2xldCBuLHI7aWYodD10fHx7fSwiJGJpbmFyeSJpbiBlP3QubGVnYWN5JiYic3RyaW5nIj09dHlwZW9mIGUuJGJpbmFyeSYmIiR0eXBlImluIGU/KHI9ZS4kdHlwZT9wYXJzZUludChlLiR0eXBlLDE2KTowLG49X2UuZnJvbUJhc2U2NChlLiRiaW5hcnkpKToic3RyaW5nIiE9dHlwZW9mIGUuJGJpbmFyeSYmKHI9ZS4kYmluYXJ5LnN1YlR5cGU/cGFyc2VJbnQoZS4kYmluYXJ5LnN1YlR5cGUsMTYpOjAsbj1fZS5mcm9tQmFzZTY0KGUuJGJpbmFyeS5iYXNlNjQpKToiJHV1aWQiaW4gZSYmKHI9NCxuPXhlLmJ5dGVzRnJvbVN0cmluZyhlLiR1dWlkKSksIW4pdGhyb3cgbmV3IFooYFVuZXhwZWN0ZWQgQmluYXJ5IEV4dGVuZGVkIEpTT04gZm9ybWF0ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCk7cmV0dXJuIHI9PT1IP25ldyB4ZShuKTpuZXcgeWUobixyKX1pbnNwZWN0KGUsdCxuKXtuPz89dztyZXR1cm5gQmluYXJ5LmNyZWF0ZUZyb21CYXNlNjQoJHtuKF9lLnRvQmFzZTY0KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpLHQpfSwgJHtuKHRoaXMuc3ViX3R5cGUsdCl9KWB9dG9JbnQ4QXJyYXkoKXtpZih0aGlzLnN1Yl90eXBlIT09eWUuU1VCVFlQRV9WRUNUT1IpdGhyb3cgbmV3IFooIkJpbmFyeSBzdWJfdHlwZSBpcyBub3QgVmVjdG9yIik7aWYodGhpcy5idWZmZXJbMF0hPT15ZS5WRUNUT1JfVFlQRS5JbnQ4KXRocm93IG5ldyBaKCJCaW5hcnkgZGF0YXR5cGUgZmllbGQgaXMgbm90IEludDgiKTtyZXR1cm4gbWUodGhpcyksbmV3IEludDhBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIuc2xpY2UodGhpcy5idWZmZXIuYnl0ZU9mZnNldCsyLHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbikpfXRvRmxvYXQzMkFycmF5KCl7aWYodGhpcy5zdWJfdHlwZSE9PXllLlNVQlRZUEVfVkVDVE9SKXRocm93IG5ldyBaKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09eWUuVkVDVE9SX1RZUEUuRmxvYXQzMil0aHJvdyBuZXcgWigiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBGbG9hdDMyIik7bWUodGhpcyk7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIuc2xpY2UodGhpcy5idWZmZXIuYnl0ZU9mZnNldCsyLHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbikpO3JldHVybiBwZS5pc0JpZ0VuZGlhbiYmX2Uuc3dhcDMyKGUpLG5ldyBGbG9hdDMyQXJyYXkoZS5idWZmZXIpfXRvUGFja2VkQml0cygpe2lmKHRoaXMuc3ViX3R5cGUhPT15ZS5TVUJUWVBFX1ZFQ1RPUil0aHJvdyBuZXcgWigiQmluYXJ5IHN1Yl90eXBlIGlzIG5vdCBWZWN0b3IiKTtpZih0aGlzLmJ1ZmZlclswXSE9PXllLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCl0aHJvdyBuZXcgWigiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBwYWNrZWQgYml0Iik7cmV0dXJuIG1lKHRoaXMpLG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLmJ1ZmZlci5zbGljZSh0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0KzIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uKSl9dG9CaXRzKCl7aWYodGhpcy5zdWJfdHlwZSE9PXllLlNVQlRZUEVfVkVDVE9SKXRocm93IG5ldyBaKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09eWUuVkVDVE9SX1RZUEUuUGFja2VkQml0KXRocm93IG5ldyBaKCJCaW5hcnkgZGF0YXR5cGUgZmllbGQgaXMgbm90IHBhY2tlZCBiaXQiKTttZSh0aGlzKTtjb25zdCBlPTgqKHRoaXMubGVuZ3RoKCktMiktdGhpcy5idWZmZXJbMV0sdD1uZXcgSW50OEFycmF5KGUpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBuPWUvOHwwLHI9dGhpcy5idWZmZXJbbisyXT4+Ny1lJTgmMTt0W2VdPXJ9cmV0dXJuIHR9c3RhdGljIGZyb21JbnQ4QXJyYXkoZSl7Y29uc3QgdD1fZS5hbGxvY2F0ZShlLmJ5dGVMZW5ndGgrMik7dFswXT15ZS5WRUNUT1JfVFlQRS5JbnQ4LHRbMV09MDtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpO3Quc2V0KG4sMik7Y29uc3Qgcj1uZXcgdGhpcyh0LHRoaXMuU1VCVFlQRV9WRUNUT1IpO3JldHVybiBtZShyKSxyfXN0YXRpYyBmcm9tRmxvYXQzMkFycmF5KGUpe2NvbnN0IHQ9X2UuYWxsb2NhdGUoZS5ieXRlTGVuZ3RoKzIpO3RbMF09eWUuVkVDVE9SX1RZUEUuRmxvYXQzMix0WzFdPTA7Y29uc3Qgbj1uZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTt0LnNldChuLDIpLHBlLmlzQmlnRW5kaWFuJiZfZS5zd2FwMzIobmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsMikpO2NvbnN0IHI9bmV3IHRoaXModCx0aGlzLlNVQlRZUEVfVkVDVE9SKTtyZXR1cm4gbWUocikscn1zdGF0aWMgZnJvbVBhY2tlZEJpdHMoZSx0PTApe2NvbnN0IG49X2UuYWxsb2NhdGUoZS5ieXRlTGVuZ3RoKzIpO25bMF09eWUuVkVDVE9SX1RZUEUuUGFja2VkQml0LG5bMV09dCxuLnNldChlLDIpO2NvbnN0IHI9bmV3IHRoaXMobix0aGlzLlNVQlRZUEVfVkVDVE9SKTtyZXR1cm4gbWUocikscn1zdGF0aWMgZnJvbUJpdHMoZSl7Y29uc3QgdD1lLmxlbmd0aCs3Pj4+MyxuPW5ldyBVaW50OEFycmF5KHQrMik7blswXT15ZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQ7Y29uc3Qgcj1lLmxlbmd0aCU4O25bMV09MD09PXI/MDo4LXI7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IHI9dD4+PjMsaT1lW3RdO2lmKDAhPT1pJiYxIT09aSl0aHJvdyBuZXcgWihgSW52YWxpZCBiaXQgdmFsdWUgYXQgJHt0fTogbXVzdCBiZSAwIG9yIDEsIGZvdW5kICR7ZVt0XX1gKTtpZigwPT09aSljb250aW51ZTtjb25zdCBvPTctdCU4O25bcisyXXw9aTw8b31yZXR1cm4gbmV3IHRoaXMobix5ZS5TVUJUWVBFX1ZFQ1RPUil9fWZ1bmN0aW9uIG1lKGUpe2lmKGUuc3ViX3R5cGUhPT15ZS5TVUJUWVBFX1ZFQ1RPUilyZXR1cm47Y29uc3QgdD1lLnBvc2l0aW9uLG49ZS5idWZmZXJbMF0scj1lLmJ1ZmZlclsxXTtpZigobj09PXllLlZFQ1RPUl9UWVBFLkZsb2F0MzJ8fG49PT15ZS5WRUNUT1JfVFlQRS5JbnQ4KSYmMCE9PXIpdGhyb3cgbmV3IFooIkludmFsaWQgVmVjdG9yOiBwYWRkaW5nIG11c3QgYmUgemVybyBmb3IgaW50OCBhbmQgZmxvYXQzMiB2ZWN0b3JzIik7aWYobj09PXllLlZFQ1RPUl9UWVBFLkZsb2F0MzImJjAhPT10JiZ0LTIhPTAmJih0LTIpJTQhPTApdGhyb3cgbmV3IFooIkludmFsaWQgVmVjdG9yOiBGbG9hdDMyIHZlY3RvciBtdXN0IGNvbnRhaW4gYSBtdWx0aXBsZSBvZiA0IGJ5dGVzIik7aWYobj09PXllLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCYmMCE9PXImJjI9PT10KXRocm93IG5ldyBaKCJJbnZhbGlkIFZlY3RvcjogcGFkZGluZyBtdXN0IGJlIHplcm8gZm9yIHBhY2tlZCBiaXQgdmVjdG9ycyB0aGF0IGFyZSBlbXB0eSIpO2lmKG49PT15ZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQmJnI+Nyl0aHJvdyBuZXcgWihgSW52YWxpZCBWZWN0b3I6IHBhZGRpbmcgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgNy4gZm91bmQ6ICR7cn1gKX1jb25zdCBTZT0vXlswLTlBLUZdezMyfSQvaSxCZT0vXlswLTlBLUZdezh9LVswLTlBLUZdezR9LVswLTlBLUZdezR9LVswLTlBLUZdezR9LVswLTlBLUZdezEyfSQvaTtjbGFzcyB4ZSBleHRlbmRzIHlle2NvbnN0cnVjdG9yKGUpe2xldCB0O2lmKG51bGw9PWUpdD14ZS5nZW5lcmF0ZSgpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIHhlKXQ9X2UudG9Mb2NhbEJ1ZmZlclR5cGUobmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIpKTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSYmMTY9PT1lLmJ5dGVMZW5ndGgpdD1fZS50b0xvY2FsQnVmZmVyVHlwZShlKTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgWigiQXJndW1lbnQgcGFzc2VkIGluIFVVSUQgY29uc3RydWN0b3IgbXVzdCBiZSBhIFVVSUQsIGEgMTYgYnl0ZSBCdWZmZXIgb3IgYSAzMi8zNiBjaGFyYWN0ZXIgaGV4IHN0cmluZyAoZGFzaGVzIGV4Y2x1ZGVkL2luY2x1ZGVkLCBmb3JtYXQ6IHh4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eCkuIik7dD14ZS5ieXRlc0Zyb21TdHJpbmcoZSl9c3VwZXIodCxIKX1nZXQgaWQoKXtyZXR1cm4gdGhpcy5idWZmZXJ9c2V0IGlkKGUpe3RoaXMuYnVmZmVyPWV9dG9IZXhTdHJpbmcoZT0hMCl7cmV0dXJuIGU/W19lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsNCkpLF9lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDQsNikpLF9lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDYsOCkpLF9lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDgsMTApKSxfZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgxMCwxNikpXS5qb2luKCItIik6X2UudG9IZXgodGhpcy5idWZmZXIpfXRvU3RyaW5nKGUpe3JldHVybiJoZXgiPT09ZT9fZS50b0hleCh0aGlzLmlkKToiYmFzZTY0Ij09PWU/X2UudG9CYXNlNjQodGhpcy5pZCk6dGhpcy50b0hleFN0cmluZygpfXRvSlNPTigpe3JldHVybiB0aGlzLnRvSGV4U3RyaW5nKCl9ZXF1YWxzKGUpe2lmKCFlKXJldHVybiExO2lmKGUgaW5zdGFuY2VvZiB4ZSlyZXR1cm4gX2UuZXF1YWxzKGUuaWQsdGhpcy5pZCk7dHJ5e3JldHVybiBfZS5lcXVhbHMobmV3IHhlKGUpLmlkLHRoaXMuaWQpfWNhdGNoe3JldHVybiExfX10b0JpbmFyeSgpe3JldHVybiBuZXcgeWUodGhpcy5pZCx5ZS5TVUJUWVBFX1VVSUQpfXN0YXRpYyBnZW5lcmF0ZSgpe2NvbnN0IGU9X2UucmFuZG9tQnl0ZXMoMTYpO3JldHVybiBlWzZdPTE1JmVbNl18NjQsZVs4XT02MyZlWzhdfDEyOCxlfXN0YXRpYyBpc1ZhbGlkKGUpe3JldHVybiEhZSYmKCJzdHJpbmciPT10eXBlb2YgZT94ZS5pc1ZhbGlkVVVJRFN0cmluZyhlKTpfKGUpPzE2PT09ZS5ieXRlTGVuZ3RoOiJCaW5hcnkiPT09ZS5fYnNvbnR5cGUmJmUuc3ViX3R5cGU9PT10aGlzLlNVQlRZUEVfVVVJRCYmMTY9PT1lLmJ1ZmZlci5ieXRlTGVuZ3RoKX1zdGF0aWMgY3JlYXRlRnJvbUhleFN0cmluZyhlKXtjb25zdCB0PXhlLmJ5dGVzRnJvbVN0cmluZyhlKTtyZXR1cm4gbmV3IHhlKHQpfXN0YXRpYyBjcmVhdGVGcm9tQmFzZTY0KGUpe3JldHVybiBuZXcgeGUoX2UuZnJvbUJhc2U2NChlKSl9c3RhdGljIGJ5dGVzRnJvbVN0cmluZyhlKXtpZigheGUuaXNWYWxpZFVVSURTdHJpbmcoZSkpdGhyb3cgbmV3IFooIlVVSUQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG11c3QgYmUgMzIgaGV4IGRpZ2l0cyBvciBjYW5vbmljYWwgaHlwaGVuYXRlZCByZXByZXNlbnRhdGlvbiIpO3JldHVybiBfZS5mcm9tSGV4KGUucmVwbGFjZSgvLS9nLCIiKSl9c3RhdGljIGlzVmFsaWRVVUlEU3RyaW5nKGUpe3JldHVybiBTZS50ZXN0KGUpfHxCZS50ZXN0KGUpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IFVVSUQoJHtuKHRoaXMudG9IZXhTdHJpbmcoKSx0KX0pYH19Y2xhc3MgRWUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkNvZGUifWNvZGU7c2NvcGU7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMuY29kZT1lLnRvU3RyaW5nKCksdGhpcy5zY29wZT10Pz9udWxsfXRvSlNPTigpe3JldHVybiBudWxsIT10aGlzLnNjb3BlP3tjb2RlOnRoaXMuY29kZSxzY29wZTp0aGlzLnNjb3BlfTp7Y29kZTp0aGlzLmNvZGV9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJuIHRoaXMuc2NvcGU/eyRjb2RlOnRoaXMuY29kZSwkc2NvcGU6dGhpcy5zY29wZX06eyRjb2RlOnRoaXMuY29kZX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyBFZShlLiRjb2RlLGUuJHNjb3BlKX1pbnNwZWN0KGUsdCxuKXtuPz89dztsZXQgcj1uKHRoaXMuY29kZSx0KTtjb25zdCBpPXIuaW5jbHVkZXMoIlxuIik7bnVsbCE9dGhpcy5zY29wZSYmKHIrPWAsJHtpPyJcbiI6IiAifSR7bih0aGlzLnNjb3BlLHQpfWApO3JldHVybmBuZXcgQ29kZSgke2k/IlxuIjoiIn0ke3J9JHtpJiZudWxsPT09dGhpcy5zY29wZT8iXG4iOiIifSlgfX1mdW5jdGlvbiBVZShlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiJGlkImluIGUmJm51bGwhPWUuJGlkJiYiJHJlZiJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuJHJlZiYmKCEoIiRkYiJpbiBlKXx8IiRkYiJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuJGRiKX1jbGFzcyBPZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iREJSZWYifWNvbGxlY3Rpb247b2lkO2RiO2ZpZWxkcztjb25zdHJ1Y3RvcihlLHQsbixyKXtzdXBlcigpO2NvbnN0IGk9ZS5zcGxpdCgiLiIpOzI9PT1pLmxlbmd0aCYmKG49aS5zaGlmdCgpLGU9aS5zaGlmdCgpKSx0aGlzLmNvbGxlY3Rpb249ZSx0aGlzLm9pZD10LHRoaXMuZGI9bix0aGlzLmZpZWxkcz1yfHx7fX1nZXQgbmFtZXNwYWNlKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbn1zZXQgbmFtZXNwYWNlKGUpe3RoaXMuY29sbGVjdGlvbj1lfXRvSlNPTigpe2NvbnN0IGU9T2JqZWN0LmFzc2lnbih7JHJlZjp0aGlzLmNvbGxlY3Rpb24sJGlkOnRoaXMub2lkfSx0aGlzLmZpZWxkcyk7cmV0dXJuIG51bGwhPXRoaXMuZGImJihlLiRkYj10aGlzLmRiKSxlfXRvRXh0ZW5kZWRKU09OKGUpe2U9ZXx8e307bGV0IHQ9eyRyZWY6dGhpcy5jb2xsZWN0aW9uLCRpZDp0aGlzLm9pZH07cmV0dXJuIGUubGVnYWN5fHwodGhpcy5kYiYmKHQuJGRiPXRoaXMuZGIpLHQ9T2JqZWN0LmFzc2lnbih0LHRoaXMuZmllbGRzKSksdH1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIGRlbGV0ZSB0LiRyZWYsZGVsZXRlIHQuJGlkLGRlbGV0ZSB0LiRkYixuZXcgT2UoZS4kcmVmLGUuJGlkLGUuJGRiLHQpfWluc3BlY3QoZSx0LG4pe24/Pz13O2NvbnN0IHI9W24odGhpcy5uYW1lc3BhY2UsdCksbih0aGlzLm9pZCx0KSwuLi50aGlzLmRiP1tuKHRoaXMuZGIsdCldOltdLC4uLk9iamVjdC5rZXlzKHRoaXMuZmllbGRzKS5sZW5ndGg+MD9bbih0aGlzLmZpZWxkcyx0KV06W11dO3JldHVybiByWzFdPW49PT13P2BuZXcgT2JqZWN0SWQoJHtyWzFdfSlgOnJbMV0sYG5ldyBEQlJlZigke3Iuam9pbigiLCAiKX0pYH19ZnVuY3Rpb24gTmUoZSl7aWYoIiI9PT1lKXJldHVybiBlO2xldCB0PTA7Y29uc3Qgbj0iLSI9PT1lW3RdLHI9IisiPT09ZVt0XTsocnx8bikmJih0Kz0xKTtsZXQgaT0hMTtmb3IoO3Q8ZS5sZW5ndGgmJiIwIj09PWVbdF07Kyt0KWk9ITA7cmV0dXJuIGk/YCR7bj8iLSI6IiJ9JHtlLmxlbmd0aD09PXQ/IjAiOmUuc2xpY2UodCl9YDpyP2Uuc2xpY2UoMSk6ZX1sZXQgSWU7dHJ5e0llPW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDEzLDIsOTYsMCwxLDEyNyw5Niw0LDEyNywxMjcsMTI3LDEyNywxLDEyNywzLDcsNiwwLDEsMSwxLDEsMSw2LDYsMSwxMjcsMSw2NSwwLDExLDcsNTAsNiwzLDEwOSwxMTcsMTA4LDAsMSw1LDEwMCwxMDUsMTE4LDk1LDExNSwwLDIsNSwxMDAsMTA1LDExOCw5NSwxMTcsMCwzLDUsMTE0LDEwMSwxMDksOTUsMTE1LDAsNCw1LDExNCwxMDEsMTA5LDk1LDExNywwLDUsOCwxMDMsMTAxLDExNiw5NSwxMDQsMTA1LDEwMywxMDQsMCwwLDEwLDE5MSwxLDYsNCwwLDM1LDAsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI2LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNywzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjgsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI5LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEzMCwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMV0pKSx7fSkuZXhwb3J0c31jYXRjaHt9Y29uc3QgdmU9NDI5NDk2NzI5NixUZT0weDEwMDAwMDAwMDAwMDAwMDAwLCRlPVRlLzIsTGU9e30sQWU9e30sUmU9L14oXCs/MHwoXCt8LSk/WzEtOV1bMC05XSopJC87Y2xhc3MgamUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkxvbmcifWdldCBfX2lzTG9uZ19fKCl7cmV0dXJuITB9aGlnaDtsb3c7dW5zaWduZWQ7Y29uc3RydWN0b3IoZT0wLHQsbil7c3VwZXIoKTtjb25zdCByPSJib29sZWFuIj09dHlwZW9mIHQ/dDpCb29sZWFuKG4pLGk9Im51bWJlciI9PXR5cGVvZiB0P3Q6MCxvPSJzdHJpbmciPT10eXBlb2YgZT9qZS5mcm9tU3RyaW5nKGUscik6ImJpZ2ludCI9PXR5cGVvZiBlP2plLmZyb21CaWdJbnQoZSxyKTp7bG93OjB8ZSxoaWdoOjB8aSx1bnNpZ25lZDpyfTt0aGlzLmxvdz1vLmxvdyx0aGlzLmhpZ2g9by5oaWdoLHRoaXMudW5zaWduZWQ9by51bnNpZ25lZH1zdGF0aWMgVFdPX1BXUl8yND1qZS5mcm9tSW50KDE2Nzc3MjE2KTtzdGF0aWMgTUFYX1VOU0lHTkVEX1ZBTFVFPWplLmZyb21CaXRzKC0xLC0xLCEwKTtzdGF0aWMgWkVSTz1qZS5mcm9tSW50KDApO3N0YXRpYyBVWkVSTz1qZS5mcm9tSW50KDAsITApO3N0YXRpYyBPTkU9amUuZnJvbUludCgxKTtzdGF0aWMgVU9ORT1qZS5mcm9tSW50KDEsITApO3N0YXRpYyBORUdfT05FPWplLmZyb21JbnQoLTEpO3N0YXRpYyBNQVhfVkFMVUU9amUuZnJvbUJpdHMoLTEsMjE0NzQ4MzY0NywhMSk7c3RhdGljIE1JTl9WQUxVRT1qZS5mcm9tQml0cygwLC0yMTQ3NDgzNjQ4LCExKTtzdGF0aWMgZnJvbUJpdHMoZSx0LG4pe3JldHVybiBuZXcgamUoZSx0LG4pfXN0YXRpYyBmcm9tSW50KGUsdCl7bGV0IG4scixpO3JldHVybiB0PyhpPTA8PShlPj4+PTApJiZlPDI1NikmJihyPUFlW2VdLHIpP3I6KG49amUuZnJvbUJpdHMoZSwoMHxlKTwwPy0xOjAsITApLGkmJihBZVtlXT1uKSxuKTooaT0tMTI4PD0oZXw9MCkmJmU8MTI4KSYmKHI9TGVbZV0scik/cjoobj1qZS5mcm9tQml0cyhlLGU8MD8tMTowLCExKSxpJiYoTGVbZV09biksbil9c3RhdGljIGZyb21OdW1iZXIoZSx0KXtpZihpc05hTihlKSlyZXR1cm4gdD9qZS5VWkVSTzpqZS5aRVJPO2lmKHQpe2lmKGU8MClyZXR1cm4gamUuVVpFUk87aWYoZT49VGUpcmV0dXJuIGplLk1BWF9VTlNJR05FRF9WQUxVRX1lbHNle2lmKGU8PS0kZSlyZXR1cm4gamUuTUlOX1ZBTFVFO2lmKGUrMT49JGUpcmV0dXJuIGplLk1BWF9WQUxVRX1yZXR1cm4gZTwwP2plLmZyb21OdW1iZXIoLWUsdCkubmVnKCk6amUuZnJvbUJpdHMoZSV2ZXwwLGUvdmV8MCx0KX1zdGF0aWMgZnJvbUJpZ0ludChlLHQpe2NvbnN0IG49MHhmZmZmZmZmZm47cmV0dXJuIG5ldyBqZShOdW1iZXIoZSZuKSxOdW1iZXIoZT4+MzJuJm4pLHQpfXN0YXRpYyBfZnJvbVN0cmluZyhlLHQsbil7aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBaKCJlbXB0eSBzdHJpbmciKTtpZihuPDJ8fDM2PG4pdGhyb3cgbmV3IFooInJhZGl4Iik7bGV0IHI7aWYoKHI9ZS5pbmRleE9mKCItIikpPjApdGhyb3cgbmV3IFooImludGVyaW9yIGh5cGhlbiIpO2lmKDA9PT1yKXJldHVybiBqZS5fZnJvbVN0cmluZyhlLnN1YnN0cmluZygxKSx0LG4pLm5lZygpO2NvbnN0IGk9amUuZnJvbU51bWJlcihNYXRoLnBvdyhuLDgpKTtsZXQgbz1qZS5aRVJPO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9OCl7Y29uc3Qgcj1NYXRoLm1pbig4LGUubGVuZ3RoLXQpLHM9cGFyc2VJbnQoZS5zdWJzdHJpbmcodCx0K3IpLG4pO2lmKHI8OCl7Y29uc3QgZT1qZS5mcm9tTnVtYmVyKE1hdGgucG93KG4scikpO289by5tdWwoZSkuYWRkKGplLmZyb21OdW1iZXIocykpfWVsc2Ugbz1vLm11bChpKSxvPW8uYWRkKGplLmZyb21OdW1iZXIocykpfXJldHVybiBvLnVuc2lnbmVkPXQsb31zdGF0aWMgZnJvbVN0cmluZ1N0cmljdChlLHQsbil7bGV0IHI9ITE7aWYoIm51bWJlciI9PXR5cGVvZiB0PyhuPXQsdD0hMSk6cj0hIXQsbj8/PTEwLGUudHJpbSgpIT09ZSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBjb250YWlucyBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyB3aGl0ZXNwYWNlYCk7aWYoIWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj0iMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ii5zbGljZSgwLHQ9dD8/MTApO3JldHVybiFuZXcgUmVnRXhwKGBbXi0rJHtufV1gLCJpIikudGVzdChlKSYmZX0oZSxuKSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgZm9yIHJhZGl4OiAke259YCk7Y29uc3QgaT1OZShlKSxvPWplLl9mcm9tU3RyaW5nKGkscixuKTtpZihvLnRvU3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkhPT1pLnRvTG93ZXJDYXNlKCkpdGhyb3cgbmV3IFooYElucHV0OiAke2V9IGlzIG5vdCByZXByZXNlbnRhYmxlIGFzICR7by51bnNpZ25lZD8iYW4gdW5zaWduZWQiOiJhIHNpZ25lZCJ9IDY0LWJpdCBMb25nICR7bnVsbCE9bj9gd2l0aCByYWRpeDogJHtufWA6IiJ9YCk7cmV0dXJuIG99c3RhdGljIGZyb21TdHJpbmcoZSx0LG4pe2xldCByPSExO3JldHVybiJudW1iZXIiPT10eXBlb2YgdD8obj10LHQ9ITEpOnI9ISF0LG4/Pz0xMCwiTmFOIj09PWUmJm48MjR8fCgiSW5maW5pdHkiPT09ZXx8IitJbmZpbml0eSI9PT1lfHwiLUluZmluaXR5Ij09PWUpJiZuPDM1P2plLlpFUk86amUuX2Zyb21TdHJpbmcoZSxyLG4pfXN0YXRpYyBmcm9tQnl0ZXMoZSx0LG4pe3JldHVybiBuP2plLmZyb21CeXRlc0xFKGUsdCk6amUuZnJvbUJ5dGVzQkUoZSx0KX1zdGF0aWMgZnJvbUJ5dGVzTEUoZSx0KXtyZXR1cm4gbmV3IGplKGVbMF18ZVsxXTw8OHxlWzJdPDwxNnxlWzNdPDwyNCxlWzRdfGVbNV08PDh8ZVs2XTw8MTZ8ZVs3XTw8MjQsdCl9c3RhdGljIGZyb21CeXRlc0JFKGUsdCl7cmV0dXJuIG5ldyBqZShlWzRdPDwyNHxlWzVdPDwxNnxlWzZdPDw4fGVbN10sZVswXTw8MjR8ZVsxXTw8MTZ8ZVsyXTw8OHxlWzNdLHQpfXN0YXRpYyBpc0xvbmcoZSl7cmV0dXJuIG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIl9faXNMb25nX18iaW4gZSYmITA9PT1lLl9faXNMb25nX199c3RhdGljIGZyb21WYWx1ZShlLHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9qZS5mcm9tTnVtYmVyKGUsdCk6InN0cmluZyI9PXR5cGVvZiBlP2plLmZyb21TdHJpbmcoZSx0KTpqZS5mcm9tQml0cyhlLmxvdyxlLmhpZ2gsImJvb2xlYW4iPT10eXBlb2YgdD90OmUudW5zaWduZWQpfWFkZChlKXtqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSk7Y29uc3QgdD10aGlzLmhpZ2g+Pj4xNixuPTY1NTM1JnRoaXMuaGlnaCxyPXRoaXMubG93Pj4+MTYsaT02NTUzNSZ0aGlzLmxvdyxvPWUuaGlnaD4+PjE2LHM9NjU1MzUmZS5oaWdoLGE9ZS5sb3c+Pj4xNjtsZXQgYz0wLGw9MCxmPTAsdT0wO3JldHVybiB1Kz1pKyg2NTUzNSZlLmxvdyksZis9dT4+PjE2LHUmPTY1NTM1LGYrPXIrYSxsKz1mPj4+MTYsZiY9NjU1MzUsbCs9bitzLGMrPWw+Pj4xNixsJj02NTUzNSxjKz10K28sYyY9NjU1MzUsamUuZnJvbUJpdHMoZjw8MTZ8dSxjPDwxNnxsLHRoaXMudW5zaWduZWQpfWFuZChlKXtyZXR1cm4gamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLGplLmZyb21CaXRzKHRoaXMubG93JmUubG93LHRoaXMuaGlnaCZlLmhpZ2gsdGhpcy51bnNpZ25lZCl9Y29tcGFyZShlKXtpZihqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSksdGhpcy5lcShlKSlyZXR1cm4gMDtjb25zdCB0PXRoaXMuaXNOZWdhdGl2ZSgpLG49ZS5pc05lZ2F0aXZlKCk7cmV0dXJuIHQmJiFuPy0xOiF0JiZuPzE6dGhpcy51bnNpZ25lZD9lLmhpZ2g+Pj4wPnRoaXMuaGlnaD4+PjB8fGUuaGlnaD09PXRoaXMuaGlnaCYmZS5sb3c+Pj4wPnRoaXMubG93Pj4+MD8tMToxOnRoaXMuc3ViKGUpLmlzTmVnYXRpdmUoKT8tMToxfWNvbXAoZSl7cmV0dXJuIHRoaXMuY29tcGFyZShlKX1kaXZpZGUoZSl7aWYoamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLGUuaXNaZXJvKCkpdGhyb3cgbmV3IFooImRpdmlzaW9uIGJ5IHplcm8iKTtpZihJZSl7aWYoIXRoaXMudW5zaWduZWQmJi0yMTQ3NDgzNjQ4PT09dGhpcy5oaWdoJiYtMT09PWUubG93JiYtMT09PWUuaGlnaClyZXR1cm4gdGhpcztjb25zdCB0PSh0aGlzLnVuc2lnbmVkP0llLmRpdl91OkllLmRpdl9zKSh0aGlzLmxvdyx0aGlzLmhpZ2gsZS5sb3csZS5oaWdoKTtyZXR1cm4gamUuZnJvbUJpdHModCxJZS5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpfWlmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIHRoaXMudW5zaWduZWQ/amUuVVpFUk86amUuWkVSTztsZXQgdCxuLHI7aWYodGhpcy51bnNpZ25lZCl7aWYoZS51bnNpZ25lZHx8KGU9ZS50b1Vuc2lnbmVkKCkpLGUuZ3QodGhpcykpcmV0dXJuIGplLlVaRVJPO2lmKGUuZ3QodGhpcy5zaHJ1KDEpKSlyZXR1cm4gamUuVU9ORTtyPWplLlVaRVJPfWVsc2V7aWYodGhpcy5lcShqZS5NSU5fVkFMVUUpKXtpZihlLmVxKGplLk9ORSl8fGUuZXEoamUuTkVHX09ORSkpcmV0dXJuIGplLk1JTl9WQUxVRTtpZihlLmVxKGplLk1JTl9WQUxVRSkpcmV0dXJuIGplLk9ORTtyZXR1cm4gdD10aGlzLnNocigxKS5kaXYoZSkuc2hsKDEpLHQuZXEoamUuWkVSTyk/ZS5pc05lZ2F0aXZlKCk/amUuT05FOmplLk5FR19PTkU6KG49dGhpcy5zdWIoZS5tdWwodCkpLHI9dC5hZGQobi5kaXYoZSkpLHIpfWlmKGUuZXEoamUuTUlOX1ZBTFVFKSlyZXR1cm4gdGhpcy51bnNpZ25lZD9qZS5VWkVSTzpqZS5aRVJPO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiBlLmlzTmVnYXRpdmUoKT90aGlzLm5lZygpLmRpdihlLm5lZygpKTp0aGlzLm5lZygpLmRpdihlKS5uZWcoKTtpZihlLmlzTmVnYXRpdmUoKSlyZXR1cm4gdGhpcy5kaXYoZS5uZWcoKSkubmVnKCk7cj1qZS5aRVJPfWZvcihuPXRoaXM7bi5ndGUoZSk7KXt0PU1hdGgubWF4KDEsTWF0aC5mbG9vcihuLnRvTnVtYmVyKCkvZS50b051bWJlcigpKSk7Y29uc3QgaT1NYXRoLmNlaWwoTWF0aC5sb2codCkvTWF0aC5MTjIpLG89aTw9NDg/MTpNYXRoLnBvdygyLGktNDgpO2xldCBzPWplLmZyb21OdW1iZXIodCksYT1zLm11bChlKTtmb3IoO2EuaXNOZWdhdGl2ZSgpfHxhLmd0KG4pOyl0LT1vLHM9amUuZnJvbU51bWJlcih0LHRoaXMudW5zaWduZWQpLGE9cy5tdWwoZSk7cy5pc1plcm8oKSYmKHM9amUuT05FKSxyPXIuYWRkKHMpLG49bi5zdWIoYSl9cmV0dXJuIHJ9ZGl2KGUpe3JldHVybiB0aGlzLmRpdmlkZShlKX1lcXVhbHMoZSl7cmV0dXJuIGplLmlzTG9uZyhlKXx8KGU9amUuZnJvbVZhbHVlKGUpKSwodGhpcy51bnNpZ25lZD09PWUudW5zaWduZWR8fHRoaXMuaGlnaD4+PjMxIT0xfHxlLmhpZ2g+Pj4zMSE9MSkmJih0aGlzLmhpZ2g9PT1lLmhpZ2gmJnRoaXMubG93PT09ZS5sb3cpfWVxKGUpe3JldHVybiB0aGlzLmVxdWFscyhlKX1nZXRIaWdoQml0cygpe3JldHVybiB0aGlzLmhpZ2h9Z2V0SGlnaEJpdHNVbnNpZ25lZCgpe3JldHVybiB0aGlzLmhpZ2g+Pj4wfWdldExvd0JpdHMoKXtyZXR1cm4gdGhpcy5sb3d9Z2V0TG93Qml0c1Vuc2lnbmVkKCl7cmV0dXJuIHRoaXMubG93Pj4+MH1nZXROdW1CaXRzQWJzKCl7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZXEoamUuTUlOX1ZBTFVFKT82NDp0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTtjb25zdCBlPTAhPT10aGlzLmhpZ2g/dGhpcy5oaWdoOnRoaXMubG93O2xldCB0O2Zvcih0PTMxO3Q+MCYmIShlJjE8PHQpO3QtLSk7cmV0dXJuIDAhPT10aGlzLmhpZ2g/dCszMzp0KzF9Z3JlYXRlclRoYW4oZSl7cmV0dXJuIHRoaXMuY29tcChlKT4wfWd0KGUpe3JldHVybiB0aGlzLmdyZWF0ZXJUaGFuKGUpfWdyZWF0ZXJUaGFuT3JFcXVhbChlKXtyZXR1cm4gdGhpcy5jb21wKGUpPj0wfWd0ZShlKXtyZXR1cm4gdGhpcy5ncmVhdGVyVGhhbk9yRXF1YWwoZSl9Z2UoZSl7cmV0dXJuIHRoaXMuZ3JlYXRlclRoYW5PckVxdWFsKGUpfWlzRXZlbigpe3JldHVybiEoMSZ0aGlzLmxvdyl9aXNOZWdhdGl2ZSgpe3JldHVybiF0aGlzLnVuc2lnbmVkJiZ0aGlzLmhpZ2g8MH1pc09kZCgpe3JldHVybiEoMSZ+dGhpcy5sb3cpfWlzUG9zaXRpdmUoKXtyZXR1cm4gdGhpcy51bnNpZ25lZHx8dGhpcy5oaWdoPj0wfWlzWmVybygpe3JldHVybiAwPT09dGhpcy5oaWdoJiYwPT09dGhpcy5sb3d9bGVzc1RoYW4oZSl7cmV0dXJuIHRoaXMuY29tcChlKTwwfWx0KGUpe3JldHVybiB0aGlzLmxlc3NUaGFuKGUpfWxlc3NUaGFuT3JFcXVhbChlKXtyZXR1cm4gdGhpcy5jb21wKGUpPD0wfWx0ZShlKXtyZXR1cm4gdGhpcy5sZXNzVGhhbk9yRXF1YWwoZSl9bW9kdWxvKGUpe2lmKGplLmlzTG9uZyhlKXx8KGU9amUuZnJvbVZhbHVlKGUpKSxJZSl7Y29uc3QgdD0odGhpcy51bnNpZ25lZD9JZS5yZW1fdTpJZS5yZW1fcykodGhpcy5sb3csdGhpcy5oaWdoLGUubG93LGUuaGlnaCk7cmV0dXJuIGplLmZyb21CaXRzKHQsSWUuZ2V0X2hpZ2goKSx0aGlzLnVuc2lnbmVkKX1yZXR1cm4gdGhpcy5zdWIodGhpcy5kaXYoZSkubXVsKGUpKX1tb2QoZSl7cmV0dXJuIHRoaXMubW9kdWxvKGUpfXJlbShlKXtyZXR1cm4gdGhpcy5tb2R1bG8oZSl9bXVsdGlwbHkoZSl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gamUuWkVSTztpZihqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSksSWUpe2NvbnN0IHQ9SWUubXVsKHRoaXMubG93LHRoaXMuaGlnaCxlLmxvdyxlLmhpZ2gpO3JldHVybiBqZS5mcm9tQml0cyh0LEllLmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCl9aWYoZS5pc1plcm8oKSlyZXR1cm4gamUuWkVSTztpZih0aGlzLmVxKGplLk1JTl9WQUxVRSkpcmV0dXJuIGUuaXNPZGQoKT9qZS5NSU5fVkFMVUU6amUuWkVSTztpZihlLmVxKGplLk1JTl9WQUxVRSkpcmV0dXJuIHRoaXMuaXNPZGQoKT9qZS5NSU5fVkFMVUU6amUuWkVSTztpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gZS5pc05lZ2F0aXZlKCk/dGhpcy5uZWcoKS5tdWwoZS5uZWcoKSk6dGhpcy5uZWcoKS5tdWwoZSkubmVnKCk7aWYoZS5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMubXVsKGUubmVnKCkpLm5lZygpO2lmKHRoaXMubHQoamUuVFdPX1BXUl8yNCkmJmUubHQoamUuVFdPX1BXUl8yNCkpcmV0dXJuIGplLmZyb21OdW1iZXIodGhpcy50b051bWJlcigpKmUudG9OdW1iZXIoKSx0aGlzLnVuc2lnbmVkKTtjb25zdCB0PXRoaXMuaGlnaD4+PjE2LG49NjU1MzUmdGhpcy5oaWdoLHI9dGhpcy5sb3c+Pj4xNixpPTY1NTM1JnRoaXMubG93LG89ZS5oaWdoPj4+MTYscz02NTUzNSZlLmhpZ2gsYT1lLmxvdz4+PjE2LGM9NjU1MzUmZS5sb3c7bGV0IGw9MCxmPTAsdT0wLF89MDtyZXR1cm4gXys9aSpjLHUrPV8+Pj4xNixfJj02NTUzNSx1Kz1yKmMsZis9dT4+PjE2LHUmPTY1NTM1LHUrPWkqYSxmKz11Pj4+MTYsdSY9NjU1MzUsZis9bipjLGwrPWY+Pj4xNixmJj02NTUzNSxmKz1yKmEsbCs9Zj4+PjE2LGYmPTY1NTM1LGYrPWkqcyxsKz1mPj4+MTYsZiY9NjU1MzUsbCs9dCpjK24qYStyKnMraSpvLGwmPTY1NTM1LGplLmZyb21CaXRzKHU8PDE2fF8sbDw8MTZ8Zix0aGlzLnVuc2lnbmVkKX1tdWwoZSl7cmV0dXJuIHRoaXMubXVsdGlwbHkoZSl9bmVnYXRlKCl7cmV0dXJuIXRoaXMudW5zaWduZWQmJnRoaXMuZXEoamUuTUlOX1ZBTFVFKT9qZS5NSU5fVkFMVUU6dGhpcy5ub3QoKS5hZGQoamUuT05FKX1uZWcoKXtyZXR1cm4gdGhpcy5uZWdhdGUoKX1ub3QoKXtyZXR1cm4gamUuZnJvbUJpdHMofnRoaXMubG93LH50aGlzLmhpZ2gsdGhpcy51bnNpZ25lZCl9bm90RXF1YWxzKGUpe3JldHVybiF0aGlzLmVxdWFscyhlKX1uZXEoZSl7cmV0dXJuIHRoaXMubm90RXF1YWxzKGUpfW5lKGUpe3JldHVybiB0aGlzLm5vdEVxdWFscyhlKX1vcihlKXtyZXR1cm4gamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLGplLmZyb21CaXRzKHRoaXMubG93fGUubG93LHRoaXMuaGlnaHxlLmhpZ2gsdGhpcy51bnNpZ25lZCl9c2hpZnRMZWZ0KGUpe3JldHVybiBqZS5pc0xvbmcoZSkmJihlPWUudG9JbnQoKSksMD09KGUmPTYzKT90aGlzOmU8MzI/amUuZnJvbUJpdHModGhpcy5sb3c8PGUsdGhpcy5oaWdoPDxlfHRoaXMubG93Pj4+MzItZSx0aGlzLnVuc2lnbmVkKTpqZS5mcm9tQml0cygwLHRoaXMubG93PDxlLTMyLHRoaXMudW5zaWduZWQpfXNobChlKXtyZXR1cm4gdGhpcy5zaGlmdExlZnQoZSl9c2hpZnRSaWdodChlKXtyZXR1cm4gamUuaXNMb25nKGUpJiYoZT1lLnRvSW50KCkpLDA9PShlJj02Myk/dGhpczplPDMyP2plLmZyb21CaXRzKHRoaXMubG93Pj4+ZXx0aGlzLmhpZ2g8PDMyLWUsdGhpcy5oaWdoPj5lLHRoaXMudW5zaWduZWQpOmplLmZyb21CaXRzKHRoaXMuaGlnaD4+ZS0zMix0aGlzLmhpZ2g+PTA/MDotMSx0aGlzLnVuc2lnbmVkKX1zaHIoZSl7cmV0dXJuIHRoaXMuc2hpZnRSaWdodChlKX1zaGlmdFJpZ2h0VW5zaWduZWQoZSl7aWYoamUuaXNMb25nKGUpJiYoZT1lLnRvSW50KCkpLDA9PT0oZSY9NjMpKXJldHVybiB0aGlzO3tjb25zdCB0PXRoaXMuaGlnaDtpZihlPDMyKXtjb25zdCBuPXRoaXMubG93O3JldHVybiBqZS5mcm9tQml0cyhuPj4+ZXx0PDwzMi1lLHQ+Pj5lLHRoaXMudW5zaWduZWQpfXJldHVybiAzMj09PWU/amUuZnJvbUJpdHModCwwLHRoaXMudW5zaWduZWQpOmplLmZyb21CaXRzKHQ+Pj5lLTMyLDAsdGhpcy51bnNpZ25lZCl9fXNocl91KGUpe3JldHVybiB0aGlzLnNoaWZ0UmlnaHRVbnNpZ25lZChlKX1zaHJ1KGUpe3JldHVybiB0aGlzLnNoaWZ0UmlnaHRVbnNpZ25lZChlKX1zdWJ0cmFjdChlKXtyZXR1cm4gamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLHRoaXMuYWRkKGUubmVnKCkpfXN1YihlKXtyZXR1cm4gdGhpcy5zdWJ0cmFjdChlKX10b0ludCgpe3JldHVybiB0aGlzLnVuc2lnbmVkP3RoaXMubG93Pj4+MDp0aGlzLmxvd310b051bWJlcigpe3JldHVybiB0aGlzLnVuc2lnbmVkPyh0aGlzLmhpZ2g+Pj4wKSp2ZSsodGhpcy5sb3c+Pj4wKTp0aGlzLmhpZ2gqdmUrKHRoaXMubG93Pj4+MCl9dG9CaWdJbnQoKXtyZXR1cm4gQmlnSW50KHRoaXMudG9TdHJpbmcoKSl9dG9CeXRlcyhlKXtyZXR1cm4gZT90aGlzLnRvQnl0ZXNMRSgpOnRoaXMudG9CeXRlc0JFKCl9dG9CeXRlc0xFKCl7Y29uc3QgZT10aGlzLmhpZ2gsdD10aGlzLmxvdztyZXR1cm5bMjU1JnQsdD4+PjgmMjU1LHQ+Pj4xNiYyNTUsdD4+PjI0LDI1NSZlLGU+Pj44JjI1NSxlPj4+MTYmMjU1LGU+Pj4yNF19dG9CeXRlc0JFKCl7Y29uc3QgZT10aGlzLmhpZ2gsdD10aGlzLmxvdztyZXR1cm5bZT4+PjI0LGU+Pj4xNiYyNTUsZT4+PjgmMjU1LDI1NSZlLHQ+Pj4yNCx0Pj4+MTYmMjU1LHQ+Pj44JjI1NSwyNTUmdF19dG9TaWduZWQoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD9qZS5mcm9tQml0cyh0aGlzLmxvdyx0aGlzLmhpZ2gsITEpOnRoaXN9dG9TdHJpbmcoZSl7aWYoKGU9ZXx8MTApPDJ8fDM2PGUpdGhyb3cgbmV3IFooInJhZGl4Iik7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4iMCI7aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKHRoaXMuZXEoamUuTUlOX1ZBTFVFKSl7Y29uc3QgdD1qZS5mcm9tTnVtYmVyKGUpLG49dGhpcy5kaXYodCkscj1uLm11bCh0KS5zdWIodGhpcyk7cmV0dXJuIG4udG9TdHJpbmcoZSkrci50b0ludCgpLnRvU3RyaW5nKGUpfXJldHVybiItIit0aGlzLm5lZygpLnRvU3RyaW5nKGUpfWNvbnN0IHQ9amUuZnJvbU51bWJlcihNYXRoLnBvdyhlLDYpLHRoaXMudW5zaWduZWQpO2xldCBuPXRoaXMscj0iIjtmb3IoOzspe2NvbnN0IGk9bi5kaXYodCk7bGV0IG89KG4uc3ViKGkubXVsKHQpKS50b0ludCgpPj4+MCkudG9TdHJpbmcoZSk7aWYobj1pLG4uaXNaZXJvKCkpcmV0dXJuIG8rcjtmb3IoO28ubGVuZ3RoPDY7KW89IjAiK287cj0iIitvK3J9fXRvVW5zaWduZWQoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD90aGlzOmplLmZyb21CaXRzKHRoaXMubG93LHRoaXMuaGlnaCwhMCl9eG9yKGUpe3JldHVybiBqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSksamUuZnJvbUJpdHModGhpcy5sb3deZS5sb3csdGhpcy5oaWdoXmUuaGlnaCx0aGlzLnVuc2lnbmVkKX1lcXooKXtyZXR1cm4gdGhpcy5pc1plcm8oKX1sZShlKXtyZXR1cm4gdGhpcy5sZXNzVGhhbk9yRXF1YWwoZSl9dG9FeHRlbmRlZEpTT04oZSl7cmV0dXJuIGUmJmUucmVsYXhlZD90aGlzLnRvTnVtYmVyKCk6eyRudW1iZXJMb25nOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSx0KXtjb25zdHt1c2VCaWdJbnQ2NDpuPSExLHJlbGF4ZWQ6cj0hMH09ey4uLnR9O2lmKGUuJG51bWJlckxvbmcubGVuZ3RoPjIwKXRocm93IG5ldyBaKCIkbnVtYmVyTG9uZyBzdHJpbmcgaXMgdG9vIGxvbmciKTtpZighUmUudGVzdChlLiRudW1iZXJMb25nKSl0aHJvdyBuZXcgWihgJG51bWJlckxvbmcgc3RyaW5nICIke2UuJG51bWJlckxvbmd9IiBpcyBpbiBhbiBpbnZhbGlkIGZvcm1hdGApO2lmKG4pe2NvbnN0IHQ9QmlnSW50KGUuJG51bWJlckxvbmcpO3JldHVybiBCaWdJbnQuYXNJbnROKDY0LHQpfWNvbnN0IGk9amUuZnJvbVN0cmluZyhlLiRudW1iZXJMb25nKTtyZXR1cm4gcj9pLnRvTnVtYmVyKCk6aX1pbnNwZWN0KGUsdCxuKXtuPz89dztyZXR1cm5gbmV3IExvbmcoJHtuKHRoaXMudG9TdHJpbmcoKSx0KX0ke3RoaXMudW5zaWduZWQ/YCwgJHtuKHRoaXMudW5zaWduZWQsdCl9YDoiIn0pYH19Y29uc3QgRmU9L14oXCt8LSk/KFxkK3woXGQqXC5cZCopKT8oRXxlKT8oWy0rXSk/KFxkKyk/JC8sa2U9L14oXCt8LSk/KEluZmluaXR5fGluZikkL2ksemU9L14oXCt8LSk/TmFOJC9pLERlPTYxMTEsQ2U9LTYxNzYsTWU9X2UuZnJvbU51bWJlckFycmF5KFsxMjQsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLnJldmVyc2UoKSksVmU9X2UuZnJvbU51bWJlckFycmF5KFsyNDgsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLnJldmVyc2UoKSksUGU9X2UuZnJvbU51bWJlckFycmF5KFsxMjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLnJldmVyc2UoKSksSmU9L14oWy0rXSk/KFxkKyk/JC87ZnVuY3Rpb24gV2UoZSl7cmV0dXJuIWlzTmFOKHBhcnNlSW50KGUsMTApKX1mdW5jdGlvbiBZZShlKXtjb25zdCB0PWplLmZyb21OdW1iZXIoMWU5KTtsZXQgbj1qZS5mcm9tTnVtYmVyKDApO2lmKCEoZS5wYXJ0c1swXXx8ZS5wYXJ0c1sxXXx8ZS5wYXJ0c1syXXx8ZS5wYXJ0c1szXSkpcmV0dXJue3F1b3RpZW50OmUscmVtOm59O2ZvcihsZXQgcj0wO3I8PTM7cisrKW49bi5zaGlmdExlZnQoMzIpLG49bi5hZGQobmV3IGplKGUucGFydHNbcl0sMCkpLGUucGFydHNbcl09bi5kaXYodCkubG93LG49bi5tb2R1bG8odCk7cmV0dXJue3F1b3RpZW50OmUscmVtOm59fWZ1bmN0aW9uIHFlKGUsdCl7dGhyb3cgbmV3IFooYCIke2V9IiBpcyBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZyAtICR7dH1gKX1jbGFzcyBIZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iRGVjaW1hbDEyOCJ9Ynl0ZXM7Y29uc3RydWN0b3IoZSl7aWYoc3VwZXIoKSwic3RyaW5nIj09dHlwZW9mIGUpdGhpcy5ieXRlcz1IZS5mcm9tU3RyaW5nKGUpLmJ5dGVzO2Vsc2V7aWYoIShlIGluc3RhbmNlb2YgVWludDhBcnJheXx8XyhlKSkpdGhyb3cgbmV3IFooIkRlY2ltYWwxMjggbXVzdCB0YWtlIGEgQnVmZmVyIG9yIHN0cmluZyIpO2lmKDE2IT09ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyBaKCJEZWNpbWFsMTI4IG11c3QgdGFrZSBhIEJ1ZmZlciBvZiAxNiBieXRlcyIpO3RoaXMuYnl0ZXM9ZX19c3RhdGljIGZyb21TdHJpbmcoZSl7cmV0dXJuIEhlLl9mcm9tU3RyaW5nKGUse2FsbG93Um91bmRpbmc6ITF9KX1zdGF0aWMgZnJvbVN0cmluZ1dpdGhSb3VuZGluZyhlKXtyZXR1cm4gSGUuX2Zyb21TdHJpbmcoZSx7YWxsb3dSb3VuZGluZzohMH0pfXN0YXRpYyBfZnJvbVN0cmluZyhlLHQpe2xldCBuPSExLHI9ITEsaT0hMSxvPSExLHM9MCxhPTAsYz0wLGw9MCxmPTA7Y29uc3QgdT1bMF07bGV0IF89MCxnPTAsaD0wLGI9MCxkPW5ldyBqZSgwLDApLHc9bmV3IGplKDAsMCkscD0wLHk9MDtpZihlLmxlbmd0aD49N2UzKXRocm93IG5ldyBaKGUrIiBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZyIpO2NvbnN0IG09ZS5tYXRjaChGZSksUz1lLm1hdGNoKGtlKSxCPWUubWF0Y2goemUpO2lmKCFtJiYhUyYmIUJ8fDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgWihlKyIgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmciKTtpZihtKXtjb25zdCB0PW1bMl0sbj1tWzRdLHI9bVs1XSxpPW1bNl07biYmdm9pZCAwPT09aSYmcWUoZSwibWlzc2luZyBleHBvbmVudCBwb3dlciIpLG4mJnZvaWQgMD09PXQmJnFlKGUsIm1pc3NpbmcgZXhwb25lbnQgYmFzZSIpLHZvaWQgMD09PW4mJihyfHxpKSYmcWUoZSwibWlzc2luZyBlIGJlZm9yZSBleHBvbmVudCIpfWlmKCIrIiE9PWVbeV0mJiItIiE9PWVbeV18fChyPSEwLG49Ii0iPT09ZVt5KytdKSwhV2UoZVt5XSkmJiIuIiE9PWVbeV0pe2lmKCJpIj09PWVbeV18fCJJIj09PWVbeV0pcmV0dXJuIG5ldyBIZShuP1ZlOlBlKTtpZigiTiI9PT1lW3ldKXJldHVybiBuZXcgSGUoTWUpfWZvcig7V2UoZVt5XSl8fCIuIj09PWVbeV07KSIuIiE9PWVbeV0/KF88MzQmJigiMCIhPT1lW3ldfHxvKSYmKG98fChmPWEpLG89ITAsdVtnKytdPXBhcnNlSW50KGVbeV0sMTApLF8rPTEpLG8mJihjKz0xKSxpJiYobCs9MSksYSs9MSx5Kz0xKTooaSYmcWUoZSwiY29udGFpbnMgbXVsdGlwbGUgcGVyaW9kcyIpLGk9ITAseSs9MSk7aWYoaSYmIWEpdGhyb3cgbmV3IFooZSsiIG5vdCBhIHZhbGlkIERlY2ltYWwxMjggc3RyaW5nIik7aWYoImUiPT09ZVt5XXx8IkUiPT09ZVt5XSl7Y29uc3QgdD1lLnN1YnN0cigrK3kpLm1hdGNoKEplKTtpZighdHx8IXRbMl0pcmV0dXJuIG5ldyBIZShNZSk7Yj1wYXJzZUludCh0WzBdLDEwKSx5Kz10WzBdLmxlbmd0aH1pZihlW3ldKXJldHVybiBuZXcgSGUoTWUpO2lmKF8pe2lmKGg9Xy0xLHM9YywxIT09cylmb3IoOyIwIj09PWVbZitzLTErTnVtYmVyKHIpK051bWJlcihpKV07KXMtPTF9ZWxzZSB1WzBdPTAsYz0xLF89MSxzPTA7Zm9yKGI8PWwmJmw+YisxNjM4ND9iPUNlOmItPWw7Yj5EZTspe2lmKGgrPTEsaD49MzQpe2lmKDA9PT1zKXtiPURlO2JyZWFrfXFlKGUsIm92ZXJmbG93Iil9Yi09MX1pZih0LmFsbG93Um91bmRpbmcpe2Zvcig7YjxDZXx8XzxjOyl7aWYoMD09PWgmJnM8Xyl7Yj1DZSxzPTA7YnJlYWt9aWYoXzxjP2MtPTE6aC09MSxiPERlKWIrPTE7ZWxzZXtpZih1LmpvaW4oIiIpLm1hdGNoKC9eMCskLykpe2I9RGU7YnJlYWt9cWUoZSwib3ZlcmZsb3ciKX19aWYoaCsxPHMpe2xldCB0PWE7aSYmKGYrPTEsdCs9MSksciYmKGYrPTEsdCs9MSk7Y29uc3Qgbz1wYXJzZUludChlW2YraCsxXSwxMCk7bGV0IHM9MDtpZihvPj01JiYocz0xLDU9PT1vKSl7cz11W2hdJTI9PTE/MTowO2ZvcihsZXQgbj1mK2grMjtuPHQ7bisrKWlmKHBhcnNlSW50KGVbbl0sMTApKXtzPTE7YnJlYWt9fWlmKHMpe2xldCBlPWg7Zm9yKDtlPj0wJiYrK3VbZV0+OTtlLS0paWYodVtlXT0wLDA9PT1lKXtpZighKGI8RGUpKXJldHVybiBuZXcgSGUobj9WZTpQZSk7Yis9MSx1W2VdPTF9fX19ZWxzZXtmb3IoO2I8Q2V8fF88Yzspe2lmKDA9PT1oKXtpZigwPT09cyl7Yj1DZTticmVha31xZShlLCJleHBvbmVudCB1bmRlcmZsb3ciKX1fPGM/KCIwIiE9PWVbYy0xK051bWJlcihyKStOdW1iZXIoaSldJiYwIT09cyYmcWUoZSwiaW5leGFjdCByb3VuZGluZyIpLGMtPTEpOigwIT09dVtoXSYmcWUoZSwiaW5leGFjdCByb3VuZGluZyIpLGgtPTEpLGI8RGU/Yis9MTpxZShlLCJvdmVyZmxvdyIpfWlmKGgrMTxzKXtpJiYoZis9MSksciYmKGYrPTEpOzAhPT1wYXJzZUludChlW2YraCsxXSwxMCkmJnFlKGUsImluZXhhY3Qgcm91bmRpbmciKX19aWYoZD1qZS5mcm9tTnVtYmVyKDApLHc9amUuZnJvbU51bWJlcigwKSwwPT09cylkPWplLmZyb21OdW1iZXIoMCksdz1qZS5mcm9tTnVtYmVyKDApO2Vsc2UgaWYoaDwxNyl7bGV0IGU9MDtmb3Iodz1qZS5mcm9tTnVtYmVyKHVbZSsrXSksZD1uZXcgamUoMCwwKTtlPD1oO2UrKyl3PXcubXVsdGlwbHkoamUuZnJvbU51bWJlcigxMCkpLHc9dy5hZGQoamUuZnJvbU51bWJlcih1W2VdKSl9ZWxzZXtsZXQgZT0wO2ZvcihkPWplLmZyb21OdW1iZXIodVtlKytdKTtlPD1oLTE3O2UrKylkPWQubXVsdGlwbHkoamUuZnJvbU51bWJlcigxMCkpLGQ9ZC5hZGQoamUuZnJvbU51bWJlcih1W2VdKSk7Zm9yKHc9amUuZnJvbU51bWJlcih1W2UrK10pO2U8PWg7ZSsrKXc9dy5tdWx0aXBseShqZS5mcm9tTnVtYmVyKDEwKSksdz13LmFkZChqZS5mcm9tTnVtYmVyKHVbZV0pKX1jb25zdCB4PWZ1bmN0aW9uKGUsdCl7aWYoIWUmJiF0KXJldHVybntoaWdoOmplLmZyb21OdW1iZXIoMCksbG93OmplLmZyb21OdW1iZXIoMCl9O2NvbnN0IG49ZS5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpLHI9bmV3IGplKGUuZ2V0TG93Qml0cygpLDApLGk9dC5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpLG89bmV3IGplKHQuZ2V0TG93Qml0cygpLDApO2xldCBzPW4ubXVsdGlwbHkoaSksYT1uLm11bHRpcGx5KG8pO2NvbnN0IGM9ci5tdWx0aXBseShpKTtsZXQgbD1yLm11bHRpcGx5KG8pO3JldHVybiBzPXMuYWRkKGEuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSksYT1uZXcgamUoYS5nZXRMb3dCaXRzKCksMCkuYWRkKGMpLmFkZChsLnNoaWZ0UmlnaHRVbnNpZ25lZCgzMikpLHM9cy5hZGQoYS5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpKSxsPWEuc2hpZnRMZWZ0KDMyKS5hZGQobmV3IGplKGwuZ2V0TG93Qml0cygpLDApKSx7aGlnaDpzLGxvdzpsfX0oZCxqZS5mcm9tU3RyaW5nKCIxMDAwMDAwMDAwMDAwMDAwMDAiKSk7eC5sb3c9eC5sb3cuYWRkKHcpLGZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1lLmhpZ2g+Pj4wLHI9dC5oaWdoPj4+MDtpZihuPHIpcmV0dXJuITA7aWYobj09PXImJmUubG93Pj4+MDx0Lmxvdz4+PjApcmV0dXJuITA7cmV0dXJuITF9KHgubG93LHcpJiYoeC5oaWdoPXguaGlnaC5hZGQoamUuZnJvbU51bWJlcigxKSkpLHA9Yis2MTc2O2NvbnN0IEU9e2xvdzpqZS5mcm9tTnVtYmVyKDApLGhpZ2g6amUuZnJvbU51bWJlcigwKX07eC5oaWdoLnNoaWZ0UmlnaHRVbnNpZ25lZCg0OSkuYW5kKGplLmZyb21OdW1iZXIoMSkpLmVxdWFscyhqZS5mcm9tTnVtYmVyKDEpKT8oRS5oaWdoPUUuaGlnaC5vcihqZS5mcm9tTnVtYmVyKDMpLnNoaWZ0TGVmdCg2MSkpLEUuaGlnaD1FLmhpZ2gub3IoamUuZnJvbU51bWJlcihwKS5hbmQoamUuZnJvbU51bWJlcigxNjM4Mykuc2hpZnRMZWZ0KDQ3KSkpLEUuaGlnaD1FLmhpZ2gub3IoeC5oaWdoLmFuZChqZS5mcm9tTnVtYmVyKDB4N2ZmZmZmZmZmZmZmKSkpKTooRS5oaWdoPUUuaGlnaC5vcihqZS5mcm9tTnVtYmVyKDE2MzgzJnApLnNoaWZ0TGVmdCg0OSkpLEUuaGlnaD1FLmhpZ2gub3IoeC5oaWdoLmFuZChqZS5mcm9tTnVtYmVyKDU2Mjk0OTk1MzQyMTMxMSkpKSksRS5sb3c9eC5sb3csbiYmKEUuaGlnaD1FLmhpZ2gub3IoamUuZnJvbVN0cmluZygiOTIyMzM3MjAzNjg1NDc3NTgwOCIpKSk7Y29uc3QgVT1fZS5hbGxvY2F0ZVVuc2FmZSgxNik7cmV0dXJuIHk9MCxVW3krK109MjU1JkUubG93LmxvdyxVW3krK109RS5sb3cubG93Pj44JjI1NSxVW3krK109RS5sb3cubG93Pj4xNiYyNTUsVVt5KytdPUUubG93Lmxvdz4+MjQmMjU1LFVbeSsrXT0yNTUmRS5sb3cuaGlnaCxVW3krK109RS5sb3cuaGlnaD4+OCYyNTUsVVt5KytdPUUubG93LmhpZ2g+PjE2JjI1NSxVW3krK109RS5sb3cuaGlnaD4+MjQmMjU1LFVbeSsrXT0yNTUmRS5oaWdoLmxvdyxVW3krK109RS5oaWdoLmxvdz4+OCYyNTUsVVt5KytdPUUuaGlnaC5sb3c+PjE2JjI1NSxVW3krK109RS5oaWdoLmxvdz4+MjQmMjU1LFVbeSsrXT0yNTUmRS5oaWdoLmhpZ2gsVVt5KytdPUUuaGlnaC5oaWdoPj44JjI1NSxVW3krK109RS5oaWdoLmhpZ2g+PjE2JjI1NSxVW3krK109RS5oaWdoLmhpZ2g+PjI0JjI1NSxuZXcgSGUoVSl9dG9TdHJpbmcoKXtsZXQgZSx0PTA7Y29uc3Qgbj1uZXcgQXJyYXkoMzYpO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKW5bZV09MDtsZXQgcixpLG8scz0wLGE9ITEsYz17cGFydHM6WzAsMCwwLDBdfTtjb25zdCBsPVtdO3M9MDtjb25zdCBmPXRoaXMuYnl0ZXMsdT1mW3MrK118ZltzKytdPDw4fGZbcysrXTw8MTZ8ZltzKytdPDwyNCxfPWZbcysrXXxmW3MrK108PDh8ZltzKytdPDwxNnxmW3MrK108PDI0LGc9ZltzKytdfGZbcysrXTw8OHxmW3MrK108PDE2fGZbcysrXTw8MjQsaD1mW3MrK118ZltzKytdPDw4fGZbcysrXTw8MTZ8ZltzKytdPDwyNDtzPTA7KHtsb3c6bmV3IGplKHUsXyksaGlnaDpuZXcgamUoZyxoKX0pLmhpZ2gubGVzc1RoYW4oamUuWkVSTykmJmwucHVzaCgiLSIpO2NvbnN0IGI9aD4+MjYmMzE7aWYoYj4+Mz09Myl7aWYoMzA9PT1iKXJldHVybiBsLmpvaW4oIiIpKyJJbmZpbml0eSI7aWYoMzE9PT1iKXJldHVybiJOYU4iO2U9aD4+MTUmMTYzODMscj04KyhoPj4xNCYxKX1lbHNlIHI9aD4+MTQmNyxlPWg+PjE3JjE2MzgzO2NvbnN0IGQ9ZS02MTc2O2lmKGMucGFydHNbMF09KDE2MzgzJmgpKygoMTUmcik8PDE0KSxjLnBhcnRzWzFdPWcsYy5wYXJ0c1syXT1fLGMucGFydHNbM109dSwwPT09Yy5wYXJ0c1swXSYmMD09PWMucGFydHNbMV0mJjA9PT1jLnBhcnRzWzJdJiYwPT09Yy5wYXJ0c1szXSlhPSEwO2Vsc2UgZm9yKG89MztvPj0wO28tLSl7bGV0IGU9MDtjb25zdCB0PVllKGMpO2lmKGM9dC5xdW90aWVudCxlPXQucmVtLmxvdyxlKWZvcihpPTg7aT49MDtpLS0pbls5Km8raV09ZSUxMCxlPU1hdGguZmxvb3IoZS8xMCl9aWYoYSl0PTEsbltzXT0wO2Vsc2UgZm9yKHQ9MzY7IW5bc107KXQtPTEscys9MTtjb25zdCB3PXQtMStkO2lmKHc+PTM0fHx3PD0tN3x8ZD4wKXtpZih0PjM0KXJldHVybiBsLnB1c2goIjAiKSxkPjA/bC5wdXNoKGBFKyR7ZH1gKTpkPDAmJmwucHVzaChgRSR7ZH1gKSxsLmpvaW4oIiIpO2wucHVzaChgJHtuW3MrK119YCksdC09MSx0JiZsLnB1c2goIi4iKTtmb3IobGV0IGU9MDtlPHQ7ZSsrKWwucHVzaChgJHtuW3MrK119YCk7bC5wdXNoKCJFIiksdz4wP2wucHVzaChgKyR7d31gKTpsLnB1c2goYCR7d31gKX1lbHNlIGlmKGQ+PTApZm9yKGxldCBlPTA7ZTx0O2UrKylsLnB1c2goYCR7bltzKytdfWApO2Vsc2V7bGV0IGU9dCtkO2lmKGU+MClmb3IobGV0IHQ9MDt0PGU7dCsrKWwucHVzaChgJHtuW3MrK119YCk7ZWxzZSBsLnB1c2goIjAiKTtmb3IobC5wdXNoKCIuIik7ZSsrPDA7KWwucHVzaCgiMCIpO2ZvcihsZXQgcj0wO3I8dC1NYXRoLm1heChlLTEsMCk7cisrKWwucHVzaChgJHtuW3MrK119YCl9cmV0dXJuIGwuam9pbigiIil9dG9KU09OKCl7cmV0dXJueyRudW1iZXJEZWNpbWFsOnRoaXMudG9TdHJpbmcoKX19dG9FeHRlbmRlZEpTT04oKXtyZXR1cm57JG51bWJlckRlY2ltYWw6dGhpcy50b1N0cmluZygpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtyZXR1cm4gSGUuZnJvbVN0cmluZyhlLiRudW1iZXJEZWNpbWFsKX1pbnNwZWN0KGUsdCxuKXtuPz89dztyZXR1cm5gbmV3IERlY2ltYWwxMjgoJHtuKHRoaXMudG9TdHJpbmcoKSx0KX0pYH19Y2xhc3MgS2UgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkRvdWJsZSJ9dmFsdWU7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSxlIGluc3RhbmNlb2YgTnVtYmVyJiYoZT1lLnZhbHVlT2YoKSksdGhpcy52YWx1ZT0rZX1zdGF0aWMgZnJvbVN0cmluZyhlKXtjb25zdCB0PU51bWJlcihlKTtpZigiTmFOIj09PWUpcmV0dXJuIG5ldyBLZShOYU4pO2lmKCJJbmZpbml0eSI9PT1lKXJldHVybiBuZXcgS2UoMS8wKTtpZigiLUluZmluaXR5Ij09PWUpcmV0dXJuIG5ldyBLZSgtMS8wKTtpZighTnVtYmVyLmlzRmluaXRlKHQpKXRocm93IG5ldyBaKGBJbnB1dDogJHtlfSBpcyBub3QgcmVwcmVzZW50YWJsZSBhcyBhIERvdWJsZWApO2lmKGUudHJpbSgpIT09ZSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBjb250YWlucyB3aGl0ZXNwYWNlYCk7aWYoIiI9PT1lKXRocm93IG5ldyBaKCJJbnB1dCBpcyBhbiBlbXB0eSBzdHJpbmciKTtpZigvW14tMC05LitlRV0vLnRlc3QoZSkpdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgaXMgbm90IGluIGRlY2ltYWwgb3IgZXhwb25lbnRpYWwgbm90YXRpb25gKTtyZXR1cm4gbmV3IEtlKHQpfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy52YWx1ZX10b0pTT04oKXtyZXR1cm4gdGhpcy52YWx1ZX10b1N0cmluZyhlKXtyZXR1cm4gdGhpcy52YWx1ZS50b1N0cmluZyhlKX10b0V4dGVuZGVkSlNPTihlKXtyZXR1cm4gZSYmKGUubGVnYWN5fHxlLnJlbGF4ZWQmJmlzRmluaXRlKHRoaXMudmFsdWUpKT90aGlzLnZhbHVlOk9iamVjdC5pcyhNYXRoLnNpZ24odGhpcy52YWx1ZSksLTApP3skbnVtYmVyRG91YmxlOiItMC4wIn06eyRudW1iZXJEb3VibGU6TnVtYmVyLmlzSW50ZWdlcih0aGlzLnZhbHVlKT90aGlzLnZhbHVlLnRvRml4ZWQoMSk6dGhpcy52YWx1ZS50b1N0cmluZygpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlLHQpe2NvbnN0IG49cGFyc2VGbG9hdChlLiRudW1iZXJEb3VibGUpO3JldHVybiB0JiZ0LnJlbGF4ZWQ/bjpuZXcgS2Uobil9aW5zcGVjdChlLHQsbil7cmV0dXJuIG4/Pz13LGBuZXcgRG91YmxlKCR7bih0aGlzLnZhbHVlLHQpfSlgfX1jbGFzcyBaZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iSW50MzIifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksZSBpbnN0YW5jZW9mIE51bWJlciYmKGU9ZS52YWx1ZU9mKCkpLHRoaXMudmFsdWU9MHwrZX1zdGF0aWMgZnJvbVN0cmluZyhlKXtjb25zdCB0PU5lKGUpLG49TnVtYmVyKGUpO2lmKG08bil0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSBmb3IgSW50MzJgKTtpZihTPm4pdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgaXMgc21hbGxlciB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBJbnQzMmApO2lmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtpZihuLnRvU3RyaW5nKCkhPT10KXRocm93IG5ldyBaKGBJbnB1dDogJyR7ZX0nIGlzIG5vdCBhIHZhbGlkIEludDMyIHN0cmluZ2ApO3JldHVybiBuZXcgWmUobil9dmFsdWVPZigpe3JldHVybiB0aGlzLnZhbHVlfXRvU3RyaW5nKGUpe3JldHVybiB0aGlzLnZhbHVlLnRvU3RyaW5nKGUpfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvRXh0ZW5kZWRKU09OKGUpe3JldHVybiBlJiYoZS5yZWxheGVkfHxlLmxlZ2FjeSk/dGhpcy52YWx1ZTp7JG51bWJlckludDp0aGlzLnZhbHVlLnRvU3RyaW5nKCl9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUsdCl7cmV0dXJuIHQmJnQucmVsYXhlZD9wYXJzZUludChlLiRudW1iZXJJbnQsMTApOm5ldyBaZShlLiRudW1iZXJJbnQpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IEludDMyKCR7bih0aGlzLnZhbHVlLHQpfSlgfX1jbGFzcyBHZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iTWF4S2V5In10b0V4dGVuZGVkSlNPTigpe3JldHVybnskbWF4S2V5OjF9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKCl7cmV0dXJuIG5ldyBHZX1pbnNwZWN0KCl7cmV0dXJuIm5ldyBNYXhLZXkoKSJ9fWNsYXNzIFhlIGV4dGVuZHMgaGV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJNaW5LZXkifXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRtaW5LZXk6MX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oKXtyZXR1cm4gbmV3IFhlfWluc3BlY3QoKXtyZXR1cm4ibmV3IE1pbktleSgpIn19bGV0IFFlPW51bGw7Y29uc3QgZXQ9bmV3IFdlYWtNYXA7Y2xhc3MgdHQgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIk9iamVjdElkIn1zdGF0aWMgaW5kZXg9TWF0aC5mbG9vcigxNjc3NzIxNSpNYXRoLnJhbmRvbSgpKTtzdGF0aWMgY2FjaGVIZXhTdHJpbmc7YnVmZmVyO2NvbnN0cnVjdG9yKGUpe2xldCB0O2lmKHN1cGVyKCksIm9iamVjdCI9PXR5cGVvZiBlJiZlJiYiaWQiaW4gZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlLmlkJiYhQXJyYXlCdWZmZXIuaXNWaWV3KGUuaWQpKXRocm93IG5ldyBaKCJBcmd1bWVudCBwYXNzZWQgaW4gbXVzdCBoYXZlIGFuIGlkIHRoYXQgaXMgb2YgdHlwZSBzdHJpbmcgb3IgQnVmZmVyIik7dD0idG9IZXhTdHJpbmciaW4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9IZXhTdHJpbmc/X2UuZnJvbUhleChlLnRvSGV4U3RyaW5nKCkpOmUuaWR9ZWxzZSB0PWU7aWYobnVsbD09dCl0aGlzLmJ1ZmZlcj10dC5nZW5lcmF0ZSgpO2Vsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYxMj09PXQuYnl0ZUxlbmd0aCl0aGlzLmJ1ZmZlcj1fZS50b0xvY2FsQnVmZmVyVHlwZSh0KTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgWigiQXJndW1lbnQgcGFzc2VkIGluIGRvZXMgbm90IG1hdGNoIHRoZSBhY2NlcHRlZCB0eXBlcyIpO2lmKCF0dC52YWxpZGF0ZUhleFN0cmluZyh0KSl0aHJvdyBuZXcgWigiaW5wdXQgbXVzdCBiZSBhIDI0IGNoYXJhY3RlciBoZXggc3RyaW5nLCAxMiBieXRlIFVpbnQ4QXJyYXksIG9yIGFuIGludGVnZXIiKTt0aGlzLmJ1ZmZlcj1fZS5mcm9tSGV4KHQpLHR0LmNhY2hlSGV4U3RyaW5nJiZldC5zZXQodGhpcyx0KX19Z2V0IGlkKCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNldCBpZChlKXt0aGlzLmJ1ZmZlcj1lLHR0LmNhY2hlSGV4U3RyaW5nJiZldC5zZXQodGhpcyxfZS50b0hleChlKSl9c3RhdGljIHZhbGlkYXRlSGV4U3RyaW5nKGUpe2lmKDI0IT09ZT8ubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgdD0wO3Q8MjQ7dCsrKXtjb25zdCBuPWUuY2hhckNvZGVBdCh0KTtpZighKG4+PTQ4JiZuPD01N3x8bj49OTcmJm48PTEwMnx8bj49NjUmJm48PTcwKSlyZXR1cm4hMX1yZXR1cm4hMH10b0hleFN0cmluZygpe2lmKHR0LmNhY2hlSGV4U3RyaW5nKXtjb25zdCBlPWV0LmdldCh0aGlzKTtpZihlKXJldHVybiBlfWNvbnN0IGU9X2UudG9IZXgodGhpcy5pZCk7cmV0dXJuIHR0LmNhY2hlSGV4U3RyaW5nJiZldC5zZXQodGhpcyxlKSxlfXN0YXRpYyBnZXRJbmMoKXtyZXR1cm4gdHQuaW5kZXg9KHR0LmluZGV4KzEpJTE2Nzc3MjE1fXN0YXRpYyBnZW5lcmF0ZShlKXsibnVtYmVyIiE9dHlwZW9mIGUmJihlPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpKTtjb25zdCB0PXR0LmdldEluYygpLG49X2UuYWxsb2NhdGVVbnNhZmUoMTIpO3JldHVybiBwZS5zZXRJbnQzMkJFKG4sMCxlKSxudWxsPT09UWUmJihRZT1fZS5yYW5kb21CeXRlcyg1KSksbls0XT1RZVswXSxuWzVdPVFlWzFdLG5bNl09UWVbMl0sbls3XT1RZVszXSxuWzhdPVFlWzRdLG5bMTFdPTI1NSZ0LG5bMTBdPXQ+PjgmMjU1LG5bOV09dD4+MTYmMjU1LG59dG9TdHJpbmcoZSl7cmV0dXJuImJhc2U2NCI9PT1lP19lLnRvQmFzZTY0KHRoaXMuaWQpOnRoaXMudG9IZXhTdHJpbmcoKX10b0pTT04oKXtyZXR1cm4gdGhpcy50b0hleFN0cmluZygpfXN0YXRpYyBpcyhlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiX2Jzb250eXBlImluIGUmJiJPYmplY3RJZCI9PT1lLl9ic29udHlwZX1lcXVhbHMoZSl7aWYobnVsbD09ZSlyZXR1cm4hMTtpZih0dC5pcyhlKSlyZXR1cm4gdGhpcy5idWZmZXJbMTFdPT09ZS5idWZmZXJbMTFdJiZfZS5lcXVhbHModGhpcy5idWZmZXIsZS5idWZmZXIpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZS50b0xvd2VyQ2FzZSgpPT09dGhpcy50b0hleFN0cmluZygpO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9IZXhTdHJpbmcpe2NvbnN0IHQ9ZS50b0hleFN0cmluZygpLG49dGhpcy50b0hleFN0cmluZygpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmdC50b0xvd2VyQ2FzZSgpPT09bn1yZXR1cm4hMX1nZXRUaW1lc3RhbXAoKXtjb25zdCBlPW5ldyBEYXRlLHQ9cGUuZ2V0VWludDMyQkUodGhpcy5idWZmZXIsMCk7cmV0dXJuIGUuc2V0VGltZSgxZTMqTWF0aC5mbG9vcih0KSksZX1zdGF0aWMgY3JlYXRlUGsoKXtyZXR1cm4gbmV3IHR0fXNlcmlhbGl6ZUludG8oZSx0KXtyZXR1cm4gZVt0XT10aGlzLmJ1ZmZlclswXSxlW3QrMV09dGhpcy5idWZmZXJbMV0sZVt0KzJdPXRoaXMuYnVmZmVyWzJdLGVbdCszXT10aGlzLmJ1ZmZlclszXSxlW3QrNF09dGhpcy5idWZmZXJbNF0sZVt0KzVdPXRoaXMuYnVmZmVyWzVdLGVbdCs2XT10aGlzLmJ1ZmZlcls2XSxlW3QrN109dGhpcy5idWZmZXJbN10sZVt0KzhdPXRoaXMuYnVmZmVyWzhdLGVbdCs5XT10aGlzLmJ1ZmZlcls5XSxlW3QrMTBdPXRoaXMuYnVmZmVyWzEwXSxlW3QrMTFdPXRoaXMuYnVmZmVyWzExXSwxMn1zdGF0aWMgY3JlYXRlRnJvbVRpbWUoZSl7Y29uc3QgdD1fZS5hbGxvY2F0ZSgxMik7Zm9yKGxldCBlPTExO2U+PTQ7ZS0tKXRbZV09MDtyZXR1cm4gcGUuc2V0SW50MzJCRSh0LDAsZSksbmV3IHR0KHQpfXN0YXRpYyBjcmVhdGVGcm9tSGV4U3RyaW5nKGUpe2lmKDI0IT09ZT8ubGVuZ3RoKXRocm93IG5ldyBaKCJoZXggc3RyaW5nIG11c3QgYmUgMjQgY2hhcmFjdGVycyIpO3JldHVybiBuZXcgdHQoX2UuZnJvbUhleChlKSl9c3RhdGljIGNyZWF0ZUZyb21CYXNlNjQoZSl7aWYoMTYhPT1lPy5sZW5ndGgpdGhyb3cgbmV3IFooImJhc2U2NCBzdHJpbmcgbXVzdCBiZSAxNiBjaGFyYWN0ZXJzIik7cmV0dXJuIG5ldyB0dChfZS5mcm9tQmFzZTY0KGUpKX1zdGF0aWMgaXNWYWxpZChlKXtpZihudWxsPT1lKXJldHVybiExO2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gdHQudmFsaWRhdGVIZXhTdHJpbmcoZSk7dHJ5e3JldHVybiBuZXcgdHQoZSksITB9Y2F0Y2h7cmV0dXJuITF9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJuIHRoaXMudG9IZXhTdHJpbmc/eyRvaWQ6dGhpcy50b0hleFN0cmluZygpfTp7JG9pZDp0aGlzLnRvU3RyaW5nKCJoZXgiKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyB0dChlLiRvaWQpfWlzQ2FjaGVkKCl7cmV0dXJuIHR0LmNhY2hlSGV4U3RyaW5nJiZldC5oYXModGhpcyl9aW5zcGVjdChlLHQsbil7cmV0dXJuIG4/Pz13LGBuZXcgT2JqZWN0SWQoJHtuKHRoaXMudG9IZXhTdHJpbmcoKSx0KX0pYH19ZnVuY3Rpb24gbnQoZSx0LG4pe2xldCByPTU7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKylyKz1ydChpLnRvU3RyaW5nKCksZVtpXSx0LCEwLG4pO2Vsc2V7ImZ1bmN0aW9uIj09dHlwZW9mIGU/LnRvQlNPTiYmKGU9ZS50b0JTT04oKSk7Zm9yKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoZSkpcis9cnQoaSxlW2ldLHQsITEsbil9cmV0dXJuIHJ9ZnVuY3Rpb24gcnQoZSx0LG49ITEscj0hMSxpPSExKXtzd2l0Y2goImZ1bmN0aW9uIj09dHlwZW9mIHQ/LnRvQlNPTiYmKHQ9dC50b0JTT04oKSksdHlwZW9mIHQpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gMStfZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzQrX2UudXRmOEJ5dGVMZW5ndGgodCkrMTtjYXNlIm51bWJlciI6cmV0dXJuIE1hdGguZmxvb3IodCk9PT10JiZ0Pj1VJiZ0PD1FJiZ0Pj1TJiZ0PD1tPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrNToobnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzk7Y2FzZSJ1bmRlZmluZWQiOnJldHVybiByfHwhaT8obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzE6MDtjYXNlImJvb2xlYW4iOnJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMjtjYXNlIm9iamVjdCI6aWYobnVsbCE9dCYmInN0cmluZyI9PXR5cGVvZiB0Ll9ic29udHlwZSYmdFt5XSE9PXApdGhyb3cgbmV3IEc7aWYobnVsbD09dHx8Ik1pbktleSI9PT10Ll9ic29udHlwZXx8Ik1heEtleSI9PT10Ll9ic29udHlwZSlyZXR1cm4obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzE7aWYoIk9iamVjdElkIj09PXQuX2Jzb250eXBlKXJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTM7aWYodCBpbnN0YW5jZW9mIERhdGV8fGQodCkpcmV0dXJuKG51bGwhPWU/X2UudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs5O2lmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxnKHQpKXJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrNit0LmJ5dGVMZW5ndGg7aWYoIkxvbmciPT09dC5fYnNvbnR5cGV8fCJEb3VibGUiPT09dC5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09dC5fYnNvbnR5cGUpcmV0dXJuKG51bGwhPWU/X2UudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs5O2lmKCJEZWNpbWFsMTI4Ij09PXQuX2Jzb250eXBlKXJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTc7aWYoIkNvZGUiPT09dC5fYnNvbnR5cGUpcmV0dXJuIG51bGwhPXQuc2NvcGUmJk9iamVjdC5rZXlzKHQuc2NvcGUpLmxlbmd0aD4wPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0KzQrX2UudXRmOEJ5dGVMZW5ndGgodC5jb2RlLnRvU3RyaW5nKCkpKzErbnQodC5zY29wZSxuLGkpOihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0K19lLnV0ZjhCeXRlTGVuZ3RoKHQuY29kZS50b1N0cmluZygpKSsxO2lmKCJCaW5hcnkiPT09dC5fYnNvbnR5cGUpe2NvbnN0IG49dDtyZXR1cm4gbi5zdWJfdHlwZT09PXllLlNVQlRZUEVfQllURV9BUlJBWT8obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKyhuLnBvc2l0aW9uKzErNCsxKzQpOihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrKG4ucG9zaXRpb24rMSs0KzEpfWlmKCJTeW1ib2wiPT09dC5fYnNvbnR5cGUpcmV0dXJuKG51bGwhPWU/X2UudXRmOEJ5dGVMZW5ndGgoZSkrMTowKStfZS51dGY4Qnl0ZUxlbmd0aCh0LnZhbHVlKSs0KzErMTtpZigiREJSZWYiPT09dC5fYnNvbnR5cGUpe2NvbnN0IHI9T2JqZWN0LmFzc2lnbih7JHJlZjp0LmNvbGxlY3Rpb24sJGlkOnQub2lkfSx0LmZpZWxkcyk7cmV0dXJuIG51bGwhPXQuZGImJihyLiRkYj10LmRiKSwobnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzErbnQocixuLGkpfXJldHVybiB0IGluc3RhbmNlb2YgUmVnRXhwfHxoKHQpPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMStfZS51dGY4Qnl0ZUxlbmd0aCh0LnNvdXJjZSkrMSsodC5nbG9iYWw/MTowKSsodC5pZ25vcmVDYXNlPzE6MCkrKHQubXVsdGlsaW5lPzE6MCkrMToiQlNPTlJlZ0V4cCI9PT10Ll9ic29udHlwZT8obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzErX2UudXRmOEJ5dGVMZW5ndGgodC5wYXR0ZXJuKSsxK19lLnV0ZjhCeXRlTGVuZ3RoKHQub3B0aW9ucykrMToobnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApK250KHQsbixpKSsxO2Nhc2UiZnVuY3Rpb24iOnJldHVybiBuPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0K19lLnV0ZjhCeXRlTGVuZ3RoKHQudG9TdHJpbmcoKSkrMTowO2Nhc2UiYmlnaW50IjpyZXR1cm4obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzk7Y2FzZSJzeW1ib2wiOnJldHVybiAwO2RlZmF1bHQ6dGhyb3cgbmV3IFooIlVucmVjb2duaXplZCBKUyB0eXBlOiAiK3R5cGVvZiB0KX19Y2xhc3MgaXQgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJTT05SZWdFeHAifXBhdHRlcm47b3B0aW9ucztjb25zdHJ1Y3RvcihlLHQpe2lmKHN1cGVyKCksdGhpcy5wYXR0ZXJuPWUsdGhpcy5vcHRpb25zPSh0Pz8iIikuc3BsaXQoIiIpLnNvcnQoKS5qb2luKCIiKSwtMSE9PXRoaXMucGF0dGVybi5pbmRleE9mKCJcMCIpKXRocm93IG5ldyBaKGBCU09OIFJlZ2V4IHBhdHRlcm5zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMucGF0dGVybil9YCk7aWYoLTEhPT10aGlzLm9wdGlvbnMuaW5kZXhPZigiXDAiKSl0aHJvdyBuZXcgWihgQlNPTiBSZWdleCBvcHRpb25zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucyl9YCk7Zm9yKGxldCBlPTA7ZTx0aGlzLm9wdGlvbnMubGVuZ3RoO2UrKylpZigiaSIhPT10aGlzLm9wdGlvbnNbZV0mJiJtIiE9PXRoaXMub3B0aW9uc1tlXSYmIngiIT09dGhpcy5vcHRpb25zW2VdJiYibCIhPT10aGlzLm9wdGlvbnNbZV0mJiJzIiE9PXRoaXMub3B0aW9uc1tlXSYmInUiIT09dGhpcy5vcHRpb25zW2VdKXRocm93IG5ldyBaKGBUaGUgcmVndWxhciBleHByZXNzaW9uIG9wdGlvbiBbJHt0aGlzLm9wdGlvbnNbZV19XSBpcyBub3Qgc3VwcG9ydGVkYCl9c3RhdGljIHBhcnNlT3B0aW9ucyhlKXtyZXR1cm4gZT9lLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik6IiJ9dG9FeHRlbmRlZEpTT04oZSl7cmV0dXJuKGU9ZXx8e30pLmxlZ2FjeT97JHJlZ2V4OnRoaXMucGF0dGVybiwkb3B0aW9uczp0aGlzLm9wdGlvbnN9OnskcmVndWxhckV4cHJlc3Npb246e3BhdHRlcm46dGhpcy5wYXR0ZXJuLG9wdGlvbnM6dGhpcy5vcHRpb25zfX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7aWYoIiRyZWdleCJpbiBlKXtpZigic3RyaW5nIj09dHlwZW9mIGUuJHJlZ2V4KXJldHVybiBuZXcgaXQoZS4kcmVnZXgsaXQucGFyc2VPcHRpb25zKGUuJG9wdGlvbnMpKTtpZigiQlNPTlJlZ0V4cCI9PT1lLiRyZWdleC5fYnNvbnR5cGUpcmV0dXJuIGV9aWYoIiRyZWd1bGFyRXhwcmVzc2lvbiJpbiBlKXJldHVybiBuZXcgaXQoZS4kcmVndWxhckV4cHJlc3Npb24ucGF0dGVybixpdC5wYXJzZU9wdGlvbnMoZS4kcmVndWxhckV4cHJlc3Npb24ub3B0aW9ucykpO3Rocm93IG5ldyBaKGBVbmV4cGVjdGVkIEJTT05SZWdFeHAgRUpTT04gb2JqZWN0IGZvcm06ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCl9aW5zcGVjdChlLHQsbil7Y29uc3Qgcj1mdW5jdGlvbihlKXtpZihudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJzdHlsaXplImluIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnN0eWxpemUpcmV0dXJuIGUuc3R5bGl6ZX0odCk/PyhlPT5lKTtuPz89dztyZXR1cm5gbmV3IEJTT05SZWdFeHAoJHtyKG4odGhpcy5wYXR0ZXJuKSwicmVnZXhwIil9LCAke3Iobih0aGlzLm9wdGlvbnMpLCJyZWdleHAiKX0pYH19Y2xhc3Mgb3QgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJTT05TeW1ib2wifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy52YWx1ZT1lfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy52YWx1ZX10b1N0cmluZygpe3JldHVybiB0aGlzLnZhbHVlfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRzeW1ib2w6dGhpcy52YWx1ZX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyBvdChlLiRzeW1ib2wpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IEJTT05TeW1ib2woJHtuKHRoaXMudmFsdWUsdCl9KWB9fWNvbnN0IHN0PWplO2NsYXNzIGF0IGV4dGVuZHMgc3R7Z2V0IF9ic29udHlwZSgpe3JldHVybiJUaW1lc3RhbXAifWdldFtnZV0oKXtyZXR1cm4iVGltZXN0YW1wIn1zdGF0aWMgTUFYX1ZBTFVFPWplLk1BWF9VTlNJR05FRF9WQUxVRTtnZXQgaSgpe3JldHVybiB0aGlzLmxvdz4+PjB9Z2V0IHQoKXtyZXR1cm4gdGhpcy5oaWdoPj4+MH1jb25zdHJ1Y3RvcihlKXtpZihudWxsPT1lKXN1cGVyKDAsMCwhMCk7ZWxzZSBpZigiYmlnaW50Ij09dHlwZW9mIGUpc3VwZXIoZSwhMCk7ZWxzZSBpZihqZS5pc0xvbmcoZSkpc3VwZXIoZS5sb3csZS5oaWdoLCEwKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZXx8ISgidCJpbiBlKXx8ISgiaSJpbiBlKSl0aHJvdyBuZXcgWigiQSBUaW1lc3RhbXAgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aDogYmlnaW50LCBMb25nLCBvciB7IHQ6IG51bWJlcjsgaTogbnVtYmVyIH0iKTt7aWYoIm51bWJlciIhPXR5cGVvZiBlLnQmJigib2JqZWN0IiE9dHlwZW9mIGUudHx8IkludDMyIiE9PWUudC5fYnNvbnR5cGUpKXRocm93IG5ldyBaKCJUaW1lc3RhbXAgY29uc3RydWN0ZWQgZnJvbSB7IHQsIGkgfSBtdXN0IHByb3ZpZGUgdCBhcyBhIG51bWJlciIpO2lmKCJudW1iZXIiIT10eXBlb2YgZS5pJiYoIm9iamVjdCIhPXR5cGVvZiBlLml8fCJJbnQzMiIhPT1lLmkuX2Jzb250eXBlKSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIGkgYXMgYSBudW1iZXIiKTtjb25zdCB0PU51bWJlcihlLnQpLG49TnVtYmVyKGUuaSk7aWYodDwwfHxOdW1iZXIuaXNOYU4odCkpdGhyb3cgbmV3IFooIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBhIHBvc2l0aXZlIHQiKTtpZihuPDB8fE51bWJlci5pc05hTihuKSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIGEgcG9zaXRpdmUgaSIpO2lmKHQ+NDI5NDk2NzI5NSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIHQgZXF1YWwgb3IgbGVzcyB0aGFuIHVpbnQzMiBtYXgiKTtpZihuPjQyOTQ5NjcyOTUpdGhyb3cgbmV3IFooIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBpIGVxdWFsIG9yIGxlc3MgdGhhbiB1aW50MzIgbWF4Iik7c3VwZXIobix0LCEwKX19fXRvSlNPTigpe3JldHVybnskdGltZXN0YW1wOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21JbnQoZSl7cmV0dXJuIG5ldyBhdChqZS5mcm9tSW50KGUsITApKX1zdGF0aWMgZnJvbU51bWJlcihlKXtyZXR1cm4gbmV3IGF0KGplLmZyb21OdW1iZXIoZSwhMCkpfXN0YXRpYyBmcm9tQml0cyhlLHQpe3JldHVybiBuZXcgYXQoe2k6ZSx0OnR9KX1zdGF0aWMgZnJvbVN0cmluZyhlLHQpe3JldHVybiBuZXcgYXQoamUuZnJvbVN0cmluZyhlLCEwLHQpKX10b0V4dGVuZGVkSlNPTigpe3JldHVybnskdGltZXN0YW1wOnt0OnRoaXMudCxpOnRoaXMuaX19fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe2NvbnN0IHQ9amUuaXNMb25nKGUuJHRpbWVzdGFtcC5pKT9lLiR0aW1lc3RhbXAuaS5nZXRMb3dCaXRzVW5zaWduZWQoKTplLiR0aW1lc3RhbXAuaSxuPWplLmlzTG9uZyhlLiR0aW1lc3RhbXAudCk/ZS4kdGltZXN0YW1wLnQuZ2V0TG93Qml0c1Vuc2lnbmVkKCk6ZS4kdGltZXN0YW1wLnQ7cmV0dXJuIG5ldyBhdCh7dDpuLGk6dH0pfWluc3BlY3QoZSx0LG4pe24/Pz13O3JldHVybmBuZXcgVGltZXN0YW1wKHsgdDogJHtuKHRoaXMudCx0KX0sIGk6ICR7bih0aGlzLmksdCl9IH0pYH19Y29uc3QgY3Q9amUuZnJvbU51bWJlcihFKSxsdD1qZS5mcm9tTnVtYmVyKFUpO2Z1bmN0aW9uIGZ0KGUsdCxuKXtjb25zdCByPSh0PW51bGw9PXQ/e306dCkmJnQuaW5kZXg/dC5pbmRleDowLGk9cGUuZ2V0SW50MzJMRShlLHIpO2lmKGk8NSl0aHJvdyBuZXcgWihgYnNvbiBzaXplIG11c3QgYmUgPj0gNSwgaXMgJHtpfWApO2lmKHQuYWxsb3dPYmplY3RTbWFsbGVyVGhhbkJ1ZmZlclNpemUmJmUubGVuZ3RoPGkpdGhyb3cgbmV3IFooYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCBiZSA+PSBic29uIHNpemUgJHtpfWApO2lmKCF0LmFsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplJiZlLmxlbmd0aCE9PWkpdGhyb3cgbmV3IFooYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCA9PT0gYnNvbiBzaXplICR7aX1gKTtpZihpK3I+ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyBaKGAoYnNvbiBzaXplICR7aX0gKyBvcHRpb25zLmluZGV4ICR7cn0gbXVzdCBiZSA8PSBidWZmZXIgbGVuZ3RoICR7ZS5ieXRlTGVuZ3RofSlgKTtpZigwIT09ZVtyK2ktMV0pdGhyb3cgbmV3IFooIk9uZSBvYmplY3QsIHNpemVkIGNvcnJlY3RseSwgd2l0aCBhIHNwb3QgZm9yIGFuIEVPTywgYnV0IHRoZSBFT08gaXNuJ3QgMHgwMCIpO3JldHVybiBfdChlLHIsdCxuKX1jb25zdCB1dD0vXlwkcmVmJHxeXCRpZCR8XlwkZGIkLztmdW5jdGlvbiBfdChlLHQsbixyPSExKXtjb25zdCBpPW51bGw9PW4uZmllbGRzQXNSYXc/bnVsbDpuLmZpZWxkc0FzUmF3LG89bnVsbCE9bi5yYXcmJm4ucmF3LHM9ImJvb2xlYW4iPT10eXBlb2Ygbi5ic29uUmVnRXhwJiZuLmJzb25SZWdFeHAsYT1uLnByb21vdGVCdWZmZXJzPz8hMSxjPW4ucHJvbW90ZUxvbmdzPz8hMCxsPW4ucHJvbW90ZVZhbHVlcz8/ITAsZj1uLnVzZUJpZ0ludDY0Pz8hMTtpZihmJiYhbCl0aHJvdyBuZXcgWigiTXVzdCBlaXRoZXIgcmVxdWVzdCBiaWdpbnQgb3IgTG9uZyBmb3IgaW50NjQgZGVzZXJpYWxpemF0aW9uIik7aWYoZiYmIWMpdGhyb3cgbmV3IFooIk11c3QgZWl0aGVyIHJlcXVlc3QgYmlnaW50IG9yIExvbmcgZm9yIGludDY0IGRlc2VyaWFsaXphdGlvbiIpO2xldCB1LF8sZz0hMDtjb25zdCBoPShudWxsPT1uLnZhbGlkYXRpb24/e3V0Zjg6ITB9Om4udmFsaWRhdGlvbikudXRmODtpZigiYm9vbGVhbiI9PXR5cGVvZiBoKXU9aDtlbHNle2c9ITE7Y29uc3QgZT1PYmplY3Qua2V5cyhoKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBoW2VdfSkpO2lmKDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgWigiVVRGLTggdmFsaWRhdGlvbiBzZXR0aW5nIGNhbm5vdCBiZSBlbXB0eSIpO2lmKCJib29sZWFuIiE9dHlwZW9mIGVbMF0pdGhyb3cgbmV3IFooIkludmFsaWQgVVRGLTggdmFsaWRhdGlvbiBvcHRpb24sIG11c3Qgc3BlY2lmeSBib29sZWFuIHZhbHVlcyIpO2lmKHU9ZVswXSwhZS5ldmVyeSgoZT0+ZT09PXUpKSl0aHJvdyBuZXcgWigiSW52YWxpZCBVVEYtOCB2YWxpZGF0aW9uIG9wdGlvbiAtIGtleXMgbXVzdCBiZSBhbGwgdHJ1ZSBvciBhbGwgZmFsc2UiKX1pZighZyl7Xz1uZXcgU2V0O2Zvcihjb25zdCBlIG9mIE9iamVjdC5rZXlzKGgpKV8uYWRkKGUpfWNvbnN0IGI9dDtpZihlLmxlbmd0aDw1KXRocm93IG5ldyBaKCJjb3JydXB0IGJzb24gbWVzc2FnZSA8IDUgYnl0ZXMgbG9uZyIpO2NvbnN0IGQ9cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsZDw1fHxkPmUubGVuZ3RoKXRocm93IG5ldyBaKCJjb3JydXB0IGJzb24gbWVzc2FnZSIpO2NvbnN0IHc9cj9bXTp7fTtsZXQgcD0wLHk9IXImJm51bGw7Zm9yKDs7KXtjb25zdCBoPWVbdCsrXTtpZigwPT09aClicmVhaztsZXQgYj10O2Zvcig7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmJ5dGVMZW5ndGgpdGhyb3cgbmV3IFooIkJhZCBCU09OIERvY3VtZW50OiBpbGxlZ2FsIENTdHJpbmciKTtjb25zdCBkPXI/cCsrOl9lLnRvVVRGOChlLHQsYiwhMSk7bGV0IG0sUz0hMDtpZihTPWd8fF8/LmhhcyhkKT91OiF1LCExIT09eSYmIiQiPT09ZFswXSYmKHk9dXQudGVzdChkKSksdD1iKzEsaD09PU4pe2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsbjw9MHx8bj5lLmxlbmd0aC10fHwwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFooImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTttPV9lLnRvVVRGOChlLHQsdCtuLTEsUyksdCs9bn1lbHNlIGlmKGg9PT1MKXtjb25zdCBuPV9lLmFsbG9jYXRlVW5zYWZlKDEyKTtmb3IobGV0IHI9MDtyPDEyO3IrKyluW3JdPWVbdCtyXTttPW5ldyB0dChuKSx0Kz0xMn1lbHNlIGlmKGg9PT1NJiYhMT09PWwpbT1uZXcgWmUocGUuZ2V0SW50MzJMRShlLHQpKSx0Kz00O2Vsc2UgaWYoaD09PU0pbT1wZS5nZXRJbnQzMkxFKGUsdCksdCs9NDtlbHNlIGlmKGg9PT1PKW09cGUuZ2V0RmxvYXQ2NExFKGUsdCksdCs9OCwhMT09PWwmJihtPW5ldyBLZShtKSk7ZWxzZSBpZihoPT09Uil7Y29uc3Qgbj1wZS5nZXRJbnQzMkxFKGUsdCkscj1wZS5nZXRJbnQzMkxFKGUsdCs0KTt0Kz04LG09bmV3IERhdGUobmV3IGplKG4scikudG9OdW1iZXIoKSl9ZWxzZSBpZihoPT09QSl7aWYoMCE9PWVbdF0mJjEhPT1lW3RdKXRocm93IG5ldyBaKCJpbGxlZ2FsIGJvb2xlYW4gdHlwZSB2YWx1ZSIpO209MT09PWVbdCsrXX1lbHNlIGlmKGg9PT1JKXtjb25zdCByPXQsaT1wZS5nZXRJbnQzMkxFKGUsdCk7aWYoaTw9MHx8aT5lLmxlbmd0aC10KXRocm93IG5ldyBaKCJiYWQgZW1iZWRkZWQgZG9jdW1lbnQgbGVuZ3RoIGluIGJzb24iKTtpZihvKW09ZS5zdWJhcnJheSh0LHQraSk7ZWxzZXtsZXQgdD1uO2d8fCh0PXsuLi5uLHZhbGlkYXRpb246e3V0Zjg6U319KSxtPV90KGUscix0LCExKX10Kz1pfWVsc2UgaWYoaD09PXYpe2NvbnN0IHI9dCxvPXBlLmdldEludDMyTEUoZSx0KTtsZXQgcz1uO2NvbnN0IGE9dCtvO2lmKGkmJmlbZF0mJihzPXsuLi5uLHJhdzohMH0pLGd8fChzPXsuLi5zLHZhbGlkYXRpb246e3V0Zjg6U319KSxtPV90KGUscixzLCEwKSwwIT09ZVsodCs9byktMV0pdGhyb3cgbmV3IFooImludmFsaWQgYXJyYXkgdGVybWluYXRvciBieXRlIik7aWYodCE9PWEpdGhyb3cgbmV3IFooImNvcnJ1cHRlZCBhcnJheSBic29uIil9ZWxzZSBpZihoPT09JCltPXZvaWQgMDtlbHNlIGlmKGg9PT1qKW09bnVsbDtlbHNlIGlmKGg9PT1QKWlmKGYpbT1wZS5nZXRCaWdJbnQ2NExFKGUsdCksdCs9ODtlbHNle2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpLHI9cGUuZ2V0SW50MzJMRShlLHQrNCk7dCs9ODtjb25zdCBpPW5ldyBqZShuLHIpO209YyYmITA9PT1sJiZpLmxlc3NUaGFuT3JFcXVhbChjdCkmJmkuZ3JlYXRlclRoYW5PckVxdWFsKGx0KT9pLnRvTnVtYmVyKCk6aX1lbHNlIGlmKGg9PT1KKXtjb25zdCBuPV9lLmFsbG9jYXRlVW5zYWZlKDE2KTtmb3IobGV0IHI9MDtyPDE2O3IrKyluW3JdPWVbdCtyXTt0Kz0xNixtPW5ldyBIZShuKX1lbHNlIGlmKGg9PT1UKXtsZXQgbj1wZS5nZXRJbnQzMkxFKGUsdCk7dCs9NDtjb25zdCByPW4saT1lW3QrK107aWYobjwwKXRocm93IG5ldyBaKCJOZWdhdGl2ZSBiaW5hcnkgdHlwZSBlbGVtZW50IHNpemUgZm91bmQiKTtpZihuPmUuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgWigiQmluYXJ5IHR5cGUgc2l6ZSBsYXJnZXIgdGhhbiBkb2N1bWVudCBzaXplIik7aWYoaT09PXllLlNVQlRZUEVfQllURV9BUlJBWSl7aWYobj1wZS5nZXRJbnQzMkxFKGUsdCksdCs9NCxuPDApdGhyb3cgbmV3IFooIk5lZ2F0aXZlIGJpbmFyeSB0eXBlIGVsZW1lbnQgc2l6ZSBmb3VuZCBmb3Igc3VidHlwZSAweDAyIik7aWYobj5yLTQpdGhyb3cgbmV3IFooIkJpbmFyeSB0eXBlIHdpdGggc3VidHlwZSAweDAyIGNvbnRhaW5zIHRvbyBsb25nIGJpbmFyeSBzaXplIik7aWYobjxyLTQpdGhyb3cgbmV3IFooIkJpbmFyeSB0eXBlIHdpdGggc3VidHlwZSAweDAyIGNvbnRhaW5zIHRvbyBzaG9ydCBiaW5hcnkgc2l6ZSIpfWEmJmw/bT1fZS50b0xvY2FsQnVmZmVyVHlwZShlLnN1YmFycmF5KHQsdCtuKSk6KG09bmV3IHllKGUuc3ViYXJyYXkodCx0K24pLGkpLGk9PT1IJiZ4ZS5pc1ZhbGlkKG0pJiYobT1tLnRvVVVJRCgpKSksdCs9bn1lbHNlIGlmKGg9PT1GJiYhMT09PXMpe2ZvcihiPXQ7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmxlbmd0aCl0aHJvdyBuZXcgWigiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IG49X2UudG9VVEY4KGUsdCxiLCExKTtmb3IoYj10PWIrMTswIT09ZVtiXSYmYjxlLmxlbmd0aDspYisrO2lmKGI+PWUubGVuZ3RoKXRocm93IG5ldyBaKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgcj1fZS50b1VURjgoZSx0LGIsITEpO3Q9YisxO2NvbnN0IGk9bmV3IEFycmF5KHIubGVuZ3RoKTtmb3IoYj0wO2I8ci5sZW5ndGg7YisrKXN3aXRjaChyW2JdKXtjYXNlIm0iOmlbYl09Im0iO2JyZWFrO2Nhc2UicyI6aVtiXT0iZyI7YnJlYWs7Y2FzZSJpIjppW2JdPSJpIn1tPW5ldyBSZWdFeHAobixpLmpvaW4oIiIpKX1lbHNlIGlmKGg9PT1GJiYhMD09PXMpe2ZvcihiPXQ7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmxlbmd0aCl0aHJvdyBuZXcgWigiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IG49X2UudG9VVEY4KGUsdCxiLCExKTtmb3IoYj10PWIrMTswIT09ZVtiXSYmYjxlLmxlbmd0aDspYisrO2lmKGI+PWUubGVuZ3RoKXRocm93IG5ldyBaKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgcj1fZS50b1VURjgoZSx0LGIsITEpO3Q9YisxLG09bmV3IGl0KG4scil9ZWxzZSBpZihoPT09RCl7Y29uc3Qgbj1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxuPD0wfHxuPmUubGVuZ3RoLXR8fDAhPT1lW3Qrbi0xXSl0aHJvdyBuZXcgWigiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO2NvbnN0IHI9X2UudG9VVEY4KGUsdCx0K24tMSxTKTttPWw/cjpuZXcgb3QociksdCs9bn1lbHNlIGlmKGg9PT1WKW09bmV3IGF0KHtpOnBlLmdldFVpbnQzMkxFKGUsdCksdDpwZS5nZXRVaW50MzJMRShlLHQrNCl9KSx0Kz04O2Vsc2UgaWYoaD09PVcpbT1uZXcgWGU7ZWxzZSBpZihoPT09WSltPW5ldyBHZTtlbHNlIGlmKGg9PT16KXtjb25zdCBuPXBlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48PTB8fG4+ZS5sZW5ndGgtdHx8MCE9PWVbdCtuLTFdKXRocm93IG5ldyBaKCJiYWQgc3RyaW5nIGxlbmd0aCBpbiBic29uIik7Y29uc3Qgcj1fZS50b1VURjgoZSx0LHQrbi0xLFMpO209bmV3IEVlKHIpLHQrPW59ZWxzZSBpZihoPT09Qyl7Y29uc3Qgcj1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxyPDEzKXRocm93IG5ldyBaKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBzaG9ydGVyIG1pbmltdW0gZXhwZWN0ZWQgbGVuZ3RoIik7Y29uc3QgaT1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxpPD0wfHxpPmUubGVuZ3RoLXR8fDAhPT1lW3QraS0xXSl0aHJvdyBuZXcgWigiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO2NvbnN0IG89X2UudG9VVEY4KGUsdCx0K2ktMSxTKSxzPXQrPWksYT1wZS5nZXRJbnQzMkxFKGUsdCksYz1fdChlLHMsbiwhMSk7aWYodCs9YSxyPDgrYStpKXRocm93IG5ldyBaKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBpcyB0b28gc2hvcnQsIHRydW5jYXRpbmcgc2NvcGUiKTtpZihyPjgrYStpKXRocm93IG5ldyBaKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBpcyB0b28gbG9uZywgY2xpcHMgb3V0ZXIgZG9jdW1lbnQiKTttPW5ldyBFZShvLGMpfWVsc2V7aWYoaCE9PWspdGhyb3cgbmV3IFooYERldGVjdGVkIHVua25vd24gQlNPTiB0eXBlICR7aC50b1N0cmluZygxNil9IGZvciBmaWVsZG5hbWUgIiR7ZH0iYCk7e2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsbjw9MHx8bj5lLmxlbmd0aC10fHwwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFooImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTtjb25zdCByPV9lLnRvVVRGOChlLHQsdCtuLTEsUyk7dCs9bjtjb25zdCBpPV9lLmFsbG9jYXRlVW5zYWZlKDEyKTtmb3IobGV0IG49MDtuPDEyO24rKylpW25dPWVbdCtuXTtjb25zdCBvPW5ldyB0dChpKTt0Kz0xMixtPW5ldyBPZShyLG8pfX0iX19wcm90b19fIj09PWQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHcsZCx7dmFsdWU6bSx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOndbZF09bX1pZihkIT09dC1iKXtpZihyKXRocm93IG5ldyBaKCJjb3JydXB0IGFycmF5IGJzb24iKTt0aHJvdyBuZXcgWigiY29ycnVwdCBvYmplY3QgYnNvbiIpfWlmKCF5KXJldHVybiB3O2lmKFVlKHcpKXtjb25zdCBlPU9iamVjdC5hc3NpZ24oe30sdyk7cmV0dXJuIGRlbGV0ZSBlLiRyZWYsZGVsZXRlIGUuJGlkLGRlbGV0ZSBlLiRkYixuZXcgT2Uody4kcmVmLHcuJGlkLHcuJGRiLGUpfXJldHVybiB3fWNvbnN0IGd0PS9ceDAwLyxodD1uZXcgU2V0KFsiJGRiIiwiJHJlZiIsIiRpZCIsIiRjbHVzdGVyVGltZSJdKTtmdW5jdGlvbiBidChlLHQsbixyKXtlW3IrK109TjtlWyhyPXIrX2UuZW5jb2RlVVRGOEludG8oZSx0LHIpKzEpLTFdPTA7Y29uc3QgaT1fZS5lbmNvZGVVVEY4SW50byhlLG4scis0KTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsaSsxKSxyPXIrNCtpLGVbcisrXT0wLHJ9ZnVuY3Rpb24gZHQoZSx0LG4scil7Y29uc3QgaT0hT2JqZWN0LmlzKG4sLTApJiZOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSYmbjw9bSYmbj49Uz9NOk87ZVtyKytdPWk7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1pPT09TT9wZS5zZXRJbnQzMkxFKGUscixuKTpwZS5zZXRGbG9hdDY0TEUoZSxyLG4pfWZ1bmN0aW9uIHd0KGUsdCxuLHIpe2VbcisrXT1QO3JldHVybiByKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9cGUuc2V0QmlnSW50NjRMRShlLHIsbil9ZnVuY3Rpb24gcHQoZSx0LG4scil7ZVtyKytdPWo7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIHl0KGUsdCxuLHIpe2VbcisrXT1BO3JldHVybiByKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAsZVtyKytdPW4/MTowLHJ9ZnVuY3Rpb24gbXQoZSx0LG4scil7ZVtyKytdPVI7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9amUuZnJvbU51bWJlcihuLmdldFRpbWUoKSksbz1pLmdldExvd0JpdHMoKSxzPWkuZ2V0SGlnaEJpdHMoKTtyZXR1cm4gcis9cGUuc2V0SW50MzJMRShlLHIsbykscis9cGUuc2V0SW50MzJMRShlLHIscyl9ZnVuY3Rpb24gU3QoZSx0LG4scil7ZVtyKytdPUY7aWYocis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLG4uc291cmNlJiZudWxsIT1uLnNvdXJjZS5tYXRjaChndCkpdGhyb3cgbmV3IFooInZhbHVlICIrbi5zb3VyY2UrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtyZXR1cm4gcis9X2UuZW5jb2RlVVRGOEludG8oZSxuLnNvdXJjZSxyKSxlW3IrK109MCxuLmlnbm9yZUNhc2UmJihlW3IrK109MTA1KSxuLmdsb2JhbCYmKGVbcisrXT0xMTUpLG4ubXVsdGlsaW5lJiYoZVtyKytdPTEwOSksZVtyKytdPTAscn1mdW5jdGlvbiBCdChlLHQsbixyKXtlW3IrK109RjtpZihyKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAsbnVsbCE9bi5wYXR0ZXJuLm1hdGNoKGd0KSl0aHJvdyBuZXcgWigicGF0dGVybiAiK24ucGF0dGVybisiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO3IrPV9lLmVuY29kZVVURjhJbnRvKGUsbi5wYXR0ZXJuLHIpLGVbcisrXT0wO2NvbnN0IGk9bi5vcHRpb25zLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsaSxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIHh0KGUsdCxuLHIpe251bGw9PT1uP2VbcisrXT1qOiJNaW5LZXkiPT09bi5fYnNvbnR5cGU/ZVtyKytdPVc6ZVtyKytdPVk7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIEV0KGUsdCxuLHIpe2VbcisrXT1MO3JldHVybiByKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9bi5zZXJpYWxpemVJbnRvKGUscil9ZnVuY3Rpb24gVXQoZSx0LG4scil7ZVtyKytdPVQ7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5sZW5ndGg7aWYocis9cGUuc2V0SW50MzJMRShlLHIsaSksZVtyKytdPXEsaTw9MTYpZm9yKGxldCB0PTA7dDxpO3QrKyllW3IrdF09blt0XTtlbHNlIGUuc2V0KG4scik7cmV0dXJuIHIrPWl9ZnVuY3Rpb24gT3QoZSx0LG4scixpLG8scyxhLGMpe2lmKGMuaGFzKG4pKXRocm93IG5ldyBaKCJDYW5ub3QgY29udmVydCBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gQlNPTiIpO2MuYWRkKG4pLGVbcisrXT1BcnJheS5pc0FycmF5KG4pP3Y6STtyKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTA7Y29uc3QgbD1GdChlLG4saSxyLG8rMSxzLGEsYyk7cmV0dXJuIGMuZGVsZXRlKG4pLGx9ZnVuY3Rpb24gTnQoZSx0LG4scil7ZVtyKytdPUo7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2ZvcihsZXQgdD0wO3Q8MTY7dCsrKWVbcit0XT1uLmJ5dGVzW3RdO3JldHVybiByKzE2fWZ1bmN0aW9uIEl0KGUsdCxuLHIpe2VbcisrXT0iTG9uZyI9PT1uLl9ic29udHlwZT9QOlY7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5nZXRMb3dCaXRzKCksbz1uLmdldEhpZ2hCaXRzKCk7cmV0dXJuIHIrPXBlLnNldEludDMyTEUoZSxyLGkpLHIrPXBlLnNldEludDMyTEUoZSxyLG8pfWZ1bmN0aW9uIHZ0KGUsdCxuLHIpe249bi52YWx1ZU9mKCksZVtyKytdPU07cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1wZS5zZXRJbnQzMkxFKGUscixuKX1mdW5jdGlvbiBUdChlLHQsbixyKXtlW3IrK109TztyZXR1cm4gcis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLHIrPXBlLnNldEZsb2F0NjRMRShlLHIsbi52YWx1ZSl9ZnVuY3Rpb24gJHQoZSx0LG4scil7ZVtyKytdPXo7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi50b1N0cmluZygpLG89X2UuZW5jb2RlVVRGOEludG8oZSxpLHIrNCkrMTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsbykscj1yKzQrby0xLGVbcisrXT0wLHJ9ZnVuY3Rpb24gTHQoZSx0LG4scixpPSExLG89MCxzPSExLGE9ITAsYyl7aWYobi5zY29wZSYmIm9iamVjdCI9PXR5cGVvZiBuLnNjb3BlKXtlW3IrK109QztyKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTA7bGV0IGw9cjtjb25zdCBmPW4uY29kZTtyKz00O2NvbnN0IHU9X2UuZW5jb2RlVVRGOEludG8oZSxmLHIrNCkrMTtwZS5zZXRJbnQzMkxFKGUscix1KSxlW3IrNCt1LTFdPTAscj1yK3UrNDtjb25zdCBfPUZ0KGUsbi5zY29wZSxpLHIsbysxLHMsYSxjKTtyPV8tMTtjb25zdCBnPV8tbDtsKz1wZS5zZXRJbnQzMkxFKGUsbCxnKSxlW3IrK109MH1lbHNle2VbcisrXT16O3IrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPW4uY29kZS50b1N0cmluZygpLG89X2UuZW5jb2RlVVRGOEludG8oZSxpLHIrNCkrMTtwZS5zZXRJbnQzMkxFKGUscixvKSxyPXIrNCtvLTEsZVtyKytdPTB9cmV0dXJuIHJ9ZnVuY3Rpb24gQXQoZSx0LG4scil7ZVtyKytdPVQ7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5idWZmZXI7bGV0IG89bi5wb3NpdGlvbjtpZihuLnN1Yl90eXBlPT09eWUuU1VCVFlQRV9CWVRFX0FSUkFZJiYobys9NCkscis9cGUuc2V0SW50MzJMRShlLHIsbyksZVtyKytdPW4uc3ViX3R5cGUsbi5zdWJfdHlwZT09PXllLlNVQlRZUEVfQllURV9BUlJBWSYmKG8tPTQscis9cGUuc2V0SW50MzJMRShlLHIsbykpLG4uc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1ZFQ1RPUiYmbWUobiksbzw9MTYpZm9yKGxldCB0PTA7dDxvO3QrKyllW3IrdF09aVt0XTtlbHNlIGUuc2V0KGkscik7cmV0dXJuIHIrPW4ucG9zaXRpb259ZnVuY3Rpb24gUnQoZSx0LG4scil7ZVtyKytdPUQ7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9X2UuZW5jb2RlVVRGOEludG8oZSxuLnZhbHVlLHIrNCkrMTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsaSkscj1yKzQraS0xLGVbcisrXT0wLHJ9ZnVuY3Rpb24ganQoZSx0LG4scixpLG8scyl7ZVtyKytdPUk7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2xldCBhPXIsYz17JHJlZjpuLmNvbGxlY3Rpb258fG4ubmFtZXNwYWNlLCRpZDpuLm9pZH07bnVsbCE9bi5kYiYmKGMuJGRiPW4uZGIpLGM9T2JqZWN0LmFzc2lnbihjLG4uZmllbGRzKTtjb25zdCBsPUZ0KGUsYywhMSxyLGkrMSxvLCEwLHMpLGY9bC1hO3JldHVybiBhKz1wZS5zZXRJbnQzMkxFKGUscixmKSxsfWZ1bmN0aW9uIEZ0KGUsdCxuLHIsaSxvLHMsYSl7aWYobnVsbD09YSl7aWYobnVsbD09dClyZXR1cm4gZVswXT01LGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNF09MCw1O2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFooInNlcmlhbGl6ZSBkb2VzIG5vdCBzdXBwb3J0IGFuIGFycmF5IGFzIHRoZSByb290IGlucHV0Iik7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBaKCJzZXJpYWxpemUgZG9lcyBub3Qgc3VwcG9ydCBub24tb2JqZWN0IGFzIHRoZSByb290IGlucHV0Iik7aWYoIl9ic29udHlwZSJpbiB0JiYic3RyaW5nIj09dHlwZW9mIHQuX2Jzb250eXBlKXRocm93IG5ldyBaKCJCU09OIHR5cGVzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGFzIGEgZG9jdW1lbnQiKTtpZihkKHQpfHxoKHQpfHxfKHQpfHxnKHQpKXRocm93IG5ldyBaKCJkYXRlLCByZWdleHAsIHR5cGVkYXJyYXksIGFuZCBhcnJheWJ1ZmZlciBjYW5ub3QgYmUgQlNPTiBkb2N1bWVudHMiKTthPW5ldyBTZXR9YS5hZGQodCk7bGV0IGM9cis0O2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IGw9YCR7cn1gO2xldCBmPXRbcl07ImZ1bmN0aW9uIj09dHlwZW9mIGY/LnRvQlNPTiYmKGY9Zi50b0JTT04oKSk7Y29uc3QgdT10eXBlb2YgZjtpZih2b2lkIDA9PT1mKWM9cHQoZSxsLDAsYyk7ZWxzZSBpZihudWxsPT09ZiljPXB0KGUsbCwwLGMpO2Vsc2UgaWYoInN0cmluZyI9PT11KWM9YnQoZSxsLGYsYyk7ZWxzZSBpZigibnVtYmVyIj09PXUpYz1kdChlLGwsZixjKTtlbHNlIGlmKCJiaWdpbnQiPT09dSljPXd0KGUsbCxmLGMpO2Vsc2UgaWYoImJvb2xlYW4iPT09dSljPXl0KGUsbCxmLGMpO2Vsc2UgaWYoIm9iamVjdCI9PT11JiZudWxsPT1mLl9ic29udHlwZSljPWYgaW5zdGFuY2VvZiBEYXRlfHxkKGYpP210KGUsbCxmLGMpOmYgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxfKGYpP1V0KGUsbCxmLGMpOmYgaW5zdGFuY2VvZiBSZWdFeHB8fGgoZik/U3QoZSxsLGYsYyk6T3QoZSxsLGYsYyxuLGksbyxzLGEpO2Vsc2UgaWYoIm9iamVjdCI9PT11KXtpZihmW3ldIT09cCl0aHJvdyBuZXcgRztpZigiT2JqZWN0SWQiPT09Zi5fYnNvbnR5cGUpYz1FdChlLGwsZixjKTtlbHNlIGlmKCJEZWNpbWFsMTI4Ij09PWYuX2Jzb250eXBlKWM9TnQoZSxsLGYsYyk7ZWxzZSBpZigiTG9uZyI9PT1mLl9ic29udHlwZXx8IlRpbWVzdGFtcCI9PT1mLl9ic29udHlwZSljPUl0KGUsbCxmLGMpO2Vsc2UgaWYoIkRvdWJsZSI9PT1mLl9ic29udHlwZSljPVR0KGUsbCxmLGMpO2Vsc2UgaWYoIkNvZGUiPT09Zi5fYnNvbnR5cGUpYz1MdChlLGwsZixjLG4saSxvLHMsYSk7ZWxzZSBpZigiQmluYXJ5Ij09PWYuX2Jzb250eXBlKWM9QXQoZSxsLGYsYyk7ZWxzZSBpZigiQlNPTlN5bWJvbCI9PT1mLl9ic29udHlwZSljPVJ0KGUsbCxmLGMpO2Vsc2UgaWYoIkRCUmVmIj09PWYuX2Jzb250eXBlKWM9anQoZSxsLGYsYyxpLG8sYSk7ZWxzZSBpZigiQlNPTlJlZ0V4cCI9PT1mLl9ic29udHlwZSljPUJ0KGUsbCxmLGMpO2Vsc2UgaWYoIkludDMyIj09PWYuX2Jzb250eXBlKWM9dnQoZSxsLGYsYyk7ZWxzZSBpZigiTWluS2V5Ij09PWYuX2Jzb250eXBlfHwiTWF4S2V5Ij09PWYuX2Jzb250eXBlKWM9eHQoZSxsLGYsYyk7ZWxzZSBpZih2b2lkIDAhPT1mLl9ic29udHlwZSl0aHJvdyBuZXcgWihgVW5yZWNvZ25pemVkIG9yIGludmFsaWQgX2Jzb250eXBlOiAke1N0cmluZyhmLl9ic29udHlwZSl9YCl9ZWxzZSJmdW5jdGlvbiI9PT11JiZvJiYoYz0kdChlLGwsZixjKSl9ZWxzZSBpZih0IGluc3RhbmNlb2YgTWFwfHxiKHQpKXtjb25zdCByPXQuZW50cmllcygpO2xldCBsPSExO2Zvcig7IWw7KXtjb25zdCB0PXIubmV4dCgpO2lmKGw9ISF0LmRvbmUsbCljb250aW51ZTtjb25zdCBmPXQudmFsdWU/dC52YWx1ZVswXTp2b2lkIDA7bGV0IHU9dC52YWx1ZT90LnZhbHVlWzFdOnZvaWQgMDsiZnVuY3Rpb24iPT10eXBlb2YgdT8udG9CU09OJiYodT11LnRvQlNPTigpKTtjb25zdCBnPXR5cGVvZiB1O2lmKCJzdHJpbmciPT10eXBlb2YgZiYmIWh0LmhhcyhmKSl7aWYobnVsbCE9Zi5tYXRjaChndCkpdGhyb3cgbmV3IFooImtleSAiK2YrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtpZihuKXtpZigiJCI9PT1mWzBdKXRocm93IG5ldyBaKCJrZXkgIitmKyIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJCciKTtpZihmLmluY2x1ZGVzKCIuIikpdGhyb3cgbmV3IFooImtleSAiK2YrIiBtdXN0IG5vdCBjb250YWluICcuJyIpfX1pZih2b2lkIDA9PT11KSExPT09cyYmKGM9cHQoZSxmLDAsYykpO2Vsc2UgaWYobnVsbD09PXUpYz1wdChlLGYsMCxjKTtlbHNlIGlmKCJzdHJpbmciPT09ZyljPWJ0KGUsZix1LGMpO2Vsc2UgaWYoIm51bWJlciI9PT1nKWM9ZHQoZSxmLHUsYyk7ZWxzZSBpZigiYmlnaW50Ij09PWcpYz13dChlLGYsdSxjKTtlbHNlIGlmKCJib29sZWFuIj09PWcpYz15dChlLGYsdSxjKTtlbHNlIGlmKCJvYmplY3QiPT09ZyYmbnVsbD09dS5fYnNvbnR5cGUpYz11IGluc3RhbmNlb2YgRGF0ZXx8ZCh1KT9tdChlLGYsdSxjKTp1IGluc3RhbmNlb2YgVWludDhBcnJheXx8Xyh1KT9VdChlLGYsdSxjKTp1IGluc3RhbmNlb2YgUmVnRXhwfHxoKHUpP1N0KGUsZix1LGMpOk90KGUsZix1LGMsbixpLG8scyxhKTtlbHNlIGlmKCJvYmplY3QiPT09Zyl7aWYodVt5XSE9PXApdGhyb3cgbmV3IEc7aWYoIk9iamVjdElkIj09PXUuX2Jzb250eXBlKWM9RXQoZSxmLHUsYyk7ZWxzZSBpZigiRGVjaW1hbDEyOCI9PT11Ll9ic29udHlwZSljPU50KGUsZix1LGMpO2Vsc2UgaWYoIkxvbmciPT09dS5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09dS5fYnNvbnR5cGUpYz1JdChlLGYsdSxjKTtlbHNlIGlmKCJEb3VibGUiPT09dS5fYnNvbnR5cGUpYz1UdChlLGYsdSxjKTtlbHNlIGlmKCJDb2RlIj09PXUuX2Jzb250eXBlKWM9THQoZSxmLHUsYyxuLGksbyxzLGEpO2Vsc2UgaWYoIkJpbmFyeSI9PT11Ll9ic29udHlwZSljPUF0KGUsZix1LGMpO2Vsc2UgaWYoIkJTT05TeW1ib2wiPT09dS5fYnNvbnR5cGUpYz1SdChlLGYsdSxjKTtlbHNlIGlmKCJEQlJlZiI9PT11Ll9ic29udHlwZSljPWp0KGUsZix1LGMsaSxvLGEpO2Vsc2UgaWYoIkJTT05SZWdFeHAiPT09dS5fYnNvbnR5cGUpYz1CdChlLGYsdSxjKTtlbHNlIGlmKCJJbnQzMiI9PT11Ll9ic29udHlwZSljPXZ0KGUsZix1LGMpO2Vsc2UgaWYoIk1pbktleSI9PT11Ll9ic29udHlwZXx8Ik1heEtleSI9PT11Ll9ic29udHlwZSljPXh0KGUsZix1LGMpO2Vsc2UgaWYodm9pZCAwIT09dS5fYnNvbnR5cGUpdGhyb3cgbmV3IFooYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcodS5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09ZyYmbyYmKGM9JHQoZSxmLHUsYykpfX1lbHNle2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Py50b0JTT04mJm51bGwhPSh0PXQudG9CU09OKCkpJiYib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFooInRvQlNPTiBmdW5jdGlvbiBkaWQgbm90IHJldHVybiBhbiBvYmplY3QiKTtmb3IoY29uc3QgciBvZiBPYmplY3Qua2V5cyh0KSl7bGV0IGw9dFtyXTsiZnVuY3Rpb24iPT10eXBlb2YgbD8udG9CU09OJiYobD1sLnRvQlNPTigpKTtjb25zdCBmPXR5cGVvZiBsO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIWh0LmhhcyhyKSl7aWYobnVsbCE9ci5tYXRjaChndCkpdGhyb3cgbmV3IFooImtleSAiK3IrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtpZihuKXtpZigiJCI9PT1yWzBdKXRocm93IG5ldyBaKCJrZXkgIityKyIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJCciKTtpZihyLmluY2x1ZGVzKCIuIikpdGhyb3cgbmV3IFooImtleSAiK3IrIiBtdXN0IG5vdCBjb250YWluICcuJyIpfX1pZih2b2lkIDA9PT1sKSExPT09cyYmKGM9cHQoZSxyLDAsYykpO2Vsc2UgaWYobnVsbD09PWwpYz1wdChlLHIsMCxjKTtlbHNlIGlmKCJzdHJpbmciPT09ZiljPWJ0KGUscixsLGMpO2Vsc2UgaWYoIm51bWJlciI9PT1mKWM9ZHQoZSxyLGwsYyk7ZWxzZSBpZigiYmlnaW50Ij09PWYpYz13dChlLHIsbCxjKTtlbHNlIGlmKCJib29sZWFuIj09PWYpYz15dChlLHIsbCxjKTtlbHNlIGlmKCJvYmplY3QiPT09ZiYmbnVsbD09bC5fYnNvbnR5cGUpYz1sIGluc3RhbmNlb2YgRGF0ZXx8ZChsKT9tdChlLHIsbCxjKTpsIGluc3RhbmNlb2YgVWludDhBcnJheXx8XyhsKT9VdChlLHIsbCxjKTpsIGluc3RhbmNlb2YgUmVnRXhwfHxoKGwpP1N0KGUscixsLGMpOk90KGUscixsLGMsbixpLG8scyxhKTtlbHNlIGlmKCJvYmplY3QiPT09Zil7aWYobFt5XSE9PXApdGhyb3cgbmV3IEc7aWYoIk9iamVjdElkIj09PWwuX2Jzb250eXBlKWM9RXQoZSxyLGwsYyk7ZWxzZSBpZigiRGVjaW1hbDEyOCI9PT1sLl9ic29udHlwZSljPU50KGUscixsLGMpO2Vsc2UgaWYoIkxvbmciPT09bC5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09bC5fYnNvbnR5cGUpYz1JdChlLHIsbCxjKTtlbHNlIGlmKCJEb3VibGUiPT09bC5fYnNvbnR5cGUpYz1UdChlLHIsbCxjKTtlbHNlIGlmKCJDb2RlIj09PWwuX2Jzb250eXBlKWM9THQoZSxyLGwsYyxuLGksbyxzLGEpO2Vsc2UgaWYoIkJpbmFyeSI9PT1sLl9ic29udHlwZSljPUF0KGUscixsLGMpO2Vsc2UgaWYoIkJTT05TeW1ib2wiPT09bC5fYnNvbnR5cGUpYz1SdChlLHIsbCxjKTtlbHNlIGlmKCJEQlJlZiI9PT1sLl9ic29udHlwZSljPWp0KGUscixsLGMsaSxvLGEpO2Vsc2UgaWYoIkJTT05SZWdFeHAiPT09bC5fYnNvbnR5cGUpYz1CdChlLHIsbCxjKTtlbHNlIGlmKCJJbnQzMiI9PT1sLl9ic29udHlwZSljPXZ0KGUscixsLGMpO2Vsc2UgaWYoIk1pbktleSI9PT1sLl9ic29udHlwZXx8Ik1heEtleSI9PT1sLl9ic29udHlwZSljPXh0KGUscixsLGMpO2Vsc2UgaWYodm9pZCAwIT09bC5fYnNvbnR5cGUpdGhyb3cgbmV3IFooYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcobC5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09ZiYmbyYmKGM9JHQoZSxyLGwsYykpfX1hLmRlbGV0ZSh0KSxlW2MrK109MDtjb25zdCBsPWMtcjtyZXR1cm4gcis9cGUuc2V0SW50MzJMRShlLHIsbCksY31jb25zdCBrdD17JG9pZDp0dCwkYmluYXJ5OnllLCR1dWlkOnllLCRzeW1ib2w6b3QsJG51bWJlckludDpaZSwkbnVtYmVyRGVjaW1hbDpIZSwkbnVtYmVyRG91YmxlOktlLCRudW1iZXJMb25nOmplLCRtaW5LZXk6WGUsJG1heEtleTpHZSwkcmVnZXg6aXQsJHJlZ3VsYXJFeHByZXNzaW9uOml0LCR0aW1lc3RhbXA6YXR9O2Z1bmN0aW9uIHp0KGUsdD17fSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtjb25zdCBuPWU8PW0mJmU+PVMscj1lPD1CJiZlPj14O2lmKHQucmVsYXhlZHx8dC5sZWdhY3kpcmV0dXJuIGU7aWYoTnVtYmVyLmlzSW50ZWdlcihlKSYmIU9iamVjdC5pcyhlLC0wKSl7aWYobilyZXR1cm4gbmV3IFplKGUpO2lmKHIpcmV0dXJuIHQudXNlQmlnSW50NjQ/QmlnSW50KGUpOmplLmZyb21OdW1iZXIoZSl9cmV0dXJuIG5ldyBLZShlKX1pZihudWxsPT1lfHwib2JqZWN0IiE9dHlwZW9mIGUpcmV0dXJuIGU7aWYoZS4kdW5kZWZpbmVkKXJldHVybiBudWxsO2NvbnN0IG49T2JqZWN0LmtleXMoZSkuZmlsdGVyKCh0PT50LnN0YXJ0c1dpdGgoIiQiKSYmbnVsbCE9ZVt0XSkpO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtjb25zdCBpPWt0W25bcl1dO2lmKGkpcmV0dXJuIGkuZnJvbUV4dGVuZGVkSlNPTihlLHQpfWlmKG51bGwhPWUuJGRhdGUpe2NvbnN0IG49ZS4kZGF0ZSxyPW5ldyBEYXRlO2lmKHQubGVnYWN5KWlmKCJudW1iZXIiPT10eXBlb2YgbilyLnNldFRpbWUobik7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIG4pci5zZXRUaW1lKERhdGUucGFyc2UobikpO2Vsc2V7aWYoImJpZ2ludCIhPXR5cGVvZiBuKXRocm93IG5ldyBYKCJVbnJlY29nbml6ZWQgdHlwZSBmb3IgRUpTT04gZGF0ZTogIit0eXBlb2Ygbik7ci5zZXRUaW1lKE51bWJlcihuKSl9ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIG4pci5zZXRUaW1lKERhdGUucGFyc2UobikpO2Vsc2UgaWYoamUuaXNMb25nKG4pKXIuc2V0VGltZShuLnRvTnVtYmVyKCkpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBuJiZ0LnJlbGF4ZWQpci5zZXRUaW1lKG4pO2Vsc2V7aWYoImJpZ2ludCIhPXR5cGVvZiBuKXRocm93IG5ldyBYKCJVbnJlY29nbml6ZWQgdHlwZSBmb3IgRUpTT04gZGF0ZTogIit0eXBlb2Ygbik7ci5zZXRUaW1lKE51bWJlcihuKSl9cmV0dXJuIHJ9aWYobnVsbCE9ZS4kY29kZSl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBlLiRzY29wZSYmKHQuJHNjb3BlPXp0KGUuJHNjb3BlKSksRWUuZnJvbUV4dGVuZGVkSlNPTihlKX1pZihVZShlKXx8ZS4kZGJQb2ludGVyKXtjb25zdCB0PWUuJHJlZj9lOmUuJGRiUG9pbnRlcjtpZih0IGluc3RhbmNlb2YgT2UpcmV0dXJuIHQ7Y29uc3Qgbj1PYmplY3Qua2V5cyh0KS5maWx0ZXIoKGU9PmUuc3RhcnRzV2l0aCgiJCIpKSk7bGV0IHI9ITA7aWYobi5mb3JFYWNoKChlPT57LTE9PT1bIiRyZWYiLCIkaWQiLCIkZGIiXS5pbmRleE9mKGUpJiYocj0hMSl9KSkscilyZXR1cm4gT2UuZnJvbUV4dGVuZGVkSlNPTih0KX1yZXR1cm4gZX1mdW5jdGlvbiBEdChlKXtjb25zdCB0PWUudG9JU09TdHJpbmcoKTtyZXR1cm4gMCE9PWUuZ2V0VVRDTWlsbGlzZWNvbmRzKCk/dDp0LnNsaWNlKDAsLTUpKyJaIn1mdW5jdGlvbiBDdChlLHQpe2lmKGUgaW5zdGFuY2VvZiBNYXB8fGIoZSkpe2NvbnN0IG49T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IoY29uc3RbdCxyXW9mIGUpe2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgWigiQ2FuIG9ubHkgc2VyaWFsaXplIG1hcHMgd2l0aCBzdHJpbmcga2V5cyIpO25bdF09cn1yZXR1cm4gQ3Qobix0KX1pZigoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJm51bGwhPT1lKXtjb25zdCBuPXQuc2Vlbk9iamVjdHMuZmluZEluZGV4KCh0PT50Lm9iaj09PWUpKTtpZigtMSE9PW4pe2NvbnN0IGU9dC5zZWVuT2JqZWN0cy5tYXAoKGU9PmUucHJvcGVydHlOYW1lKSkscj1lLnNsaWNlKDAsbikubWFwKChlPT5gJHtlfSAtPiBgKSkuam9pbigiIiksaT1lW25dLG89IiAtPiAiK2Uuc2xpY2UobisxLGUubGVuZ3RoLTEpLm1hcCgoZT0+YCR7ZX0gLT4gYCkpLmpvaW4oIiIpLHM9ZVtlLmxlbmd0aC0xXSxhPSIgIi5yZXBlYXQoci5sZW5ndGgraS5sZW5ndGgvMiksYz0iLSIucmVwZWF0KG8ubGVuZ3RoKyhpLmxlbmd0aCtzLmxlbmd0aCkvMi0xKTt0aHJvdyBuZXcgWihgQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gRUpTT046XG4gICAgJHtyfSR7aX0ke299JHtzfVxuICAgICR7YX1cXCR7Y30vYCl9dC5zZWVuT2JqZWN0c1t0LnNlZW5PYmplY3RzLmxlbmd0aC0xXS5vYmo9ZX1pZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiBlLm1hcCgoKGUsbik9Pnt0LnNlZW5PYmplY3RzLnB1c2goe3Byb3BlcnR5TmFtZTpgaW5kZXggJHtufWAsb2JqOm51bGx9KTt0cnl7cmV0dXJuIEN0KGUsdCl9ZmluYWxseXt0LnNlZW5PYmplY3RzLnBvcCgpfX0pKX0oZSx0KTtpZih2b2lkIDA9PT1lKXJldHVybiB0Lmlnbm9yZVVuZGVmaW5lZD92b2lkIDA6bnVsbDtpZihlIGluc3RhbmNlb2YgRGF0ZXx8ZChlKSl7Y29uc3Qgbj1lLmdldFRpbWUoKSxyPW4+LTEmJm48MjUzNDAyMzE4OGU1O3JldHVybiB0LmxlZ2FjeT90LnJlbGF4ZWQmJnI/eyRkYXRlOmUuZ2V0VGltZSgpfTp7JGRhdGU6RHQoZSl9OnQucmVsYXhlZCYmcj97JGRhdGU6RHQoZSl9OnskZGF0ZTp7JG51bWJlckxvbmc6ZS5nZXRUaW1lKCkudG9TdHJpbmcoKX19fWlmKCEoIm51bWJlciIhPXR5cGVvZiBlfHx0LnJlbGF4ZWQmJmlzRmluaXRlKGUpKSl7aWYoTnVtYmVyLmlzSW50ZWdlcihlKSYmIU9iamVjdC5pcyhlLC0wKSl7aWYoZT49UyYmZTw9bSlyZXR1cm57JG51bWJlckludDplLnRvU3RyaW5nKCl9O2lmKGU+PXgmJmU8PUIpcmV0dXJueyRudW1iZXJMb25nOmUudG9TdHJpbmcoKX19cmV0dXJueyRudW1iZXJEb3VibGU6T2JqZWN0LmlzKGUsLTApPyItMC4wIjplLnRvU3RyaW5nKCl9fWlmKCJiaWdpbnQiPT10eXBlb2YgZSlyZXR1cm4gdC5yZWxheGVkP051bWJlcihCaWdJbnQuYXNJbnROKDY0LGUpKTp7JG51bWJlckxvbmc6QmlnSW50LmFzSW50Tig2NCxlKS50b1N0cmluZygpfTtpZihlIGluc3RhbmNlb2YgUmVnRXhwfHxoKGUpKXtsZXQgbj1lLmZsYWdzO2lmKHZvaWQgMD09PW4pe2NvbnN0IHQ9ZS50b1N0cmluZygpLm1hdGNoKC9bZ2ltdXldKiQvKTt0JiYobj10WzBdKX1yZXR1cm4gbmV3IGl0KGUuc291cmNlLG4pLnRvRXh0ZW5kZWRKU09OKHQpfXJldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGU/ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lfHwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFooIm5vdCBhbiBvYmplY3QgaW5zdGFuY2UiKTtjb25zdCBuPWUuX2Jzb250eXBlO2lmKHZvaWQgMD09PW4pe2NvbnN0IG49e307Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXMoZSkpe3Quc2Vlbk9iamVjdHMucHVzaCh7cHJvcGVydHlOYW1lOnIsb2JqOm51bGx9KTt0cnl7Y29uc3QgaT1DdChlW3JdLHQpOyJfX3Byb3RvX18iPT09cj9PYmplY3QuZGVmaW5lUHJvcGVydHkobixyLHt2YWx1ZTppLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk6bltyXT1pfWZpbmFsbHl7dC5zZWVuT2JqZWN0cy5wb3AoKX19cmV0dXJuIG59aWYobnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYic3RyaW5nIj09dHlwZW9mIGUuX2Jzb250eXBlJiZlW3ldIT09cCl0aHJvdyBuZXcgRztpZihmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiX2Jzb250eXBlImluIGUmJiJzdHJpbmciPT10eXBlb2YgZS5fYnNvbnR5cGV9KGUpKXtsZXQgcj1lO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByLnRvRXh0ZW5kZWRKU09OKXtjb25zdCB0PU10W2UuX2Jzb250eXBlXTtpZighdCl0aHJvdyBuZXcgWigiVW5yZWNvZ25pemVkIG9yIGludmFsaWQgX2Jzb250eXBlOiAiK2UuX2Jzb250eXBlKTtyPXQocil9cmV0dXJuIkNvZGUiPT09biYmci5zY29wZT9yPW5ldyBFZShyLmNvZGUsQ3Qoci5zY29wZSx0KSk6IkRCUmVmIj09PW4mJnIub2lkJiYocj1uZXcgT2UoQ3Qoci5jb2xsZWN0aW9uLHQpLEN0KHIub2lkLHQpLEN0KHIuZGIsdCksQ3Qoci5maWVsZHMsdCkpKSxyLnRvRXh0ZW5kZWRKU09OKHQpfXRocm93IG5ldyBaKCJfYnNvbnR5cGUgbXVzdCBiZSBhIHN0cmluZywgYnV0IHdhczogIit0eXBlb2Ygbil9KGUsdCk6ZX1jb25zdCBNdD17QmluYXJ5OmU9Pm5ldyB5ZShlLnZhbHVlKCksZS5zdWJfdHlwZSksQ29kZTplPT5uZXcgRWUoZS5jb2RlLGUuc2NvcGUpLERCUmVmOmU9Pm5ldyBPZShlLmNvbGxlY3Rpb258fGUubmFtZXNwYWNlLGUub2lkLGUuZGIsZS5maWVsZHMpLERlY2ltYWwxMjg6ZT0+bmV3IEhlKGUuYnl0ZXMpLERvdWJsZTplPT5uZXcgS2UoZS52YWx1ZSksSW50MzI6ZT0+bmV3IFplKGUudmFsdWUpLExvbmc6ZT0+amUuZnJvbUJpdHMobnVsbCE9ZS5sb3c/ZS5sb3c6ZS5sb3dfLG51bGwhPWUubG93P2UuaGlnaDplLmhpZ2hfLG51bGwhPWUubG93P2UudW5zaWduZWQ6ZS51bnNpZ25lZF8pLE1heEtleTooKT0+bmV3IEdlLE1pbktleTooKT0+bmV3IFhlLE9iamVjdElkOmU9Pm5ldyB0dChlKSxCU09OUmVnRXhwOmU9Pm5ldyBpdChlLnBhdHRlcm4sZS5vcHRpb25zKSxCU09OU3ltYm9sOmU9Pm5ldyBvdChlLnZhbHVlKSxUaW1lc3RhbXA6ZT0+YXQuZnJvbUJpdHMoZS5sb3csZS5oaWdoKX07ZnVuY3Rpb24gVnQoZSx0KXtjb25zdCBuPXt1c2VCaWdJbnQ2NDp0Py51c2VCaWdJbnQ2ND8/ITEscmVsYXhlZDp0Py5yZWxheGVkPz8hMCxsZWdhY3k6dD8ubGVnYWN5Pz8hMX07cmV0dXJuIEpTT04ucGFyc2UoZSwoKGUsdCk9PntpZigtMSE9PWUuaW5kZXhPZigiXDAiKSl0aHJvdyBuZXcgWihgQlNPTiBEb2N1bWVudCBmaWVsZCBuYW1lcyBjYW5ub3QgY29udGFpbiBudWxsIGJ5dGVzLCBmb3VuZDogJHtKU09OLnN0cmluZ2lmeShlKX1gKTtyZXR1cm4genQodCxuKX0pKX1mdW5jdGlvbiBQdChlLHQsbixyKXtudWxsIT1uJiYib2JqZWN0Ij09dHlwZW9mIG4mJihyPW4sbj0wKSxudWxsPT10fHwib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCl8fChyPXQsdD12b2lkIDAsbj0wKTtjb25zdCBpPUN0KGUsT2JqZWN0LmFzc2lnbih7cmVsYXhlZDohMCxsZWdhY3k6ITF9LHIse3NlZW5PYmplY3RzOlt7cHJvcGVydHlOYW1lOiIocm9vdCkiLG9iajpudWxsfV19KSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGksdCxuKX1jb25zdCBKdD1PYmplY3QuY3JlYXRlKG51bGwpO0p0LnBhcnNlPVZ0LEp0LnN0cmluZ2lmeT1QdCxKdC5zZXJpYWxpemU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD10fHx7fSxKU09OLnBhcnNlKFB0KGUsdCkpfSxKdC5kZXNlcmlhbGl6ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fHt9LFZ0KEpTT04uc3RyaW5naWZ5KGUpLHQpfSxPYmplY3QuZnJlZXplKEp0KTtjb25zdCBXdD0xLFl0PTIscXQ9MyxIdD00LEt0PTUsWnQ9NixHdD03LFh0PTgsUXQ9OSxlbj0xMCx0bj0xMSxubj0xMixybj0xMyxvbj0xNCxzbj0xNSxhbj0xNixjbj0xNyxsbj0xOCxmbj0xOSx1bj0yNTUsX249MTI3O2Z1bmN0aW9uIGduKGUsdCl7dHJ5e3JldHVybiBwZS5nZXROb25uZWdhdGl2ZUludDMyTEUoZSx0KX1jYXRjaChlKXt0aHJvdyBuZXcgUSgiQlNPTiBzaXplIGNhbm5vdCBiZSBuZWdhdGl2ZSIsdCx7Y2F1c2U6ZX0pfX1mdW5jdGlvbiBobihlLHQpe2xldCBuPXQ7Zm9yKDswIT09ZVtuXTtuKyspO2lmKG49PT1lLmxlbmd0aC0xKXRocm93IG5ldyBRKCJOdWxsIHRlcm1pbmF0b3Igbm90IGZvdW5kIix0KTtyZXR1cm4gbn1jb25zdCBibj1PYmplY3QuY3JlYXRlKG51bGwpO2JuLnBhcnNlVG9FbGVtZW50cz1mdW5jdGlvbihlLHQ9MCl7aWYodD8/PTAsZS5sZW5ndGg8NSl0aHJvdyBuZXcgUShgSW5wdXQgbXVzdCBiZSBhdCBsZWFzdCA1IGJ5dGVzLCBnb3QgJHtlLmxlbmd0aH0gYnl0ZXNgLHQpO2NvbnN0IG49Z24oZSx0KTtpZihuPmUubGVuZ3RoLXQpdGhyb3cgbmV3IFEoYFBhcnNlZCBkb2N1bWVudFNpemUgKCR7bn0gYnl0ZXMpIGRvZXMgbm90IG1hdGNoIGlucHV0IGxlbmd0aCAoJHtlLmxlbmd0aH0gYnl0ZXMpYCx0KTtpZigwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFEoIkJTT04gZG9jdW1lbnRzIG11c3QgZW5kIGluIDB4MDAiLHQrbik7Y29uc3Qgcj1bXTtsZXQgaT10KzQ7Zm9yKDtpPD1uK3Q7KXtjb25zdCBvPWVbaV07aWYoaSs9MSwwPT09byl7aWYoaS10IT09bil0aHJvdyBuZXcgUSgiSW52YWxpZCAweDAwIHR5cGUgYnl0ZSIsaSk7YnJlYWt9Y29uc3Qgcz1pLGE9aG4oZSxpKS1zO2xldCBjO2lmKGkrPWErMSxvPT09V3R8fG89PT1sbnx8bz09PVF0fHxvPT09Y24pYz04O2Vsc2UgaWYobz09PWFuKWM9NDtlbHNlIGlmKG89PT1HdCljPTEyO2Vsc2UgaWYobz09PWZuKWM9MTY7ZWxzZSBpZihvPT09WHQpYz0xO2Vsc2UgaWYobz09PWVufHxvPT09WnR8fG89PT1fbnx8bz09PXVuKWM9MDtlbHNlIGlmKG89PT10biljPWhuKGUsaG4oZSxpKSsxKSsxLWk7ZWxzZSBpZihvPT09cXR8fG89PT1IdHx8bz09PXNuKWM9Z24oZSxpKTtlbHNle2lmKG8hPT1ZdCYmbyE9PUt0JiZvIT09bm4mJm8hPT1ybiYmbyE9PW9uKXRocm93IG5ldyBRKGBJbnZhbGlkIDB4JHtvLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIil9IHR5cGUgYnl0ZWAsaSk7Yz1nbihlLGkpKzQsbz09PUt0JiYoYys9MSksbz09PW5uJiYoYys9MTIpfWlmKGM+bil0aHJvdyBuZXcgUSgidmFsdWUgcmVwb3J0cyBsZW5ndGggbGFyZ2VyIHRoYW4gZG9jdW1lbnQiLGkpO3IucHVzaChbbyxzLGEsaSxjXSksaSs9Y31yZXR1cm4gcn0sYm4uQnl0ZVV0aWxzPV9lLGJuLk51bWJlclV0aWxzPXBlLE9iamVjdC5mcmVlemUoYm4pO2NvbnN0IGRuPTE3ODI1NzkyO2xldCB3bj1fZS5hbGxvY2F0ZShkbik7dmFyIHBuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJTT05FcnJvcjpaLEJTT05PZmZzZXRFcnJvcjpRLEJTT05SZWdFeHA6aXQsQlNPTlJ1bnRpbWVFcnJvcjpYLEJTT05TeW1ib2w6b3QsQlNPTlR5cGU6SyxCU09OVmFsdWU6aGUsQlNPTlZlcnNpb25FcnJvcjpHLEJpbmFyeTp5ZSxCeXRlVXRpbHM6X2UsQ29kZTpFZSxEQlJlZjpPZSxEZWNpbWFsMTI4OkhlLERvdWJsZTpLZSxFSlNPTjpKdCxJbnQzMjpaZSxMb25nOmplLE1heEtleTpHZSxNaW5LZXk6WGUsTnVtYmVyVXRpbHM6cGUsT2JqZWN0SWQ6dHQsVGltZXN0YW1wOmF0LFVVSUQ6eGUsYnNvblR5cGU6Z2UsY2FsY3VsYXRlT2JqZWN0U2l6ZTpmdW5jdGlvbihlLHQ9e30pe3JldHVybiBudChlLCJib29sZWFuIj09dHlwZW9mKHQ9dHx8e30pLnNlcmlhbGl6ZUZ1bmN0aW9ucyYmdC5zZXJpYWxpemVGdW5jdGlvbnMsImJvb2xlYW4iIT10eXBlb2YgdC5pZ25vcmVVbmRlZmluZWR8fHQuaWdub3JlVW5kZWZpbmVkKX0sZGVzZXJpYWxpemU6ZnVuY3Rpb24oZSx0PXt9KXtyZXR1cm4gZnQoX2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSksdCl9LGRlc2VyaWFsaXplU3RyZWFtOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXtjb25zdCBzPU9iamVjdC5hc3NpZ24oe2FsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplOiEwLGluZGV4OjB9LG8pLGE9X2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSk7bGV0IGM9dDtmb3IobGV0IGU9MDtlPG47ZSsrKXtjb25zdCB0PXBlLmdldEludDMyTEUoYSxjKTtzLmluZGV4PWMscltpK2VdPWZ0KGEscyksYys9dH1yZXR1cm4gY30sb25EZW1hbmQ6Ym4sc2VyaWFsaXplOmZ1bmN0aW9uKGUsdD17fSl7Y29uc3Qgbj0iYm9vbGVhbiI9PXR5cGVvZiB0LmNoZWNrS2V5cyYmdC5jaGVja0tleXMscj0iYm9vbGVhbiI9PXR5cGVvZiB0LnNlcmlhbGl6ZUZ1bmN0aW9ucyYmdC5zZXJpYWxpemVGdW5jdGlvbnMsaT0iYm9vbGVhbiIhPXR5cGVvZiB0Lmlnbm9yZVVuZGVmaW5lZHx8dC5pZ25vcmVVbmRlZmluZWQsbz0ibnVtYmVyIj09dHlwZW9mIHQubWluSW50ZXJuYWxCdWZmZXJTaXplP3QubWluSW50ZXJuYWxCdWZmZXJTaXplOmRuO3duLmxlbmd0aDxvJiYod249X2UuYWxsb2NhdGUobykpO2NvbnN0IHM9RnQod24sZSxuLDAsMCxyLGksbnVsbCksYT1fZS5hbGxvY2F0ZVVuc2FmZShzKTtyZXR1cm4gYS5zZXQod24uc3ViYXJyYXkoMCxzKSwwKSxhfSxzZXJpYWxpemVXaXRoQnVmZmVyQW5kSW5kZXg6ZnVuY3Rpb24oZSx0LG49e30pe2NvbnN0IHI9ImJvb2xlYW4iPT10eXBlb2Ygbi5jaGVja0tleXMmJm4uY2hlY2tLZXlzLGk9ImJvb2xlYW4iPT10eXBlb2Ygbi5zZXJpYWxpemVGdW5jdGlvbnMmJm4uc2VyaWFsaXplRnVuY3Rpb25zLG89ImJvb2xlYW4iIT10eXBlb2Ygbi5pZ25vcmVVbmRlZmluZWR8fG4uaWdub3JlVW5kZWZpbmVkLHM9Im51bWJlciI9PXR5cGVvZiBuLmluZGV4P24uaW5kZXg6MCxhPUZ0KHduLGUsciwwLDAsaSxvLG51bGwpO3JldHVybiB0LnNldCh3bi5zdWJhcnJheSgwLGEpLHMpLHMrYS0xfSxzZXRJbnRlcm5hbEJ1ZmZlclNpemU6ZnVuY3Rpb24oZSl7d24ubGVuZ3RoPGUmJih3bj1fZS5hbGxvY2F0ZShlKSl9fSk7Y2xhc3MgeW57Y29uc3RydWN0b3IoKXt9c3RhdGljIHVybENvbnN0cnVjdEZyb20oZSl7Y29uc3QgdD0iL3dzL21vZGVsaW5nL2NvbW1hbmRzIitmdW5jdGlvbihlKXtjb25zdCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyhlKSlpZih2b2lkIDAhPT1yKWlmKEFycmF5LmlzQXJyYXkocikpZm9yKGNvbnN0IGUgb2Ygcil0LmFwcGVuZChuLFN0cmluZyhlKSk7ZWxzZSB0LmFwcGVuZChuLFN0cmluZyhyKSk7Y29uc3Qgbj10LnRvU3RyaW5nKCk7cmV0dXJuIG4/YD8ke259YDoiIn0oe3ZpZGVvX3Jlc193aWR0aDplLnZpZGVvX3Jlc193aWR0aCx2aWRlb19yZXNfaGVpZ2h0OmUudmlkZW9fcmVzX2hlaWdodCxmcHM6ZS5mcHMsdW5sb2NrZWRfZnJhbWVyYXRlOmUudW5sb2NrZWRfZnJhbWVyYXRlLHBvc3RfZWZmZWN0OmUucG9zdF9lZmZlY3Qsd2VicnRjOmUud2VicnRjLHBvb2w6ZS5wb29sLHNob3dfZ3JpZDplLnNob3dfZ3JpZCxyZXBsYXk6ZS5yZXBsYXksYXBpX2NhbGxfaWQ6ZS5hcGlfY2FsbF9pZCxvcmRlcl9pbmRlcGVuZGVudF90cmFuc3BhcmVuY3k6ZS5vcmRlcl9pbmRlcGVuZGVudF90cmFuc3BhcmVuY3kscHI6ZS5wcn0pLG49KChlLmNsaWVudD8uYmFzZVVybHx8Imh0dHBzOi8vYXBpLnpvby5kZXYiKSt0KS5yZXBsYWNlKC9eaHR0cC8sIndzIik7cmV0dXJuIG5ldyBVUkwobil9c3RhdGljIGF1dGhlbnRpY2F0ZShlLHQpe2NvbnN0IG49ZS5jbGllbnQmJmUuY2xpZW50LnRva2VufHwiIjtpZihuKXRyeXtjb25zdCBlPXt0eXBlOiJoZWFkZXJzIixoZWFkZXJzOntBdXRob3JpemF0aW9uOmBCZWFyZXIgJHtufWB9fTt0LnNlbmQoSlNPTi5zdHJpbmdpZnkoZSkpfWNhdGNoe319c3RhdGljIHRvQlNPTihlKXtyZXR1cm4gcG4uc2VyaWFsaXplKGUpfXN0YXRpYyBwYXJzZU1lc3NhZ2UoZSl7Y29uc3QgdD1lPy5kYXRhO2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gSlNPTi5wYXJzZSh0KTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEJ1ZmZlciYmQnVmZmVyLmlzQnVmZmVyPy4odCkpe2NvbnN0IGU9dDt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZS50b1N0cmluZygidXRmOCIpKX1jYXRjaHt9cmV0dXJuIHBuLmRlc2VyaWFsaXplKGUpfWlmKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0KTt0cnl7Y29uc3QgdD0obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2h7fXJldHVybiBwbi5kZXNlcmlhbGl6ZShlKX1pZigobj10KSYmIm9iamVjdCI9PXR5cGVvZiBuJiYiYnVmZmVyImluIG4mJm4uYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJiJudW1iZXIiPT10eXBlb2Ygbi5ieXRlT2Zmc2V0JiYibnVtYmVyIj09dHlwZW9mIG4uYnl0ZUxlbmd0aCl7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKTt0cnl7Y29uc3QgdD0obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2h7fXJldHVybiBwbi5kZXNlcmlhbGl6ZShlKX12YXIgbjtyZXR1cm4gdH19Y2xhc3MgbW57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxSbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ19jb250ZXh0X2ZyZWUoZSwwKX1hZGRfY29uc3RyYWludChlLHQsbixyLGkpe2NvbnN0IG89b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixsPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxmPV9yLHU9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89X3I7cmV0dXJuIHVyLmNvbnRleHRfYWRkX2NvbnN0cmFpbnQodGhpcy5fX3diZ19wdHIsbyxzLGEsYyxsLGYsdSxfLGkpfWFkZF9maWxlKGUsdCl7Y29uc3Qgbj1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYykscj1fcjtyZXR1cm4gdXIuY29udGV4dF9hZGRfZmlsZSh0aGlzLl9fd2JnX3B0cixlLG4scil9YWRkX3NlZ21lbnQoZSx0LG4scixpLG8pe2NvbnN0IHM9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9X3IsYz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD1fcixmPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSx1PV9yO3ZhciBfPW5yKHIpPzA6b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGc9X3I7Y29uc3QgaD1vcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYj1fcjtyZXR1cm4gdXIuY29udGV4dF9hZGRfc2VnbWVudCh0aGlzLl9fd2JnX3B0cixzLGEsYyxsLGYsdSxfLGcsaCxiLG8pfWJ1c3RDYWNoZUFuZFJlc2V0U2NlbmUoZSx0KXtjb25zdCBuPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yO3ZhciBpPW5yKHQpPzA6b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3I7cmV0dXJuIHVyLmNvbnRleHRfYnVzdENhY2hlQW5kUmVzZXRTY2VuZSh0aGlzLl9fd2JnX3B0cixuLHIsaSxvKX1jaGFpbl9zZWdtZW50KGUsdCxuLHIsaSxvLHMpe2NvbnN0IGE9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3IsbD1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZj1fcix1PW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxfPV9yLGc9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGg9X3I7dmFyIGI9bnIoaSk/MDpvcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZD1fcjtjb25zdCB3PW9yKG8sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxwPV9yO3JldHVybiB1ci5jb250ZXh0X2NoYWluX3NlZ21lbnQodGhpcy5fX3diZ19wdHIsYSxjLGwsZix1LF8sZyxoLGIsZCx3LHAscyl9Y2xlYXJfc2tldGNoX2NoZWNrcG9pbnRzKCl7cmV0dXJuIHVyLmNvbnRleHRfY2xlYXJfc2tldGNoX2NoZWNrcG9pbnRzKHRoaXMuX193YmdfcHRyKX1kZWxldGVfb2JqZWN0cyhlLHQsbixyLGksbyl7Y29uc3Qgcz1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxsPV9yLGY9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHU9X3IsXz1vcihyLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZz1fcixoPW9yKGksdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxiPV9yO3JldHVybiB1ci5jb250ZXh0X2RlbGV0ZV9vYmplY3RzKHRoaXMuX193YmdfcHRyLHMsYSxjLGwsZix1LF8sZyxoLGIsbyl9ZGVsZXRlX3NrZXRjaChlLHQsbil7Y29uc3Qgcj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcixvPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yLGE9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3I7cmV0dXJuIHVyLmNvbnRleHRfZGVsZXRlX3NrZXRjaCh0aGlzLl9fd2JnX3B0cixyLGksbyxzLGEsYyl9ZWRpdF9jb25zdHJhaW50KGUsdCxuLHIsaSxvKXtjb25zdCBzPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGw9X3IsZj1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT1fcixfPW9yKHIsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxnPV9yLGg9b3IoaSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGI9X3I7cmV0dXJuIHVyLmNvbnRleHRfZWRpdF9jb25zdHJhaW50KHRoaXMuX193YmdfcHRyLHMsYSxjLGwsZix1LF8sZyxoLGIsbyl9ZWRpdF9kaXN0YW5jZV9jb25zdHJhaW50X2xhYmVsX3Bvc2l0aW9uKGUsdCxuLHIsaSxvLHMpe2NvbnN0IGE9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3IsbD1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZj1fcix1PW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxfPV9yLGc9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGg9X3IsYj1vcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZD1fcix3PW9yKHMsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxwPV9yO3JldHVybiB1ci5jb250ZXh0X2VkaXRfZGlzdGFuY2VfY29uc3RyYWludF9sYWJlbF9wb3NpdGlvbih0aGlzLl9fd2JnX3B0cixhLGMsbCxmLHUsXyxnLGgsYixkLG8sdyxwKX1lZGl0X3NlZ21lbnRzKGUsdCxuLHIsaSl7Y29uc3Qgbz1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYykscz1fcixhPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxjPV9yLGw9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGY9X3IsdT1vcihyLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksXz1fcjtyZXR1cm4gdXIuY29udGV4dF9lZGl0X3NlZ21lbnRzKHRoaXMuX193YmdfcHRyLG8scyxhLGMsbCxmLHUsXyxpKX1lZGl0X3NrZXRjaChlLHQsbixyLGkpe2NvbnN0IG89b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixsPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxmPV9yLHU9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89X3IsZz1vcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaD1fcjtyZXR1cm4gdXIuY29udGV4dF9lZGl0X3NrZXRjaCh0aGlzLl9fd2JnX3B0cixvLHMsYSxjLGwsZix1LF8sZyxoKX1leGVjdXRlKGUsdCxuKXtjb25zdCByPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxpPV9yO3ZhciBvPW5yKHQpPzA6b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3I7Y29uc3QgYT1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcjtyZXR1cm4gdXIuY29udGV4dF9leGVjdXRlKHRoaXMuX193YmdfcHRyLHIsaSxvLHMsYSxjKX1leGVjdXRlTW9jayhlLHQsbixyKXtjb25zdCBpPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxvPV9yO3ZhciBzPW5yKHQpPzA6b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9X3I7Y29uc3QgYz1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD1fcjtyZXR1cm4gdXIuY29udGV4dF9leGVjdXRlTW9jayh0aGlzLl9fd2JnX3B0cixpLG8scyxhLGMsbCxyKX1leGVjdXRlX3RyaW0oZSx0LG4scil7Y29uc3QgaT1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcixzPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9aXIobix1ci5fX3diaW5kZ2VuX21hbGxvYyksbD1fcixmPW9yKHIsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSx1PV9yO3JldHVybiB1ci5jb250ZXh0X2V4ZWN1dGVfdHJpbSh0aGlzLl9fd2JnX3B0cixpLG8scyxhLGMsbCxmLHUpfWV4aXRfc2tldGNoKGUsdCxuKXtjb25zdCByPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxpPV9yLG89b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcjtyZXR1cm4gdXIuY29udGV4dF9leGl0X3NrZXRjaCh0aGlzLl9fd2JnX3B0cixyLGksbyxzLGEsYyl9ZXhwb3J0KGUsdCl7Y29uc3Qgbj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYykscj1fcixpPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxvPV9yO3JldHVybiB1ci5jb250ZXh0X2V4cG9ydCh0aGlzLl9fd2JnX3B0cixuLHIsaSxvKX1nZXRfZmlsZShlLHQpe3JldHVybiB1ci5jb250ZXh0X2dldF9maWxlKHRoaXMuX193YmdfcHRyLGUsdCl9Z2V0X3Byb2plY3QoZSl7cmV0dXJuIHVyLmNvbnRleHRfZ2V0X3Byb2plY3QodGhpcy5fX3diZ19wdHIsZSl9aGFja19zZXRfcHJvZ3JhbShlLHQpe2NvbnN0IG49b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3IsaT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcjtyZXR1cm4gdXIuY29udGV4dF9oYWNrX3NldF9wcm9ncmFtKHRoaXMuX193YmdfcHRyLG4scixpLG8pfWNvbnN0cnVjdG9yKGUsdCl7Y29uc3Qgbj11ci5jb250ZXh0X25ldyhlLHQpO2lmKG5bMl0pdGhyb3cgc3IoblsxXSk7cmV0dXJuIHRoaXMuX193YmdfcHRyPW5bMF0+Pj4wLFJuLnJlZ2lzdGVyKHRoaXMsdGhpcy5fX3diZ19wdHIsdGhpcyksdGhpc31uZXdfc2tldGNoKGUsdCxuLHIsaSl7Y29uc3Qgbz1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYykscz1fcixhPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxjPV9yLGw9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGY9X3IsdT1vcihyLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksXz1fcixnPW9yKGksdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxoPV9yO3JldHVybiB1ci5jb250ZXh0X25ld19za2V0Y2godGhpcy5fX3diZ19wdHIsbyxzLGEsYyxsLGYsdSxfLGcsaCl9b3Blbl9wcm9qZWN0KGUsdCxuKXtjb25zdCByPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxpPV9yO3JldHVybiB1ci5jb250ZXh0X29wZW5fcHJvamVjdCh0aGlzLl9fd2JnX3B0cixlLHIsaSxuKX1yZWZyZXNoKGUpe3JldHVybiB1ci5jb250ZXh0X3JlZnJlc2godGhpcy5fX3diZ19wdHIsZSl9cmVtb3ZlX2ZpbGUoZSx0KXtyZXR1cm4gdXIuY29udGV4dF9yZW1vdmVfZmlsZSh0aGlzLl9fd2JnX3B0cixlLHQpfXJlc3RvcmVfc2tldGNoX2NoZWNrcG9pbnQoZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcjtyZXR1cm4gdXIuY29udGV4dF9yZXN0b3JlX3NrZXRjaF9jaGVja3BvaW50KHRoaXMuX193YmdfcHRyLHQsbil9c2VuZFJlc3BvbnNlKGUpe3JldHVybiB1ci5jb250ZXh0X3NlbmRSZXNwb25zZSh0aGlzLl9fd2JnX3B0cixlKX1za2V0Y2hfZXhlY3V0ZV9tb2NrKGUsdCxuKXtjb25zdCByPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxpPV9yLG89b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcjtyZXR1cm4gdXIuY29udGV4dF9za2V0Y2hfZXhlY3V0ZV9tb2NrKHRoaXMuX193YmdfcHRyLHIsaSxvLHMsYSxjKX1zd2l0Y2hfZmlsZShlLHQpe3JldHVybiB1ci5jb250ZXh0X3N3aXRjaF9maWxlKHRoaXMuX193YmdfcHRyLGUsdCl9dHJhbnNwaWxlX29sZF9za2V0Y2goZSx0LG4scil7Y29uc3QgaT1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcixzPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yO3ZhciBjPW5yKG4pPzA6b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGw9X3I7Y29uc3QgZj1vcihyLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT1fcjtyZXR1cm4gdXIuY29udGV4dF90cmFuc3BpbGVfb2xkX3NrZXRjaCh0aGlzLl9fd2JnX3B0cixpLG8scyxhLGMsbCxmLHUpfXVwZGF0ZV9maWxlKGUsdCxuKXtjb25zdCByPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxpPV9yO3JldHVybiB1ci5jb250ZXh0X3VwZGF0ZV9maWxlKHRoaXMuX193YmdfcHRyLGUsdCxyLGkpfX1TeW1ib2wuZGlzcG9zZSYmKG1uLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09bW4ucHJvdG90eXBlLmZyZWUpO2NsYXNzIFNue19fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IGU9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsam4udW5yZWdpc3Rlcih0aGlzKSxlfWZyZWUoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7dXIuX193YmdfaW50b3VuZGVybHlpbmdieXRlc291cmNlX2ZyZWUoZSwwKX1nZXQgYXV0b0FsbG9jYXRlQ2h1bmtTaXplKCl7cmV0dXJuIHVyLmludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV9hdXRvQWxsb2NhdGVDaHVua1NpemUodGhpcy5fX3diZ19wdHIpPj4+MH1jYW5jZWwoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7dXIuaW50b3VuZGVybHlpbmdieXRlc291cmNlX2NhbmNlbChlKX1wdWxsKGUpe3JldHVybiB1ci5pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2VfcHVsbCh0aGlzLl9fd2JnX3B0cixlKX1zdGFydChlKXt1ci5pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2Vfc3RhcnQodGhpcy5fX3diZ19wdHIsZSl9Z2V0IHR5cGUoKXtjb25zdCBlPXVyLmludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV90eXBlKHRoaXMuX193YmdfcHRyKTtyZXR1cm4gQW5bZV19fVN5bWJvbC5kaXNwb3NlJiYoU24ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1Tbi5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgQm57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxGbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ19pbnRvdW5kZXJseWluZ3NpbmtfZnJlZShlLDApfWFib3J0KGUpe2NvbnN0IHQ9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTtyZXR1cm4gdXIuaW50b3VuZGVybHlpbmdzaW5rX2Fib3J0KHQsZSl9Y2xvc2UoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7cmV0dXJuIHVyLmludG91bmRlcmx5aW5nc2lua19jbG9zZShlKX13cml0ZShlKXtyZXR1cm4gdXIuaW50b3VuZGVybHlpbmdzaW5rX3dyaXRlKHRoaXMuX193YmdfcHRyLGUpfX1TeW1ib2wuZGlzcG9zZSYmKEJuLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09Qm4ucHJvdG90eXBlLmZyZWUpO2NsYXNzIHhue19fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IGU9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsa24udW5yZWdpc3Rlcih0aGlzKSxlfWZyZWUoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7dXIuX193YmdfaW50b3VuZGVybHlpbmdzb3VyY2VfZnJlZShlLDApfWNhbmNlbCgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5pbnRvdW5kZXJseWluZ3NvdXJjZV9jYW5jZWwoZSl9cHVsbChlKXtyZXR1cm4gdXIuaW50b3VuZGVybHlpbmdzb3VyY2VfcHVsbCh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJih4bi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPXhuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBFbntfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLHpuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLl9fd2JnX2xzcHNlcnZlcmNvbmZpZ19mcmVlKGUsMCl9Y29uc3RydWN0b3IoZSx0LG4pe2NvbnN0IHI9dXIubHNwc2VydmVyY29uZmlnX25ldyhlLHQsbik7cmV0dXJuIHRoaXMuX193YmdfcHRyPXI+Pj4wLHpuLnJlZ2lzdGVyKHRoaXMsdGhpcy5fX3diZ19wdHIsdGhpcyksdGhpc319U3ltYm9sLmRpc3Bvc2UmJihFbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUVuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBVbntfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLERuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLl9fd2JnX3Jlc3BvbnNlY29udGV4dF9mcmVlKGUsMCl9Y29uc3RydWN0b3IoKXtjb25zdCBlPXVyLnJlc3BvbnNlY29udGV4dF9uZXcoKTtyZXR1cm4gdGhpcy5fX3diZ19wdHI9ZT4+PjAsRG4ucmVnaXN0ZXIodGhpcyx0aGlzLl9fd2JnX3B0cix0aGlzKSx0aGlzfXNlbmRfcmVzcG9uc2UoZSl7cmV0dXJuIHVyLnJlc3BvbnNlY29udGV4dF9zZW5kX3Jlc3BvbnNlKHRoaXMuX193YmdfcHRyLGUpfX1TeW1ib2wuZGlzcG9zZSYmKFVuLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09VW4ucHJvdG90eXBlLmZyZWUpO2NsYXNzIE9ue3N0YXRpYyBfX3dyYXAoZSl7ZT4+Pj0wO2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShPbi5wcm90b3R5cGUpO3JldHVybiB0Ll9fd2JnX3B0cj1lLENuLnJlZ2lzdGVyKHQsdC5fX3diZ19wdHIsdCksdH1fX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLENuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLl9fd2JnX3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9mcmVlKGUsMCl9Z2V0IGFyY19sZW5ndGgoKXtyZXR1cm4gdXIuX193YmdfZ2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9hcmNfbGVuZ3RoKHRoaXMuX193YmdfcHRyKX1nZXQgYXJjX21pZF9wb2ludF94KCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fYXJjX21pZF9wb2ludF94KHRoaXMuX193YmdfcHRyKX1nZXQgYXJjX21pZF9wb2ludF95KCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fYXJjX21pZF9wb2ludF95KHRoaXMuX193YmdfcHRyKX1nZXQgY2N3KCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2N3KHRoaXMuX193YmdfcHRyKX1nZXQgY2VudGVyX3goKXtyZXR1cm4gdXIuX193YmdfZ2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9jZW50ZXJfeCh0aGlzLl9fd2JnX3B0cil9Z2V0IGNlbnRlcl95KCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2VudGVyX3kodGhpcy5fX3diZ19wdHIpfWdldCBlbmRfYW5nbGUoKXtyZXR1cm4gdXIuX193YmdfZ2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9lbmRfYW5nbGUodGhpcy5fX3diZ19wdHIpfWdldCByYWRpdXMoKXtyZXR1cm4gdXIuX193YmdfZ2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9yYWRpdXModGhpcy5fX3diZ19wdHIpfWdldCBzdGFydF9hbmdsZSgpe3JldHVybiB1ci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX3N0YXJ0X2FuZ2xlKHRoaXMuX193YmdfcHRyKX1zZXQgYXJjX2xlbmd0aChlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19sZW5ndGgodGhpcy5fX3diZ19wdHIsZSl9c2V0IGFyY19taWRfcG9pbnRfeChlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeCh0aGlzLl9fd2JnX3B0cixlKX1zZXQgYXJjX21pZF9wb2ludF95KGUpe3VyLl9fd2JnX3NldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fYXJjX21pZF9wb2ludF95KHRoaXMuX193YmdfcHRyLGUpfXNldCBjY3coZSl7dXIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9jY3codGhpcy5fX3diZ19wdHIsZSl9c2V0IGNlbnRlcl94KGUpe3VyLl9fd2JnX3NldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2VudGVyX3godGhpcy5fX3diZ19wdHIsZSl9c2V0IGNlbnRlcl95KGUpe3VyLl9fd2JnX3NldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2VudGVyX3kodGhpcy5fX3diZ19wdHIsZSl9c2V0IGVuZF9hbmdsZShlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2VuZF9hbmdsZSh0aGlzLl9fd2JnX3B0cixlKX1zZXQgcmFkaXVzKGUpe3VyLl9fd2JnX3NldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fcmFkaXVzKHRoaXMuX193YmdfcHRyLGUpfXNldCBzdGFydF9hbmdsZShlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX3N0YXJ0X2FuZ2xlKHRoaXMuX193YmdfcHRyLGUpfX1TeW1ib2wuZGlzcG9zZSYmKE9uLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09T24ucHJvdG90eXBlLmZyZWUpO2NsYXNzIE5ue3N0YXRpYyBfX3dyYXAoZSl7ZT4+Pj0wO2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShObi5wcm90b3R5cGUpO3JldHVybiB0Ll9fd2JnX3B0cj1lLE1uLnJlZ2lzdGVyKHQsdC5fX3diZ19wdHIsdCksdH1fX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLE1uLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLl9fd2JnX3dhc21jaXJjbGVwYXJhbXNfZnJlZShlLDApfWdldCBjZW50ZXJfeCgpe3JldHVybiB1ci5fX3diZ19nZXRfd2FzbWNpcmNsZXBhcmFtc19jZW50ZXJfeCh0aGlzLl9fd2JnX3B0cil9Z2V0IGNlbnRlcl95KCl7cmV0dXJuIHVyLl9fd2JnX2dldF93YXNtY2lyY2xlcGFyYW1zX2NlbnRlcl95KHRoaXMuX193YmdfcHRyKX1nZXQgcmFkaXVzKCl7cmV0dXJuIHVyLl9fd2JnX2dldF93YXNtY2lyY2xlcGFyYW1zX3JhZGl1cyh0aGlzLl9fd2JnX3B0cil9c2V0IGNlbnRlcl94KGUpe3VyLl9fd2JnX3NldF93YXNtY2lyY2xlcGFyYW1zX2NlbnRlcl94KHRoaXMuX193YmdfcHRyLGUpfXNldCBjZW50ZXJfeShlKXt1ci5fX3diZ19zZXRfd2FzbWNpcmNsZXBhcmFtc19jZW50ZXJfeSh0aGlzLl9fd2JnX3B0cixlKX1zZXQgcmFkaXVzKGUpe3VyLl9fd2JnX3NldF93YXNtY2lyY2xlcGFyYW1zX3JhZGl1cyh0aGlzLl9fd2JnX3B0cixlKX19ZnVuY3Rpb24gSW4oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcixyPXVyLnBhcnNlX3dhc20odCxuKTtpZihyWzJdKXRocm93IHNyKHJbMV0pO3JldHVybiBzcihyWzBdKX1mdW5jdGlvbiB2bigpe2NvbnN0IGU9e19fcHJvdG9fXzpudWxsLF9fd2JnX0Vycm9yXzU1NTM4NDgzZGU2ZTNhYmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gRXJyb3IoWG4oZSx0KSl9LF9fd2JnX19fd2JpbmRnZW5fYm9vbGVhbl9nZXRfZmUyYTI0ZmRmZGI0MDY0ZjpmdW5jdGlvbihlKXtjb25zdCB0PSJib29sZWFuIj09dHlwZW9mIGU/ZTp2b2lkIDA7cmV0dXJuIG5yKHQpPzE2Nzc3MjE1OnQ/MTowfSxfX3diZ19fX3diaW5kZ2VuX2RlYnVnX3N0cmluZ19kODk2MjcyMDJkMDE1NWI3OmZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1vcihXbih0KSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3I7S24oKS5zZXRJbnQzMihlKzQsciwhMCksS24oKS5zZXRJbnQzMihlKzAsbiwhMCl9LF9fd2JnX19fd2JpbmRnZW5faXNfZnVuY3Rpb25fMmE5NTQwNjQyM2VhODYyNjpmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX0sX193YmdfX193YmluZGdlbl9pc19udWxsXzhkOTA1MjRjOWUwYWYxODM6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lfSxfX3diZ19fX3diaW5kZ2VuX2lzX29iamVjdF81OWEwMDJlNzZiMDU5MzEyOmZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV9LF9fd2JnX19fd2JpbmRnZW5faXNfdW5kZWZpbmVkXzg3YTNhODM3ZjMzMWZlZjU6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWV9LF9fd2JnX19fd2JpbmRnZW5fc3RyaW5nX2dldF9mMTE2MTM5MDQxNGY5YjU5OmZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj0ic3RyaW5nIj09dHlwZW9mIHQ/dDp2b2lkIDA7dmFyIHI9bnIobik/MDpvcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcjtLbigpLnNldEludDMyKGUrNCxpLCEwKSxLbigpLnNldEludDMyKGUrMCxyLCEwKX0sX193YmdfX193YmluZGdlbl90aHJvd181NTQ5NDkyZGFlZGFkMTM5OmZ1bmN0aW9uKGUsdCl7dGhyb3cgbmV3IEVycm9yKFhuKGUsdCkpfSxfX3diZ19fd2JnX2NiX3VucmVmX2ZiZTY5YmIwNzZjMTZiYWQ6ZnVuY3Rpb24oZSl7ZS5fd2JnX2NiX3VucmVmKCl9LF9fd2JnX2J1ZmZlcl8wYTU3Nzg4Y2RmY2UyMWJhOmZ1bmN0aW9uKGUpe3JldHVybiBlLmJ1ZmZlcn0sX193YmdfYnlvYlJlcXVlc3RfYWIwZTU3ZjU1YmY3NzRmMjpmdW5jdGlvbihlKXtjb25zdCB0PWUuYnlvYlJlcXVlc3Q7cmV0dXJuIG5yKHQpPzA6Vm4odCl9LF9fd2JnX2J5dGVMZW5ndGhfOTkzMWRiMDBlNTg2MWJmOTpmdW5jdGlvbihlKXtyZXR1cm4gZS5ieXRlTGVuZ3RofSxfX3diZ19ieXRlT2Zmc2V0XzBhOTg1YTk4ZjhmZmI4ZDc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYnl0ZU9mZnNldH0sX193YmdfY2FsbF84ZjVkN2JiMDcwMjgzNTA4OmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUuY2FsbCh0LG4pfSksYXJndW1lbnRzKX0sX193YmdfY2xvc2VfNjJmNmE0ZWFkYzk0NTY1ZjpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7ZS5jbG9zZSgpfSksYXJndW1lbnRzKX0sX193YmdfY2xvc2VfODcxZTUxNmEyNzNkMTVmODpmdW5jdGlvbihlKXtyZXR1cm4gZS5jbG9zZSgpfSxfX3diZ19jbG9zZV9mMjg3MDU4NzE2MDg4YTUwOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlKXtlLmNsb3NlKCl9KSxhcmd1bWVudHMpfSxfX3diZ19kb25lXzE5ZjkyY2IxZjg3MzhhYmE6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZG9uZX0sX193YmdfZW5xdWV1ZV9lZTA1OTNjZWE5YmU5M2JkOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQpe2UuZW5xdWV1ZSh0KX0pLGFyZ3VtZW50cyl9LF9fd2JnX2Vycm9yX2E2ZmEyMDJiNThhYTFjZDM6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtuPWUscj10LGNvbnNvbGUuZXJyb3IoWG4oZSx0KSl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobixyLDEpfX0sX193YmdfZXJyb3JfZGU2Yjg2ZTU5ODUwNTI0NjpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfSxfX3diZ19leGlzdHNfM2Q0YTg5M2EwNDE2OGEzZjpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4pe2xldCByLGk7dHJ5e3I9dCxpPW47cmV0dXJuIGUuZXhpc3RzKFhuKHQsbikpfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKHIsaSwxKX19KSxhcmd1bWVudHMpfSxfX3diZ19maXJlTW9kZWxpbmdDb21tYW5kRnJvbVdhc21fMzczNjE4ZTUzMjk4MWU1YjpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4scixpLG8scyxhLGMpe2xldCBsLGYsdSxfLGcsaCxiLGQ7dHJ5e2w9dCxmPW4sdT1yLF89aSxnPW8saD1zLGI9YSxkPWMsZS5maXJlTW9kZWxpbmdDb21tYW5kRnJvbVdhc20oWG4odCxuKSxYbihyLGkpLFhuKG8scyksWG4oYSxjKSl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobCxmLDEpLHVyLl9fd2JpbmRnZW5fZnJlZSh1LF8sMSksdXIuX193YmluZGdlbl9mcmVlKGcsaCwxKSx1ci5fX3diaW5kZ2VuX2ZyZWUoYixkLDEpfX0pLGFyZ3VtZW50cyl9LF9fd2JnX2dldEFsbEZpbGVzX2I5YzRmMGZiOTAxMGExN2E6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCxuKXtsZXQgcixpO3RyeXtyPXQsaT1uO3JldHVybiBlLmdldEFsbEZpbGVzKFhuKHQsbikpfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKHIsaSwxKX19KSxhcmd1bWVudHMpfSxfX3diZ19nZXRSYW5kb21WYWx1ZXNfM2Y0NGI3MDAzOTUwNjJlNTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMocW4oZSx0KSl9KSxhcmd1bWVudHMpfSxfX3diZ19nZXRSYW5kb21WYWx1ZXNfZWYxMjU1MmJmNWFjZDJmZTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMocW4oZSx0KSl9KSxhcmd1bWVudHMpfSxfX3diZ19nZXRXcml0ZXJfN2M5NTMxNDlhZjI3M2MyOTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0V3JpdGVyKCl9KSxhcmd1bWVudHMpfSxfX3diZ19nZXRfZmY1ZjFmYjIyMDIzMzQ3NzpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtyZXR1cm4gUmVmbGVjdC5nZXQoZSx0KX0pLGFyZ3VtZW50cyl9LF9fd2JnX2luc3RhbmNlb2ZfVWludDhBcnJheV9jZTI0ZDU4YTVmNGJkY2MzOmZ1bmN0aW9uKGUpe2xldCB0O3RyeXt0PWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fWNhdGNoKGUpe3Q9ITF9cmV0dXJuIHR9LF9fd2JnX2luc3RhbmNlb2ZfV2luZG93XzJmYThkOWMyZDViNjEwNGE6ZnVuY3Rpb24oZSl7bGV0IHQ7dHJ5e3Q9ZSBpbnN0YW5jZW9mIFdpbmRvd31jYXRjaChlKXt0PSExfXJldHVybiB0fSxfX3diZ19pbnN0YW5jZW9mX1dvcmtlckdsb2JhbFNjb3BlX2E0MzA3Yzg1ZjczZDgzYzM6ZnVuY3Rpb24oZSl7bGV0IHQ7dHJ5e3Q9ZSBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlfWNhdGNoKGUpe3Q9ITF9cmV0dXJuIHR9LF9fd2JnX2xlbmd0aF9lNmUxNjMzZmJlYTZjZmE5OmZ1bmN0aW9uKGUpe3JldHVybiBlLmxlbmd0aH0sX193YmdfbG9nXzZhNzViNzFkNjMxNmU5MzU6ZnVuY3Rpb24oZSl7Y29uc29sZS5sb2coZSl9LF9fd2JnX25ld18xZDk2Njc4YWFhY2NhMzJlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgVWludDhBcnJheShlKX0sX193YmdfbmV3XzIyN2Q3YzA1NDE0ZWI4NjE6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEVycm9yfSxfX3diZ19uZXdfNGE4NDNmZTJlZTQwODJhOTpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgRXJyb3IoWG4oZSx0KSl9LF9fd2JnX25ld19mcm9tX3NsaWNlXzBiYzU4ZTM2ZjgyYTFiNTA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkocW4oZSx0KSl9LF9fd2JnX25ld190eXBlZF8yNWRkYTIzODhkN2U1ZTlmOmZ1bmN0aW9uKGUsdCl7dHJ5e3ZhciBuPXthOmUsYjp0fTtjb25zdCByPW5ldyBQcm9taXNlKCgoZSx0KT0+e2NvbnN0IHI9bi5hO24uYT0wO3RyeXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dXIud2FzbV9iaW5kZ2VuX19jb252ZXJ0X19jbG9zdXJlc19fX19faW52b2tlX19oMjM2YTFlMmU3MjRjNzFkOShlLHQsbixyKX0ocixuLmIsZSx0KX1maW5hbGx5e24uYT1yfX0pKTtyZXR1cm4gcn1maW5hbGx5e24uYT0wfX0sX193YmdfbmV3X3dpdGhfYnl0ZV9vZmZzZXRfYW5kX2xlbmd0aF9hYjFlMTAwMmQ3YTY5NGU0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSx0Pj4+MCxuPj4+MCl9LF9fd2JnX25leHRfMWI3YjVjMDA3OTY2NTYwZjpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dCgpfSksYXJndW1lbnRzKX0sX193Ymdfbm93X2E5YWY0NTU0ZWRiN2FjNzg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm93KCl9LF9fd2JnX25vd19lN2M2Nzk1YTdmODFlMTBmOmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vdygpfSxfX3diZ19wYXJzZV9lNTcwM2ZkNTIyMTFlNjg4OmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQpe3JldHVybiBKU09OLnBhcnNlKFhuKGUsdCkpfSksYXJndW1lbnRzKX0sX193YmdfcGVyZm9ybWFuY2VfM2ZjZjZlMzJhN2UxZWQwYTpmdW5jdGlvbihlKXtyZXR1cm4gZS5wZXJmb3JtYW5jZX0sX193YmdfcHJvdG90eXBlc2V0Y2FsbF8zODc1ZDU0ZDEyZWYyZWVjOmZ1bmN0aW9uKGUsdCxuKXtVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChxbihlLHQpLG4pfSxfX3diZ19xdWV1ZU1pY3JvdGFza184ODY4MzY1MTE0ZmUyM2I1OmZ1bmN0aW9uKGUpe3F1ZXVlTWljcm90YXNrKGUpfSxfX3diZ19xdWV1ZU1pY3JvdGFza19jZmM1YTBlNjJmOWViZGJlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnF1ZXVlTWljcm90YXNrfSxfX3diZ19yZWFkRmlsZV9jZTFiNmJlY2MwNWY5MzBmOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQsbil7bGV0IHIsaTt0cnl7cj10LGk9bjtyZXR1cm4gZS5yZWFkRmlsZShYbih0LG4pKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShyLGksMSl9fSksYXJndW1lbnRzKX0sX193YmdfcmVhZHlfNTg1NmRiNmYwMGUzZTIwYTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWFkeX0sX193YmdfcmVsZWFzZUxvY2tfOTViYmM3Y2Y3Yjg3OTc3ZDpmdW5jdGlvbihlKXtlLnJlbGVhc2VMb2NrKCl9LF9fd2JnX3Jlc29sdmVfZDgwNTliYzExM2UyMTViZjpmdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpfSxfX3diZ19yZXNwb25kXzFlYzI5Mzk1ZWRiZTdmY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCl7ZS5yZXNwb25kKHQ+Pj4wKX0pLGFyZ3VtZW50cyl9LF9fd2JnX3NlbmRNb2RlbGluZ0NvbW1hbmRGcm9tV2FzbV8zOTUyMWIxMWQ1OWVlYjI3OmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQsbixyLGksbyxzLGEsYyl7bGV0IGwsZix1LF8sZyxoLGIsZDt0cnl7bD10LGY9bix1PXIsXz1pLGc9byxoPXMsYj1hLGQ9YztyZXR1cm4gZS5zZW5kTW9kZWxpbmdDb21tYW5kRnJvbVdhc20oWG4odCxuKSxYbihyLGkpLFhuKG8scyksWG4oYSxjKSl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobCxmLDEpLHVyLl9fd2JpbmRnZW5fZnJlZSh1LF8sMSksdXIuX193YmluZGdlbl9mcmVlKGcsaCwxKSx1ci5fX3diaW5kZ2VuX2ZyZWUoYixkLDEpfX0pLGFyZ3VtZW50cyl9LF9fd2JnX3NldFRpbWVvdXRfNDY2ZDUwZjM1MTIyNDVjYjpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnNldFRpbWVvdXQodCxuKX0pLGFyZ3VtZW50cyl9LF9fd2JnX3NldFRpbWVvdXRfYzFjOWExOGI2MzQzZWJkMzpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnNldFRpbWVvdXQodCxuKX0pLGFyZ3VtZW50cyl9LF9fd2JnX3NldF8yOTViYWQzYjVlYWQ0ZTk5OmZ1bmN0aW9uKGUsdCxuKXtlLnNldChxbih0LG4pKX0sX193Ymdfc3RhY2tfM2IwZDk3NGJiZjMxZTQ0ZjpmdW5jdGlvbihlLHQpe2NvbnN0IG49b3IodC5zdGFjayx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3I7S24oKS5zZXRJbnQzMihlKzQsciwhMCksS24oKS5zZXRJbnQzMihlKzAsbiwhMCl9LF9fd2JnX3N0YXJ0TmV3U2Vzc2lvbl83ZDQ4NWFiZTJkOTRjNWMyOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5zdGFydE5ld1Nlc3Npb24oKX0pLGFyZ3VtZW50cyl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9HTE9CQUxfOGRmYjdmNWUyNmViZTUyMzpmdW5jdGlvbigpe2NvbnN0IGU9InVuZGVmaW5lZCI9PXR5cGVvZiBnbG9iYWw/bnVsbDpnbG9iYWw7cmV0dXJuIG5yKGUpPzA6Vm4oZSl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9HTE9CQUxfVEhJU185NDExNTRlZmM4Mzk1Y2RkOmZ1bmN0aW9uKCl7Y29uc3QgZT0idW5kZWZpbmVkIj09dHlwZW9mIGdsb2JhbFRoaXM/bnVsbDpnbG9iYWxUaGlzO3JldHVybiBucihlKT8wOlZuKGUpfSxfX3diZ19zdGF0aWNfYWNjZXNzb3JfU0VMRl81OGRhYzlhZjgyMmY1NjFmOmZ1bmN0aW9uKCl7Y29uc3QgZT0idW5kZWZpbmVkIj09dHlwZW9mIHNlbGY/bnVsbDpzZWxmO3JldHVybiBucihlKT8wOlZuKGUpfSxfX3diZ19zdGF0aWNfYWNjZXNzb3JfV0lORE9XX2VlNjRmMGIzZDgzNTRjMGI6ZnVuY3Rpb24oKXtjb25zdCBlPSJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93P251bGw6d2luZG93O3JldHVybiBucihlKT8wOlZuKGUpfSxfX3diZ19zdHJpbmdpZnlfYjY3ZTJjOGM2MGI5M2Y2OTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpfSksYXJndW1lbnRzKX0sX193YmdfdGhlbl8wMTUwMzUyZTRhZDIwMzQ0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS50aGVuKHQsbil9LF9fd2JnX3RoZW5fNTE2MDQ4NmM2N2RkYjk4YTpmdW5jdGlvbihlLHQpe3JldHVybiBlLnRoZW4odCl9LF9fd2JnX3RvU3RyaW5nXzU1M2I1ZjZlOTVlM2U0MWI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9TdHJpbmcoKX0sX193YmdfdG9TdHJpbmdfOWU3MzUzYTc3Y2I0MTVhMjpmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSxfX3diZ192YWx1ZV9kNWIyNDhjZTg0MTliZDFiOmZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlfSxfX3diZ192aWV3XzM4YTkzMDg0NGM5NjQxMDM6ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLnZpZXc7cmV0dXJuIG5yKHQpPzA6Vm4odCl9LF9fd2JnX3dhcm5fODZlZjAzZGI4Y2ZiNGRkNDpmdW5jdGlvbihlKXtjb25zb2xlLndhcm4oZSl9LF9fd2JnX3dyaXRlX2ZmM2EzZGU0OTAyYWE4YmY6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS53cml0ZSh0KX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcnIoZSx0LCRuKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcnIoZSx0LExuKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcnIoZSx0LFRuKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWG4oZSx0KX0sX193YmluZGdlbl9pbml0X2V4dGVybnJlZl90YWJsZTpmdW5jdGlvbigpe2NvbnN0IGU9dXIuX193YmluZGdlbl9leHRlcm5yZWZzLHQ9ZS5ncm93KDQpO2Uuc2V0KDAsdm9pZCAwKSxlLnNldCh0KzAsdm9pZCAwKSxlLnNldCh0KzEsbnVsbCksZS5zZXQodCsyLCEwKSxlLnNldCh0KzMsITEpfX07cmV0dXJue19fcHJvdG9fXzpudWxsLCIuL2tjbF93YXNtX2xpYl9iZy5qcyI6ZX19ZnVuY3Rpb24gVG4oZSx0KXt1ci53YXNtX2JpbmRnZW5fX2NvbnZlcnRfX2Nsb3N1cmVzX19fX19pbnZva2VfX2gyZjRhYTYzZGNkNTk5Y2Y3KGUsdCl9ZnVuY3Rpb24gJG4oZSx0LG4pe2NvbnN0IHI9dXIud2FzbV9iaW5kZ2VuX19jb252ZXJ0X19jbG9zdXJlc19fX19faW52b2tlX19oZjEzMDgxNmNkOTAwNWI5OShlLHQsbik7aWYoclsxXSl0aHJvdyBzcihyWzBdKX1mdW5jdGlvbiBMbihlLHQsbil7Y29uc3Qgcj11ci53YXNtX2JpbmRnZW5fX2NvbnZlcnRfX2Nsb3N1cmVzX19fX19pbnZva2VfX2hmMTEyMzMwZTAxZDUxZGViKGUsdCxuKTtpZihyWzFdKXRocm93IHNyKHJbMF0pfVN5bWJvbC5kaXNwb3NlJiYoTm4ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1Obi5wcm90b3R5cGUuZnJlZSk7Y29uc3QgQW49WyJieXRlcyJdLFJuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT51ci5fX3diZ19jb250ZXh0X2ZyZWUoZT4+PjAsMSkpKSxqbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfaW50b3VuZGVybHlpbmdieXRlc291cmNlX2ZyZWUoZT4+PjAsMSkpKSxGbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfaW50b3VuZGVybHlpbmdzaW5rX2ZyZWUoZT4+PjAsMSkpKSxrbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfaW50b3VuZGVybHlpbmdzb3VyY2VfZnJlZShlPj4+MCwxKSkpLHpuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT51ci5fX3diZ19sc3BzZXJ2ZXJjb25maWdfZnJlZShlPj4+MCwxKSkpLERuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT51ci5fX3diZ19yZXNwb25zZWNvbnRleHRfZnJlZShlPj4+MCwxKSkpLENuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT51ci5fX3diZ190YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fZnJlZShlPj4+MCwxKSkpLE1uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT51ci5fX3diZ193YXNtY2lyY2xlcGFyYW1zX2ZyZWUoZT4+PjAsMSkpKTtmdW5jdGlvbiBWbihlKXtjb25zdCB0PXVyLl9fZXh0ZXJucmVmX3RhYmxlX2FsbG9jKCk7cmV0dXJuIHVyLl9fd2JpbmRnZW5fZXh0ZXJucmVmcy5zZXQodCxlKSx0fWZ1bmN0aW9uIFBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCBpbnN0YW5jZSBvZiAke3QubmFtZX1gKX1jb25zdCBKbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmluZGdlbl9kZXN0cm95X2Nsb3N1cmUoZS5hLGUuYikpKTtmdW5jdGlvbiBXbihlKXtjb25zdCB0PXR5cGVvZiBlO2lmKCJudW1iZXIiPT10fHwiYm9vbGVhbiI9PXR8fG51bGw9PWUpcmV0dXJuYCR7ZX1gO2lmKCJzdHJpbmciPT10KXJldHVybmAiJHtlfSJgO2lmKCJzeW1ib2wiPT10KXtjb25zdCB0PWUuZGVzY3JpcHRpb247cmV0dXJuIG51bGw9PXQ/IlN5bWJvbCI6YFN5bWJvbCgke3R9KWB9aWYoImZ1bmN0aW9uIj09dCl7Y29uc3QgdD1lLm5hbWU7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiZ0Lmxlbmd0aD4wP2BGdW5jdGlvbigke3R9KWA6IkZ1bmN0aW9uIn1pZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCB0PWUubGVuZ3RoO2xldCBuPSJbIjt0PjAmJihuKz1XbihlWzBdKSk7Zm9yKGxldCByPTE7cjx0O3IrKyluKz0iLCAiK1duKGVbcl0pO3JldHVybiBuKz0iXSIsbn1jb25zdCBuPS9cW29iamVjdCAoW15cXV0rKVxdLy5leGVjKHRvU3RyaW5nLmNhbGwoZSkpO2xldCByO2lmKCEobiYmbi5sZW5ndGg+MSkpcmV0dXJuIHRvU3RyaW5nLmNhbGwoZSk7aWYocj1uWzFdLCJPYmplY3QiPT1yKXRyeXtyZXR1cm4iT2JqZWN0KCIrSlNPTi5zdHJpbmdpZnkoZSkrIikifWNhdGNoKGUpe3JldHVybiJPYmplY3QifXJldHVybiBlIGluc3RhbmNlb2YgRXJyb3I/YCR7ZS5uYW1lfTogJHtlLm1lc3NhZ2V9XG4ke2Uuc3RhY2t9YDpyfWZ1bmN0aW9uIFluKGUsdCl7ZT4+Pj0wO2NvbnN0IG49S24oKSxyPVtdO2ZvcihsZXQgaT1lO2k8ZSs0KnQ7aSs9NClyLnB1c2godXIuX193YmluZGdlbl9leHRlcm5yZWZzLmdldChuLmdldFVpbnQzMihpLCEwKSkpO3JldHVybiB1ci5fX2V4dGVybnJlZl9kcm9wX3NsaWNlKGUsdCkscn1mdW5jdGlvbiBxbihlLHQpe3JldHVybiBlPj4+PTAsZXIoKS5zdWJhcnJheShlLzEsZS8xK3QpfWxldCBIbj1udWxsO2Z1bmN0aW9uIEtuKCl7cmV0dXJuKG51bGw9PT1Ibnx8ITA9PT1Ibi5idWZmZXIuZGV0YWNoZWR8fHZvaWQgMD09PUhuLmJ1ZmZlci5kZXRhY2hlZCYmSG4uYnVmZmVyIT09dXIubWVtb3J5LmJ1ZmZlcikmJihIbj1uZXcgRGF0YVZpZXcodXIubWVtb3J5LmJ1ZmZlcikpLEhufWxldCBabj1udWxsO2Z1bmN0aW9uIEduKCl7cmV0dXJuIG51bGwhPT1abiYmMCE9PVpuLmJ5dGVMZW5ndGh8fChabj1uZXcgRmxvYXQ2NEFycmF5KHVyLm1lbW9yeS5idWZmZXIpKSxabn1mdW5jdGlvbiBYbihlLHQpe3JldHVybiBmdW5jdGlvbihlLHQpe2xyKz10LGxyPj1jciYmKGFyPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtpZ25vcmVCT006ITAsZmF0YWw6ITB9KSxhci5kZWNvZGUoKSxscj10KTtyZXR1cm4gYXIuZGVjb2RlKGVyKCkuc3ViYXJyYXkoZSxlK3QpKX0oZT4+Pj0wLHQpfWxldCBRbj1udWxsO2Z1bmN0aW9uIGVyKCl7cmV0dXJuIG51bGwhPT1RbiYmMCE9PVFuLmJ5dGVMZW5ndGh8fChRbj1uZXcgVWludDhBcnJheSh1ci5tZW1vcnkuYnVmZmVyKSksUW59ZnVuY3Rpb24gdHIoZSx0KXt0cnl7cmV0dXJuIGUuYXBwbHkodGhpcyx0KX1jYXRjaChlKXtjb25zdCB0PVZuKGUpO3VyLl9fd2JpbmRnZW5fZXhuX3N0b3JlKHQpfX1mdW5jdGlvbiBucihlKXtyZXR1cm4gbnVsbD09ZX1mdW5jdGlvbiBycihlLHQsbil7Y29uc3Qgcj17YTplLGI6dCxjbnQ6MX0saT0oLi4uZSk9PntyLmNudCsrO2NvbnN0IHQ9ci5hO3IuYT0wO3RyeXtyZXR1cm4gbih0LHIuYiwuLi5lKX1maW5hbGx5e3IuYT10LGkuX3diZ19jYl91bnJlZigpfX07cmV0dXJuIGkuX3diZ19jYl91bnJlZj0oKT0+ezA9PS0tci5jbnQmJih1ci5fX3diaW5kZ2VuX2Rlc3Ryb3lfY2xvc3VyZShyLmEsci5iKSxyLmE9MCxKbi51bnJlZ2lzdGVyKHIpKX0sSm4ucmVnaXN0ZXIoaSxyLHIpLGl9ZnVuY3Rpb24gaXIoZSx0KXtjb25zdCBuPXQoOCplLmxlbmd0aCw4KT4+PjA7cmV0dXJuIEduKCkuc2V0KGUsbi84KSxfcj1lLmxlbmd0aCxufWZ1bmN0aW9uIG9yKGUsdCxuKXtpZih2b2lkIDA9PT1uKXtjb25zdCBuPWZyLmVuY29kZShlKSxyPXQobi5sZW5ndGgsMSk+Pj4wO3JldHVybiBlcigpLnN1YmFycmF5KHIscituLmxlbmd0aCkuc2V0KG4pLF9yPW4ubGVuZ3RoLHJ9bGV0IHI9ZS5sZW5ndGgsaT10KHIsMSk+Pj4wO2NvbnN0IG89ZXIoKTtsZXQgcz0wO2Zvcig7czxyO3MrKyl7Y29uc3QgdD1lLmNoYXJDb2RlQXQocyk7aWYodD4xMjcpYnJlYWs7b1tpK3NdPXR9aWYocyE9PXIpezAhPT1zJiYoZT1lLnNsaWNlKHMpKSxpPW4oaSxyLHI9cyszKmUubGVuZ3RoLDEpPj4+MDtjb25zdCB0PWVyKCkuc3ViYXJyYXkoaStzLGkrcik7cys9ZnIuZW5jb2RlSW50byhlLHQpLndyaXR0ZW4saT1uKGkscixzLDEpPj4+MH1yZXR1cm4gX3I9cyxpfWZ1bmN0aW9uIHNyKGUpe2NvbnN0IHQ9dXIuX193YmluZGdlbl9leHRlcm5yZWZzLmdldChlKTtyZXR1cm4gdXIuX19leHRlcm5yZWZfdGFibGVfZGVhbGxvYyhlKSx0fWxldCBhcj1uZXcgVGV4dERlY29kZXIoInV0Zi04Iix7aWdub3JlQk9NOiEwLGZhdGFsOiEwfSk7YXIuZGVjb2RlKCk7Y29uc3QgY3I9MjE0NjQzNTA3MjtsZXQgbHI9MDtjb25zdCBmcj1uZXcgVGV4dEVuY29kZXI7ImVuY29kZUludG8iaW4gZnJ8fChmci5lbmNvZGVJbnRvPWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1mci5lbmNvZGUoZSk7cmV0dXJuIHQuc2V0KG4pLHtyZWFkOmUubGVuZ3RoLHdyaXR0ZW46bi5sZW5ndGh9fSk7bGV0IHVyLF9yPTA7ZnVuY3Rpb24gZ3IoZSx0KXtyZXR1cm4gdXI9ZS5leHBvcnRzLEhuPW51bGwsWm49bnVsbCxRbj1udWxsLHVyLl9fd2JpbmRnZW5fc3RhcnQoKSx1cn1hc3luYyBmdW5jdGlvbiBocihlKXtpZih2b2lkIDAhPT11cilyZXR1cm4gdXI7dm9pZCAwIT09ZSYmKE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PU9iamVjdC5wcm90b3R5cGU/KHttb2R1bGVfb3JfcGF0aDplfT1lKTpjb25zb2xlLndhcm4oInVzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIikpLHZvaWQgMD09PWUmJihlPW5ldyBVUkwoImtjbF93YXNtX2xpYl9iZy53YXNtIixkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYiU0NSSVBUIj09PWRvY3VtZW50LmN1cnJlbnRTY3JpcHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY3x8bmV3IFVSTCgid29ya2VyLXdlYnJ0Yy5qcyIsZG9jdW1lbnQuYmFzZVVSSSkuaHJlZikpO2NvbnN0IHQ9dm4oKTsoInN0cmluZyI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgUmVxdWVzdCYmZSBpbnN0YW5jZW9mIFJlcXVlc3R8fCJmdW5jdGlvbiI9PXR5cGVvZiBVUkwmJmUgaW5zdGFuY2VvZiBVUkwpJiYoZT1mZXRjaChlKSk7Y29uc3R7aW5zdGFuY2U6bixtb2R1bGU6cn09YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0KXtpZigiZnVuY3Rpb24iPT10eXBlb2YgUmVzcG9uc2UmJmUgaW5zdGFuY2VvZiBSZXNwb25zZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKXRyeXtyZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcoZSx0KX1jYXRjaCh0KXtpZighZS5va3x8IWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlImJhc2ljIjpjYXNlImNvcnMiOmNhc2UiZGVmYXVsdCI6cmV0dXJuITB9cmV0dXJuITF9KGUudHlwZSl8fCJhcHBsaWNhdGlvbi93YXNtIj09PWUuaGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIpKXRocm93IHQ7Y29uc29sZS53YXJuKCJgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmdgIGZhaWxlZCBiZWNhdXNlIHlvdXIgc2VydmVyIGRvZXMgbm90IHNlcnZlIFdhc20gd2l0aCBgYXBwbGljYXRpb24vd2FzbWAgTUlNRSB0eXBlLiBGYWxsaW5nIGJhY2sgdG8gYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlYCB3aGljaCBpcyBzbG93ZXIuIE9yaWdpbmFsIGVycm9yOlxuIix0KX1jb25zdCBuPWF3YWl0IGUuYXJyYXlCdWZmZXIoKTtyZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUobix0KX17Y29uc3Qgbj1hd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLHQpO3JldHVybiBuIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuSW5zdGFuY2U/e2luc3RhbmNlOm4sbW9kdWxlOmV9Om59fShhd2FpdCBlLHQpO3JldHVybiBncihuKX12YXIgYnI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQ29udGV4dDptbixJbnRvVW5kZXJseWluZ0J5dGVTb3VyY2U6U24sSW50b1VuZGVybHlpbmdTaW5rOkJuLEludG9VbmRlcmx5aW5nU291cmNlOnhuLExzcFNlcnZlckNvbmZpZzpFbixSZXNwb25zZUNvbnRleHQ6VW4sVGFuZ2VudGlhbEFyY0luZm9PdXRwdXRXYXNtOk9uLFdhc21DaXJjbGVQYXJhbXM6Tm4sYmFzZTY0X2RlY29kZTpmdW5jdGlvbihlKXtjb25zdCB0PW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxuPV9yLHI9dXIuYmFzZTY0X2RlY29kZSh0LG4pO2lmKHJbM10pdGhyb3cgc3IoclsyXSk7dmFyIGk9cW4oclswXSxyWzFdKS5zbGljZSgpO3JldHVybiB1ci5fX3diaW5kZ2VuX2ZyZWUoclswXSwxKnJbMV0sMSksaX0sY2FsY3VsYXRlX2NpcmNsZV9mcm9tXzNfcG9pbnRzOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXtjb25zdCBzPXVyLmNhbGN1bGF0ZV9jaXJjbGVfZnJvbV8zX3BvaW50cyhlLHQsbixyLGksbyk7cmV0dXJuIE5uLl9fd3JhcChzKX0sY2hhbmdlX2RlZmF1bHRfdW5pdHM6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGw9X3IsZj11ci5jaGFuZ2VfZGVmYXVsdF91bml0cyhzLGEsYyxsKTt2YXIgaT1mWzBdLG89ZlsxXTtpZihmWzNdKXRocm93IGk9MCxvPTAsc3IoZlsyXSk7cmV0dXJuIG49aSxyPW8sWG4oaSxvKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShuLHIsMSl9fSxjaGFuZ2VfZXhwZXJpbWVudGFsX2ZlYXR1cmVzOmZ1bmN0aW9uKGUsdCl7bGV0IG4scjt0cnl7Y29uc3Qgcz1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxsPV9yLGY9dXIuY2hhbmdlX2V4cGVyaW1lbnRhbF9mZWF0dXJlcyhzLGEsYyxsKTt2YXIgaT1mWzBdLG89ZlsxXTtpZihmWzNdKXRocm93IGk9MCxvPTAsc3IoZlsyXSk7cmV0dXJuIG49aSxyPW8sWG4oaSxvKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShuLHIsMSl9fSxjaGFuZ2Vfa2NsX3ZlcnNpb246ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGw9X3IsZj11ci5jaGFuZ2Vfa2NsX3ZlcnNpb24ocyxhLGMsbCk7dmFyIGk9ZlswXSxvPWZbMV07aWYoZlszXSl0aHJvdyBpPTAsbz0wLHNyKGZbMl0pO3JldHVybiBuPWkscj1vLFhuKGksbyl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobixyLDEpfX0sZGVmYXVsdF9hcHBfc2V0dGluZ3M6ZnVuY3Rpb24oKXtjb25zdCBlPXVyLmRlZmF1bHRfYXBwX3NldHRpbmdzKCk7aWYoZVsyXSl0aHJvdyBzcihlWzFdKTtyZXR1cm4gc3IoZVswXSl9LGRlZmF1bHRfcHJvamVjdF9zZXR0aW5nczpmdW5jdGlvbigpe2NvbnN0IGU9dXIuZGVmYXVsdF9wcm9qZWN0X3NldHRpbmdzKCk7aWYoZVsyXSl0aHJvdyBzcihlWzFdKTtyZXR1cm4gc3IoZVswXSl9LGZvcm1hdF9udW1iZXJfbGl0ZXJhbDpmdW5jdGlvbihlLHQsbil7bGV0IHIsaTt0cnl7Y29uc3QgYT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixsPXVyLmZvcm1hdF9udW1iZXJfbGl0ZXJhbChlLGEsYyxucihuKT80Mjk0OTY3Mjk3Om4+Pj4wKTt2YXIgbz1sWzBdLHM9bFsxXTtpZihsWzNdKXRocm93IG89MCxzPTAsc3IobFsyXSk7cmV0dXJuIHI9byxpPXMsWG4obyxzKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShyLGksMSl9fSxmb3JtYXRfbnVtYmVyX3ZhbHVlOmZ1bmN0aW9uKGUsdCl7bGV0IG4scjt0cnl7Y29uc3Qgcz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPXVyLmZvcm1hdF9udW1iZXJfdmFsdWUoZSxzLGEpO3ZhciBpPWNbMF0sbz1jWzFdO2lmKGNbM10pdGhyb3cgaT0wLG89MCxzcihjWzJdKTtyZXR1cm4gbj1pLHI9byxYbihpLG8pfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LGdldF9rY2xfdmVyc2lvbjpmdW5jdGlvbigpe2xldCBlLHQ7dHJ5e2NvbnN0IG49dXIuZ2V0X2tjbF92ZXJzaW9uKCk7cmV0dXJuIGU9blswXSx0PW5bMV0sWG4oblswXSxuWzFdKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShlLHQsMSl9fSxnZXRfdGFuZ2VudGlhbF9hcmNfdG9faW5mbzpmdW5jdGlvbihlLHQsbixyLGksbyxzKXtjb25zdCBhPXVyLmdldF90YW5nZW50aWFsX2FyY190b19pbmZvKGUsdCxuLHIsaSxvLHMpO3JldHVybiBPbi5fX3dyYXAoYSl9LGh1bWFuX2Rpc3BsYXlfbnVtYmVyOmZ1bmN0aW9uKGUsdCl7bGV0IG4scjt0cnl7Y29uc3Qgcz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPXVyLmh1bWFuX2Rpc3BsYXlfbnVtYmVyKGUscyxhKTt2YXIgaT1jWzBdLG89Y1sxXTtpZihjWzNdKXRocm93IGk9MCxvPTAsc3IoY1syXSk7cmV0dXJuIG49aSxyPW8sWG4oaSxvKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShuLHIsMSl9fSxpbXBvcnRfZmlsZV9leHRlbnNpb25zOmZ1bmN0aW9uKCl7Y29uc3QgZT11ci5pbXBvcnRfZmlsZV9leHRlbnNpb25zKCk7aWYoZVszXSl0aHJvdyBzcihlWzJdKTt2YXIgdD1ZbihlWzBdLGVbMV0pLnNsaWNlKCk7cmV0dXJuIHVyLl9fd2JpbmRnZW5fZnJlZShlWzBdLDQqZVsxXSw0KSx0fSxpc19rY2xfZW1wdHlfb3Jfb25seV9zZXR0aW5nczpmdW5jdGlvbihlKXtjb25zdCB0PW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxuPV9yLHI9dXIuaXNfa2NsX2VtcHR5X29yX29ubHlfc2V0dGluZ3ModCxuKTtpZihyWzJdKXRocm93IHNyKHJbMV0pO3JldHVybiBzcihyWzBdKX0saXNfcG9pbnRzX2NjdzpmdW5jdGlvbihlKXtjb25zdCB0PWlyKGUsdXIuX193YmluZGdlbl9tYWxsb2MpLG49X3I7cmV0dXJuIHVyLmlzX3BvaW50c19jY3codCxuKX0sa2NsX2xpbnQ6ZnVuY3Rpb24oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcjtyZXR1cm4gdXIua2NsX2xpbnQodCxuKX0sa2NsX3NldHRpbmdzOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49X3Iscj11ci5rY2xfc2V0dGluZ3ModCxuKTtpZihyWzJdKXRocm93IHNyKHJbMV0pO3JldHVybiBzcihyWzBdKX0sbHNwX3J1bl9jb3BpbG90OmZ1bmN0aW9uKGUsdCxuKXtQbihlLEVuKTt2YXIgcj1lLl9fZGVzdHJveV9pbnRvX3JhdygpO2NvbnN0IGk9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3Iscz1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcjtyZXR1cm4gdXIubHNwX3J1bl9jb3BpbG90KHIsaSxvLHMsYSl9LGxzcF9ydW5fa2NsOmZ1bmN0aW9uKGUsdCxuKXtQbihlLEVuKTt2YXIgcj1lLl9fZGVzdHJveV9pbnRvX3JhdygpO2NvbnN0IGk9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3Iscz1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcjtyZXR1cm4gdXIubHNwX3J1bl9rY2wocixpLG8scyxhKX0sbm9kZV9wYXRoX2Zyb21fcmFuZ2U6ZnVuY3Rpb24oZSx0KXtjb25zdCBuPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yLGk9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3I7cmV0dXJuIHVyLm5vZGVfcGF0aF9mcm9tX3JhbmdlKG4scixpLG8pfSxwYXJzZV9hcHBfc2V0dGluZ3M6ZnVuY3Rpb24oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcixyPXVyLnBhcnNlX2FwcF9zZXR0aW5ncyh0LG4pO2lmKHJbMl0pdGhyb3cgc3IoclsxXSk7cmV0dXJuIHNyKHJbMF0pfSxwYXJzZV9wcm9qZWN0X3NldHRpbmdzOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49X3Iscj11ci5wYXJzZV9wcm9qZWN0X3NldHRpbmdzKHQsbik7aWYoclsyXSl0aHJvdyBzcihyWzFdKTtyZXR1cm4gc3IoclswXSl9LHBhcnNlX3dhc206SW4scG9pbnRfdG9fdW5pdDpmdW5jdGlvbihlLHQsbil7Y29uc3Qgcj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcixvPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yLGE9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3IsbD11ci5wb2ludF90b191bml0KHIsaSxvLHMsYSxjKTtpZihsWzNdKXRocm93IHNyKGxbMl0pO3ZhciBmLHUsXz0oZj1sWzBdLHU9bFsxXSxmPj4+PTAsR24oKS5zdWJhcnJheShmLzgsZi84K3UpKS5zbGljZSgpO3JldHVybiB1ci5fX3diaW5kZ2VuX2ZyZWUobFswXSw4KmxbMV0sOCksX30scmVjYXN0X3dhc206ZnVuY3Rpb24oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcixyPXVyLnJlY2FzdF93YXNtKHQsbik7aWYoclsyXSl0aHJvdyBzcihyWzFdKTtyZXR1cm4gc3IoclswXSl9LHJlbGV2YW50X2ZpbGVfZXh0ZW5zaW9uczpmdW5jdGlvbigpe2NvbnN0IGU9dXIucmVsZXZhbnRfZmlsZV9leHRlbnNpb25zKCk7aWYoZVszXSl0aHJvdyBzcihlWzJdKTt2YXIgdD1ZbihlWzBdLGVbMV0pLnNsaWNlKCk7cmV0dXJuIHVyLl9fd2JpbmRnZW5fZnJlZShlWzBdLDQqZVsxXSw0KSx0fSxzZXJpYWxpemVfY29uZmlndXJhdGlvbjpmdW5jdGlvbihlKXtjb25zdCB0PXVyLnNlcmlhbGl6ZV9jb25maWd1cmF0aW9uKGUpO2lmKHRbMl0pdGhyb3cgc3IodFsxXSk7cmV0dXJuIHNyKHRbMF0pfSxzZXJpYWxpemVfcHJvamVjdF9jb25maWd1cmF0aW9uOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9dXIuc2VyaWFsaXplX3Byb2plY3RfY29uZmlndXJhdGlvbihlKTtpZih0WzJdKXRocm93IHNyKHRbMV0pO3JldHVybiBzcih0WzBdKX0sc2tldGNoX2NoZWNrcG9pbnRfbGltaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdXIuc2tldGNoX2NoZWNrcG9pbnRfbGltaXQoKT4+PjB9LGluaXRTeW5jOmZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PXVyKXJldHVybiB1cjt2b2lkIDAhPT1lJiYoT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09T2JqZWN0LnByb3RvdHlwZT8oe21vZHVsZTplfT1lKTpjb25zb2xlLndhcm4oInVzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgYGluaXRTeW5jKClgOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIikpO2NvbnN0IHQ9dm4oKTtyZXR1cm4gZSBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lk1vZHVsZXx8KGU9bmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShlKSksZ3IobmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKGUsdCkpfSxkZWZhdWx0OmhyfSk7bGV0IGRyO2NvbnN0IHdyPXtmaXJlTW9kZWxpbmdDb21tYW5kRnJvbVdhc20oZSx0LG4scil7fSxzZW5kTW9kZWxpbmdDb21tYW5kRnJvbVdhc206YXN5bmMoZSx0LG4scik9Pihwb3N0TWVzc2FnZSh7dG86IndlYnNvY2tldCIscGF5bG9hZDp7dHlwZToic2VuZCIsZGF0YTpufX0pLGRyPy5zZW5kKG4pLG5ldyBQcm9taXNlKCh0PT57Y29uc3Qgbj1yPT57aWYoci5kYXRhLmluZGV4T2YoZSk8MClyZXR1cm47Y29uc3QgaT0obz1KU09OLnBhcnNlKHIuZGF0YSksbmV3IGYocykuZW5jb2RlU2hhcmVkUmVmKG8pKTt2YXIgbyxzO3QoaSksZHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9O2RyLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4pfSkpKSxhc3luYyBzdGFydE5ld1Nlc3Npb24oKXt9fTtzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLChlPT57Y29uc3QgdD1lLmRhdGE7c3dpdGNoKHQudG8pe2Nhc2Uid29ya2VyIjpyZXR1cm4gdm9pZCgic3RhcnQiPT09dC5wYXlsb2FkLnR5cGUmJihhc3luYyBlPT57YXdhaXQgZmV0Y2gobmV3IFVSTCgiL2tjbF93YXNtX2xpYl9iZy53YXNtIixsb2NhdGlvbi5vcmlnaW4pKS50aGVuKChlPT5lLmFycmF5QnVmZmVyKCkpKS50aGVuKChlPT5ocih7bW9kdWxlX29yX3BhdGg6ZX0pKSksZHI9bmV3IFdlYlNvY2tldCh5bi51cmxDb25zdHJ1Y3RGcm9tKHt3ZWJydGM6ITAsLi4uZX0pKSxkci5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwoKCk9Pnt5bi5hdXRoZW50aWNhdGUoe2NsaWVudDplLmNsaWVudH0sZHIpfSkse29uY2U6ITB9KSxkci5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoZT0+e3Bvc3RNZXNzYWdlKHtmcm9tOiJ3ZWJzb2NrZXQiLHBheWxvYWQ6e3R5cGU6Im1lc3NhZ2UiLGRhdGE6ZS5kYXRhfX0pfSkpLHNldEludGVydmFsKCgoKT0+e2RyLnJlYWR5U3RhdGU9PT1XZWJTb2NrZXQuT1BFTiYmZHIuc2VuZChKU09OLnN0cmluZ2lmeSh7dHlwZToicGluZyJ9KSl9KSw0ZTMpfSkodC5wYXlsb2FkLmRhdGFbMF0pKTtjYXNlIndlYnNvY2tldCI6cmV0dXJuIHZvaWQgZHI/Llt0LnBheWxvYWQudHlwZV0oLi4udC5wYXlsb2FkLmRhdGEpO2Nhc2Uid2FzbSI6cmV0dXJuIHZvaWQoImV4ZWN1dGUiPT09dC5wYXlsb2FkLnR5cGU/KChlLHQ9e21haW5LY2xQYXRoTmFtZToibWFpbi5rY2wifSk9Pntjb25zdCBuPSJzdHJpbmciPT10eXBlb2YgZT8oaT1lLHtyZWFkRmlsZTphc3luYyBlPT4obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoaSksZXhpc3RzOmFzeW5jIGU9PiExLGdldEFsbEZpbGVzOmFzeW5jIGU9PltpXX0pOihyPWUse2FzeW5jIHJlYWRGaWxlKGUpe2NvbnN0IHQ9ci5nZXQoZSk/PyIiO3JldHVybihuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh0KX0sZXhpc3RzOmFzeW5jIGU9PnIuaGFzKGUpLGdldEFsbEZpbGVzOmFzeW5jIGU9PkFycmF5LmZyb20oci52YWx1ZXMoKSl9KTt2YXIgcixpO2NvbnN0IG89InN0cmluZyI9PXR5cGVvZiBlP2U6ZS5nZXQodC5tYWluS2NsUGF0aE5hbWUpLHM9bmV3IG1uKHdyLG4pLGE9SW4obylbMF07cmV0dXJuIHMuZXhlY3V0ZShKU09OLnN0cmluZ2lmeShhKSx0Lm1haW5LY2xQYXRoTmFtZSwie30iKX0pKHQucGF5bG9hZC5kYXRhWzBdLHQucGF5bG9hZC5kYXRhWzFdKS50aGVuKChlPT57cG9zdE1lc3NhZ2Uoe2Zyb206Indhc20iLHBheWxvYWQ6e3R5cGU6ImV4ZWN1dGUiLGRhdGE6ZX19KX0pKS5jYXRjaCgoZT0+e3Bvc3RNZXNzYWdlKHtmcm9tOiJ3YXNtIixwYXlsb2FkOnt0eXBlOiJleGVjdXRlIixkYXRhOmV9fSl9KSk6cG9zdE1lc3NhZ2UoYnJbdC5wYXlsb2FkLnR5cGVdKC4uLnQucGF5bG9hZC5kYXRhKSkpfX0pKX0oKTsKCg==", null, false);
2460
- var Qn = (t, e) => {
2461
- let n;
2462
- return { fn: (...t2) => {
2463
- n = t2;
2464
- }, intervalId: setInterval((() => {
2465
- if (void 0 === n) return;
2466
- const e2 = n;
2467
- n = void 0, window.requestAnimationFrame((() => {
2468
- t(...e2);
2469
- }));
2470
- }), e) };
2471
- };
2472
- var On = (function(t) {
2473
- return t[t.DOWN = 0] = "DOWN", t[t.UP = 1] = "UP", t;
2474
- })(On || {});
2475
- var En = (function(t) {
2476
- return t[t.MIDDLE = 1] = "MIDDLE", t[t.RIGHT = 2] = "RIGHT", t;
2477
- })(En || {});
2478
- var _n = { [On.DOWN]: "camera_drag_start", [On.UP]: "camera_drag_end" };
2479
- var Dn = { [En.MIDDLE]: "pan", [En.RIGHT]: "rotatetrackball" };
2480
- var An = class extends EventTarget {
2481
- removeMouseEvents = () => {
2482
- };
2483
- removeResizeObserver = () => {
2484
- };
2485
- constructor(t) {
2486
- super(), this.zooClientArgs = t, this.workerWebRTC = new Fn(), this.rtcPeerConnection = new RTCPeerConnection({ bundlePolicy: "max-bundle" }), this.rtcPeerConnection.addTransceiver("video", { direction: "recvonly" }), this.rtcPeerConnection.createDataChannel("unreliable_modeling_cmds"), this.ice(), this.rtcPeerConnection.addEventListener("track", this.webRTCOnTrack.bind(this)), this.rtcPeerConnection.addEventListener("datachannel", this.webRTCOnDataChannel.bind(this)), this.rtcPeerConnection.addEventListener("connectionstatechange", this.webRTCOnConnectionStateChange.bind(this));
2487
- }
2488
- deconstructor() {
2489
- this.removeMouseEvents(), this.removeResizeObserver(), this.deice(), this.rtcPeerConnection.removeEventListener("track", this.webRTCOnTrack.bind(this)), this.rtcPeerConnection.removeEventListener("datachannel", this.webRTCOnDataChannel.bind(this)), this.rtcPeerConnection.removeEventListener("connectionstatechange", this.webRTCOnConnectionStateChange.bind(this)), this.workerWebRTC.terminate(), this.rtcPeerConnection.close();
2490
- }
2491
- async start() {
2492
- const t = (e) => {
2493
- const n = e.data;
2494
- "from" in n && "websocket" === n.from && "payload" in n && "object" == typeof n.payload && "data" in n.payload && "string" == typeof n.payload.data && n.payload.data.indexOf("auth_token_invalid") >= 0 && (this.workerWebRTC.removeEventListener("message", t), this.zooClientArgs.client.oauth2.fetchAuthorizationCode());
2495
- };
2496
- this.zooClientArgs.client.oauth2.getAccessToken().then(((e) => {
2497
- var n;
2498
- e?.token?.value && (this.zooClientArgs.client.token = e?.token?.value), void 0 === this.zooClientArgs.client.token && (this.zooClientArgs.client.token = "00000000-0000-0000-0000-000000000000"), this.workerWebRTC.addEventListener("message", t), this.workerWebRTC.postMessage({ to: "worker", payload: { type: "start", data: [(n = this.zooClientArgs, JSON.parse(JSON.stringify(n)))] } });
2499
- })).catch(((t2) => {
2500
- "object" == typeof t2 && "kind" in t2 && [EErrorOAuth2.ErrorNoAuthCode, EErrorOAuth2.ErrorAccessTokenResponse].some(((e) => e === t2.kind)) && this.zooClientArgs.client.oauth2.fetchAuthorizationCode();
2501
- }));
2502
- }
2503
- wasm(t, ...e) {
2504
- return new Promise(((n) => {
2505
- const l = (t2) => {
2506
- const e2 = t2.data;
2507
- "from" in e2 && "wasm" === e2.from && (this.workerWebRTC.removeEventListener("message", l), n(e2.payload.data));
2508
- };
2509
- this.workerWebRTC.addEventListener("message", l), this.workerWebRTC.postMessage({ to: "wasm", payload: { type: t, data: e ?? [] } });
2510
- }));
2511
- }
2512
- executor() {
2513
- return { addEventListener: this.workerWebRTC.addEventListener.bind(this.workerWebRTC, "message"), removeEventListener: this.workerWebRTC.removeEventListener.bind(this.workerWebRTC, "message"), submit: (t, e = { mainKclPathName: "main.kcl" }) => new Promise(((n) => {
2514
- const l = (t2) => {
2515
- const e2 = t2.data;
2516
- "from" in e2 && "wasm" === e2.from && "execute" === e2.payload.type && (this.workerWebRTC.removeEventListener("message", l), n(e2.payload.data));
2517
- };
2518
- this.workerWebRTC.addEventListener("message", l), this.workerWebRTC.postMessage({ to: "wasm", payload: { type: "execute", data: [t, e] } });
2519
- })) };
2520
- }
2521
- webRTCOnConnectionStateChange() {
2522
- if ("disconnected" === this.rtcPeerConnection.connectionState) this.dispatchEvent(new Event("close"));
2523
- }
2524
- webRTCOnTrack(t) {
2525
- this.track = t, this.dispatchEvent(new Event("track"));
2526
- }
2527
- webRTCOnDataChannel(t) {
2528
- this.channel = t.channel, this.dispatchEvent(new Event("datachannel")), this.dispatchEvent(new Event("connected"));
2529
- }
2530
- async iceOnIceServerInfo(t) {
2531
- if (0 == t.data.ice_servers.length) return;
2532
- this.rtcPeerConnection.setConfiguration({ bundlePolicy: "max-bundle", iceServers: t.data.ice_servers, iceTransportPolicy: "relay" });
2533
- const e = await this.rtcPeerConnection.createOffer();
2534
- await this.rtcPeerConnection.setLocalDescription(e), this.workerWebRTC.postMessage({ to: "websocket", payload: { type: "send", data: [JSON.stringify({ type: "sdp_offer", offer: e })] } });
2535
- }
2536
- async iceOnSdpAnswer(t) {
2537
- await this.rtcPeerConnection.setRemoteDescription(t.data.answer);
2538
- }
2539
- async iceOnTrickleIce(t) {
2540
- await this.rtcPeerConnection.addIceCandidate(t.data.candidate);
2541
- }
2542
- iceOnIceCandidate(t) {
2543
- null !== t.candidate && this.workerWebRTC.postMessage({ to: "websocket", payload: { type: "send", data: [JSON.stringify({ type: "trickle_ice", candidate: { candidate: t.candidate.candidate, sdpMid: t.candidate.sdpMid || void 0, sdpMLineIndex: t.candidate.sdpMLineIndex || void 0, usernameFragment: t.candidate.usernameFragment || void 0 } })] } });
2544
- }
2545
- iceOnMessage(t) {
2546
- const e = In.parseMessage(t);
2547
- if ("resp" in e) switch (e.resp.type) {
2548
- case "ice_server_info":
2549
- this.iceOnIceServerInfo(e.resp);
2550
- break;
2551
- case "sdp_answer":
2552
- this.iceOnSdpAnswer(e.resp);
2553
- break;
2554
- case "trickle_ice":
2555
- this.iceOnTrickleIce(e.resp);
2556
- }
2557
- }
2558
- workerWebRTCOnMessage(t) {
2559
- const e = t.data;
2560
- "from" in e && "websocket" === e.from && "message" === e.payload.type && this.iceOnMessage(e.payload);
2561
- }
2562
- ice() {
2563
- this.workerWebRTC.addEventListener("message", this.workerWebRTCOnMessage.bind(this)), this.rtcPeerConnection.addEventListener("icecandidate", this.iceOnIceCandidate.bind(this));
2564
- }
2565
- deice() {
2566
- this.workerWebRTC.removeEventListener("message", this.workerWebRTCOnMessage.bind(this)), this.rtcPeerConnection.removeEventListener("icecandidate", this.iceOnIceCandidate);
2567
- }
2568
- addMouseEvents(t) {
2569
- let e, n = On.UP;
2570
- const l = (t2) => (l2) => {
2571
- const i3 = Dn[l2.button];
2572
- if (void 0 === i3) return;
2573
- const o2 = { type: "send", data: [JSON.stringify({ type: "modeling_cmd_req", cmd_id: "00000000-0000-0000-0000-000000000000", cmd: { type: _n[t2], interaction: i3, window: { x: l2.offsetX, y: l2.offsetY } } })] };
2574
- this.workerWebRTC.postMessage({ to: "websocket", payload: o2 }), this.channel?.send(o2.data[0]), e = l2.button, n = t2;
2575
- }, i2 = l(On.DOWN), o = l(On.UP), c = (t2) => {
2576
- const l2 = Dn[e];
2577
- if (void 0 === l2) return;
2578
- n = On.UP;
2579
- const i3 = { type: "send", data: [JSON.stringify({ type: "modeling_cmd_req", cmd_id: "00000000-0000-0000-0000-000000000000", cmd: { type: _n[n], interaction: l2, window: { x: t2.offsetX, y: t2.offsetY } } })] };
2580
- this.workerWebRTC.postMessage({ to: "websocket", payload: i3 }), this.channel?.send(i3.data[0]);
57
+ this.el = _ZooWebView.createElements({ size: sizeAdjusted });
58
+ const elVideo = this.el.querySelector("video");
59
+ if (elVideo === null) return;
60
+ elVideo.addEventListener("contextmenu", preventDefault);
61
+ const elStart = this.el.querySelector("div.start");
62
+ if (elStart === null) return;
63
+ const startZooWebRTC = () => {
64
+ const zooWebRTC = new zoo.WebRTC({
65
+ client: args.zooClient,
66
+ video_res_width: sizeAdjusted.width,
67
+ video_res_height: sizeAdjusted.height,
68
+ order_independent_transparency: true,
69
+ show_grid: true,
70
+ post_effect: "ssao",
71
+ fps: 30
72
+ });
73
+ zooWebRTC.addResizeObserver(this.el);
74
+ window.zoo?.kittycadWebViews?.filter((v) => ["running" /* Running */, "starting" /* Starting */].indexOf(v.state) >= 0).forEach((v) => v.deconstructor());
75
+ this.state = "starting" /* Starting */;
76
+ const onClose = () => {
77
+ this.deconstructor();
2581
78
  };
2582
- let a = 0;
2583
- const s = Qn(((t2) => {
2584
- n === On.DOWN && this.channel?.send(JSON.stringify({ type: "modeling_cmd_req", cmd_id: "00000000-0000-0000-0000-000000000000", cmd: { type: "camera_drag_move", interaction: Dn[e], window: { x: t2.offsetX, y: t2.offsetY } } })), a += 1, this.channel?.send(JSON.stringify({ type: "modeling_cmd_req", cmd_id: "00000000-0000-0000-0000-000000000000", cmd: { type: "mouse_move", sequence: a, window: { x: t2.offsetX, y: t2.offsetY } } }));
2585
- }), 1e3 / 30), d = Qn(((t2) => {
2586
- t2.preventDefault(), this.channel?.send(JSON.stringify({ type: "modeling_cmd_req", cmd_id: "00000000-0000-0000-0000-000000000000", cmd: { type: "default_camera_zoom", magnitude: -1 * Math.sign(t2.deltaY) * window.devicePixelRatio * 50 } }));
2587
- }), 1e3 / 30), b = (e2) => {
2588
- this.channel = e2.channel, t.addEventListener("pointerdown", i2), t.addEventListener("pointermove", s.fn), t.addEventListener("pointerup", o), t.addEventListener("pointerleave", c), t.addEventListener("wheel", d.fn, { passive: false });
79
+ zooWebRTC.addEventListener("close", onClose, { once: true });
80
+ const onTrack = (event) => {
81
+ if (!(event.target instanceof zoo.WebRTC)) return;
82
+ elVideo.srcObject = event.target.track?.streams[0] ?? null;
2589
83
  };
2590
- this.rtcPeerConnection.addEventListener("datachannel", b), this.removeMouseEvents = () => {
2591
- this.rtcPeerConnection.removeEventListener("datachannel", b), t.removeEventListener("pointerdown", i2), t.removeEventListener("pointermove", s.fn), clearInterval(s.intervalId), t.removeEventListener("pointerup", o), t.removeEventListener("pointerleave", c), t.removeEventListener("wheel", d.fn), clearInterval(d.intervalId);
84
+ zooWebRTC.addEventListener("track", onTrack, { once: true });
85
+ const onConnected = (_event) => {
86
+ void elVideo.play().catch(console.warn);
87
+ this.rtc = zooWebRTC;
88
+ this.state = "running" /* Running */;
89
+ this.dispatchEvent(new Event("ready"));
2592
90
  };
2593
- }
2594
- resize(t) {
2595
- window.requestAnimationFrame((() => {
2596
- this.send(JSON.stringify({ type: "modeling_cmd_req", cmd_id: "00000000-0000-0000-0000-000000000000", cmd: { type: "reconfigure_stream", ...t, fps: 30 } }));
2597
- }));
2598
- }
2599
- addResizeObserver(t) {
2600
- const e = t.querySelector("video"), n = Qn(((t2) => {
2601
- for (const n2 of t2) {
2602
- const t3 = n2.contentRect.width - n2.contentRect.width % 4, l2 = n2.contentRect.height - n2.contentRect.height % 4;
2603
- e.width = t3, e.height = l2, this.resize({ width: t3, height: l2 });
2604
- }
2605
- }), 62.5), l = new ResizeObserver(n.fn);
2606
- l.observe(t), this.removeResizeObserver = () => {
2607
- clearInterval(n.intervalId), l.disconnect();
2608
- };
2609
- }
2610
- send(...t) {
2611
- return new Promise(((e) => {
2612
- const n = (t2) => {
2613
- const l = t2.data;
2614
- "from" in l && "websocket" === l.from && (this.workerWebRTC.removeEventListener("message", n), e(l.payload.data));
2615
- };
2616
- this.workerWebRTC.addEventListener("message", n), this.workerWebRTC.postMessage({ to: "websocket", payload: { type: "send", data: t } });
2617
- }));
2618
- }
2619
- };
2620
-
2621
- // src/svg-zoo.ts
2622
- var svg_zoo_default = '<svg viewBox="0 -2 245 84" fill="none" xmlns="http://www.w3.org/2000/svg"><g><path fill="currentcolor" d="M49.1899 14.2024V1.75536H0.0079789V19.3089H44.4824L0.0159578 67.5334H0.0079789V67.5414L0 67.5493L0.0079789 67.5573V79.3501H11.4018L22.8755 66.903V79.3501H72.0574V61.7965H27.591L72.0574 13.5641V1.75536L60.6556 1.77131L49.1899 14.2024Z"></path><path fill="currentcolor" fill-rule="evenodd" clip-rule="evenodd" d="M116.723 17.5536C103.981 17.5536 93.6164 27.9182 93.6164 40.6605C93.6164 45.751 95.276 50.4665 98.0846 54.2884L86.0205 67.2781C79.8129 60.1369 76.0628 50.8256 76.0628 40.6605C76.0628 18.2398 94.3026 0 116.723 0C125.819 0 134.221 3.00007 141.003 8.06666L128.939 21.0563C125.396 18.8382 121.207 17.5536 116.723 17.5536ZM139.83 40.6605C139.83 35.5699 138.171 30.8544 135.37 27.0245L147.426 14.0349C153.634 21.176 157.384 30.4874 157.384 40.6605C157.384 63.0732 139.144 81.3129 116.723 81.3129C107.627 81.3129 99.2256 78.3129 92.4435 73.2542L104.516 60.2566C108.058 62.4748 112.239 63.7594 116.723 63.7594C129.466 63.7594 139.83 53.3948 139.83 40.6605Z"></path><path fill="currentcolor" fill-rule="evenodd" clip-rule="evenodd" d="M204.34 17.5536C191.597 17.5536 181.233 27.9182 181.233 40.6605C181.233 45.751 182.892 50.4665 185.701 54.2884L173.637 67.2781C167.429 60.1369 163.679 50.8256 163.679 40.6605C163.679 18.2398 181.919 0 204.34 0C213.435 0 221.837 3.00007 228.619 8.06666L216.555 21.0563C213.013 18.8382 208.824 17.5536 204.34 17.5536ZM222.986 27.0245L235.042 14.0349C241.25 21.176 245 30.4874 245 40.6605C245 63.0732 226.76 81.3129 204.34 81.3129C195.244 81.3129 186.842 78.3129 180.06 73.2542L192.132 60.2566C195.674 62.4748 199.855 63.7594 204.34 63.7594C217.082 63.7594 227.446 53.3948 227.446 40.6605C227.446 35.5699 225.787 30.8544 222.986 27.0245Z"></path></g></svg>';
2623
-
2624
- // src/index.ts
2625
- window.zoo ??= {};
2626
- window.zoo.kittycadWebViews ??= [];
2627
- var preventDefault = (e) => e.preventDefault();
2628
- var ZooWebView = class _ZooWebView extends EventTarget {
2629
- el;
2630
- rtc = void 0;
2631
- size;
2632
- state = "fresh" /* Fresh */;
2633
- constructor(args) {
2634
- super();
2635
- this.size = args.size;
2636
- const sizeAdjusted = {
2637
- width: args.size.width - args.size.width % 4,
2638
- height: args.size.height - args.size.height % 4
2639
- };
2640
- this.el = _ZooWebView.createElements({ size: sizeAdjusted });
2641
- const elVideo = this.el.querySelector("video");
2642
- if (elVideo === null) return;
2643
- elVideo.addEventListener("contextmenu", preventDefault);
2644
- const elStart = this.el.querySelector("div.start");
2645
- if (elStart === null) return;
2646
- const startZooWebRTC = () => {
2647
- const zooWebRTC = new An({
2648
- client: args.zooClient,
2649
- video_res_width: sizeAdjusted.width,
2650
- video_res_height: sizeAdjusted.height,
2651
- order_independent_transparency: true,
2652
- show_grid: true,
2653
- post_effect: "ssao",
2654
- fps: 30
2655
- });
2656
- zooWebRTC.addResizeObserver(this.el);
2657
- window.zoo?.kittycadWebViews?.filter((v2) => ["running" /* Running */, "starting" /* Starting */].indexOf(v2.state) >= 0).forEach((v2) => v2.deconstructor());
2658
- this.state = "starting" /* Starting */;
2659
- const onClose = () => {
2660
- this.deconstructor();
2661
- };
2662
- zooWebRTC.addEventListener("close", onClose, { once: true });
2663
- const onTrack = (event) => {
2664
- if (!(event.target instanceof An)) return;
2665
- elVideo.srcObject = event.target.track?.streams[0] ?? null;
2666
- };
2667
- zooWebRTC.addEventListener("track", onTrack, { once: true });
2668
- const onConnected = (_event) => {
2669
- void elVideo.play().catch(console.warn);
2670
- this.rtc = zooWebRTC;
2671
- this.state = "running" /* Running */;
2672
- this.dispatchEvent(new Event("ready"));
2673
- };
2674
- zooWebRTC.addMouseEvents(elVideo);
2675
- zooWebRTC.addEventListener("connected", onConnected, { once: true });
2676
- zooWebRTC.start();
2677
- };
2678
- this.state = "fresh" /* Fresh */;
2679
- window.zoo?.kittycadWebViews?.push(this);
2680
- const elStartClick = () => {
2681
- _ZooWebView.decoOn(sizeAdjusted, this.el, elStart);
2682
- startZooWebRTC();
2683
- };
2684
- elStart.addEventListener("click", elStartClick);
2685
- }
2686
- deconstructor() {
2687
- this.state = "killed" /* Killed */;
2688
- const elVideo = this.el.querySelector("video");
2689
- if (elVideo === null) return;
2690
- elVideo.pause();
2691
- const elStart = this.el.querySelector("div.start");
2692
- if (elStart === null) return;
2693
- _ZooWebView.decoOff(this.size, this.el, elStart);
2694
- return Promise.allSettled([
2695
- this.rtc?.deconstructor()
2696
- ]);
2697
- }
2698
- static decoOff(size, elZooWebView, elStart) {
2699
- elZooWebView.style.width = size.width.toString();
2700
- elZooWebView.style.height = size.height.toString();
2701
- elZooWebView.style.justifyContent = "center";
2702
- elZooWebView.style.alignItems = "center";
2703
- elZooWebView.style.cursor = "pointer";
2704
- elZooWebView.style.backgroundColor = "#1c1c1c";
2705
- elStart.style.paddingTop = "";
2706
- elStart.style.paddingRight = "";
2707
- elStart.style.width = (size.width / 2).toString();
2708
- elStart.style.position = "absolute";
2709
- elStart.style.color = "hsl(154deg 100% 25%)";
2710
- }
2711
- static decoOn(size, elZooWebView, elStart) {
2712
- elZooWebView.style.justifyContent = "right";
2713
- elZooWebView.style.alignItems = "flex-start";
2714
- elStart.style.width = (size.width / 4).toString();
2715
- elStart.style.color = "hsl(154deg 100% 58%)";
2716
- elStart.style.paddingTop = "0.5em";
2717
- elStart.style.paddingRight = "0.5em";
2718
- }
2719
- static createElements(args) {
2720
- const elZooWebView = document.createElement("div");
2721
- const elVideo = document.createElement("video");
2722
- const elStart = document.createElement("div");
2723
- elStart.classList.add("start");
2724
- elStart.innerHTML = svg_zoo_default;
2725
- elVideo.width = args.size.width - args.size.width % 4;
2726
- elVideo.height = args.size.height - args.size.height % 4;
2727
- elZooWebView.style.display = "flex";
2728
- elZooWebView.style.overflow = "auto";
2729
- elZooWebView.style.overscrollBehavior = "contain";
2730
- _ZooWebView.decoOff(args.size, elZooWebView, elStart);
2731
- elZooWebView.appendChild(elVideo);
2732
- elZooWebView.appendChild(elStart);
2733
- return elZooWebView;
2734
- }
2735
- };
2736
- return __toCommonJS(index_exports);
2737
- })();
91
+ zooWebRTC.addMouseEvents(elVideo);
92
+ zooWebRTC.addEventListener("connected", onConnected, { once: true });
93
+ zooWebRTC.start();
94
+ };
95
+ this.state = "fresh" /* Fresh */;
96
+ window.zoo?.kittycadWebViews?.push(this);
97
+ const elStartClick = () => {
98
+ _ZooWebView.decoOn(sizeAdjusted, this.el, elStart);
99
+ startZooWebRTC();
100
+ };
101
+ elStart.addEventListener("click", elStartClick);
102
+ }
103
+ deconstructor() {
104
+ this.state = "killed" /* Killed */;
105
+ const elVideo = this.el.querySelector("video");
106
+ if (elVideo === null) return;
107
+ elVideo.pause();
108
+ const elStart = this.el.querySelector("div.start");
109
+ if (elStart === null) return;
110
+ _ZooWebView.decoOff(this.size, this.el, elStart);
111
+ return Promise.allSettled([
112
+ this.rtc?.deconstructor()
113
+ ]);
114
+ }
115
+ static decoOff(size, elZooWebView, elStart) {
116
+ elZooWebView.style.width = size.width.toString();
117
+ elZooWebView.style.height = size.height.toString();
118
+ elZooWebView.style.justifyContent = "center";
119
+ elZooWebView.style.alignItems = "center";
120
+ elZooWebView.style.cursor = "pointer";
121
+ elZooWebView.style.backgroundColor = "#1c1c1c";
122
+ elStart.style.paddingTop = "";
123
+ elStart.style.paddingRight = "";
124
+ elStart.style.width = (size.width / 2).toString();
125
+ elStart.style.position = "absolute";
126
+ elStart.style.color = "hsl(154deg 100% 25%)";
127
+ }
128
+ static decoOn(size, elZooWebView, elStart) {
129
+ elZooWebView.style.justifyContent = "right";
130
+ elZooWebView.style.alignItems = "flex-start";
131
+ elStart.style.width = (size.width / 4).toString();
132
+ elStart.style.color = "hsl(154deg 100% 58%)";
133
+ elStart.style.paddingTop = "0.5em";
134
+ elStart.style.paddingRight = "0.5em";
135
+ }
136
+ static createElements(args) {
137
+ const elZooWebView = document.createElement("div");
138
+ const elVideo = document.createElement("video");
139
+ const elStart = document.createElement("div");
140
+ elStart.classList.add("start");
141
+ elStart.innerHTML = svg_zoo_default;
142
+ elVideo.width = args.size.width - args.size.width % 4;
143
+ elVideo.height = args.size.height - args.size.height % 4;
144
+ elZooWebView.style.display = "flex";
145
+ elZooWebView.style.overflow = "auto";
146
+ elZooWebView.style.overscrollBehavior = "contain";
147
+ _ZooWebView.decoOff(args.size, elZooWebView, elStart);
148
+ elZooWebView.appendChild(elVideo);
149
+ elZooWebView.appendChild(elStart);
150
+ return elZooWebView;
151
+ }
152
+ };
153
+ //# sourceMappingURL=index.js.map