socket-function 1.1.49 → 1.2.1

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 (53) hide show
  1. package/SocketFunction.d.ts +1 -1
  2. package/SocketFunctionTypes.d.ts +1 -1
  3. package/dist/SetProcessVariables.ts.cache +9 -0
  4. package/dist/SocketFunction.ts.cache +467 -0
  5. package/hot/HotReloadController.d.ts +3 -3
  6. package/hot/dist/HotReloadController.ts.cache +252 -0
  7. package/index.d.ts +10 -25
  8. package/package.json +1 -1
  9. package/require/CSSShim.d.ts +1 -1
  10. package/require/RequireController.d.ts +2 -2
  11. package/require/compileFlags.d.ts +1 -1
  12. package/require/dist/RequireController.ts.cache +386 -0
  13. package/require/dist/compileFlags.ts.cache +41 -0
  14. package/require/dist/extMapper.ts.cache +368 -0
  15. package/require/dist/require.ts.cache +676 -0
  16. package/require/require.d.ts +1 -1
  17. package/src/JSONLACKS/dist/JSONLACKS.ts.cache +469 -0
  18. package/src/callManager.d.ts +1 -1
  19. package/src/dist/CallFactory.ts.cache +930 -0
  20. package/src/dist/Zip.ts.cache +156 -0
  21. package/src/dist/batching.ts.cache +377 -0
  22. package/src/dist/bits.ts.cache +121 -0
  23. package/src/dist/buffers.ts.cache +76 -0
  24. package/src/dist/caching.ts.cache +302 -0
  25. package/src/dist/callHTTPHandler.ts.cache +264 -0
  26. package/src/dist/callManager.ts.cache +159 -0
  27. package/src/dist/certStore.ts.cache +59 -0
  28. package/src/dist/createSingleton.ts.cache +62 -0
  29. package/src/dist/fixLargeNetworkCalls.ts.cache +17 -0
  30. package/src/dist/forwardPort.ts.cache +222 -0
  31. package/src/dist/https.ts.cache +141 -0
  32. package/src/dist/misc.ts.cache +499 -0
  33. package/src/dist/nodeCache.ts.cache +136 -0
  34. package/src/dist/nodeProxy.ts.cache +57 -0
  35. package/src/dist/protocolNegotiation.ts.cache +101 -0
  36. package/src/dist/tlsParsing.ts.cache +85 -0
  37. package/src/dist/types.ts.cache +9 -0
  38. package/src/dist/webSocketServer.ts.cache +365 -0
  39. package/src/dist/websocketFactory.ts.cache +53 -0
  40. package/src/formatting/dist/colors.ts.cache +98 -0
  41. package/src/formatting/dist/format.ts.cache +396 -0
  42. package/src/formatting/dist/logColors.ts.cache +28 -0
  43. package/src/lz4/dist/LZ4.ts.cache +53 -0
  44. package/src/profiling/dist/getOwnTime.ts.cache +100 -0
  45. package/src/profiling/dist/measure.ts.cache +338 -0
  46. package/src/profiling/dist/stats.ts.cache +202 -0
  47. package/src/profiling/dist/statsFormat.ts.cache +45 -0
  48. package/src/profiling/getOwnTime.ts +7 -1
  49. package/src/profiling/measure.ts +25 -16
  50. package/test.ts +11 -5
  51. package/time/dist/trueTimeShim.ts.cache +656 -0
  52. package/time/trueTimeShim.d.ts +1 -16
  53. package/time/trueTimeShim.ts +7 -43
@@ -0,0 +1,156 @@
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
31
+ var __importDefault = (this && this.__importDefault) || function (mod) {
32
+ return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
35
+ exports.Zip = void 0;
36
+ const misc_1 = require("./misc");
37
+ const measure_1 = require("./profiling/measure");
38
+ const zlib_1 = __importDefault(require("zlib"));
39
+ const pako = __importStar(require("pako"));
40
+ const compileFlags_1 = require("../require/compileFlags");
41
+ (0, compileFlags_1.setFlag)(require, "pako", "allowclient", true);
42
+ const SYNC_THRESHOLD_BYTES = 100000000;
43
+ const ZIP_SYNC_THRESHOLD_BYTES = 10000000;
44
+ // IMPORTANT! If this is slow, add a LZ4 version, which uses lz4-wasm-nodejs. This should be about 10X faster in both dcompression and decompression, only using 50% more space (which isn't great, but... if it is lagging the main thread it might be worth it).
45
+ class Zip {
46
+ static async gzip(buffer, level) {
47
+ if (buffer.length < ZIP_SYNC_THRESHOLD_BYTES) {
48
+ return this.gzipSync(buffer, level);
49
+ }
50
+ if ((0, misc_1.isNode)()) {
51
+ return new Promise((resolve, reject) => {
52
+ zlib_1.default.gzip(buffer, { level }, (err, result) => {
53
+ if (err)
54
+ reject(err);
55
+ else
56
+ resolve(result);
57
+ });
58
+ });
59
+ }
60
+ else {
61
+ // @ts-ignore
62
+ return await doStream(new CompressionStream("gzip"), buffer);
63
+ }
64
+ }
65
+ static gzipSync(buffer, level) {
66
+ if ((0, misc_1.isNode)() && buffer.length < ZIP_SYNC_THRESHOLD_BYTES) {
67
+ return Buffer.from(zlib_1.default.gzipSync(buffer, { level }));
68
+ }
69
+ return Buffer.from(pako.gzip(buffer));
70
+ }
71
+ static gunzip(buffer) {
72
+ return this.gunzipUntracked(buffer);
73
+ }
74
+ static async gunzipAsyncBase(buffer) {
75
+ return this.gunzipUntracked(buffer);
76
+ }
77
+ static gunzipSync(buffer) {
78
+ return this.gunzipUntrackedSync(buffer);
79
+ }
80
+ static async gunzipBatch(buffers) {
81
+ let time = Date.now();
82
+ buffers = await Promise.all(buffers.map(x => {
83
+ return this.gunzipUntracked(x);
84
+ }));
85
+ time = Date.now() - time;
86
+ // let totalSize = buffers.reduce((acc, buffer) => acc + buffer.length, 0);
87
+ //console.log(`Gunzip ${formatNumber(totalSize)}B at ${formatNumber(totalSize / time * 1000)}B/s`);
88
+ return buffers;
89
+ }
90
+ static gunzipUntracked(buffer) {
91
+ // Switch to the synchronous version if the buffer is small. This is a lot faster in Node.js and clientside.
92
+ // - On tests of random small amounts of data, this seems to be up to 7X faster (on node). However, on non-random data, on the actual data we're using, it seems to be almost 50 times faster. So... definitely worth it...
93
+ if (buffer.length < SYNC_THRESHOLD_BYTES) {
94
+ let time = Date.now();
95
+ let result = Zip.gunzipUntrackedSync(buffer);
96
+ let duration = Date.now() - time;
97
+ if (duration > 50) {
98
+ // Wait, so we don't lock up the main thread. And if we already wait it 50ms, then waiting for one frame is marginal, even client-side.
99
+ return ((async () => {
100
+ await new Promise(resolve => setTimeout(resolve, 0));
101
+ return result;
102
+ }))();
103
+ }
104
+ return result;
105
+ }
106
+ if ((0, misc_1.isNode)()) {
107
+ return doStream(new DecompressionStream("gzip"), buffer);
108
+ }
109
+ else {
110
+ return Zip.gunzipUntrackedSync(buffer);
111
+ }
112
+ }
113
+ static gunzipUntrackedSync(buffer) {
114
+ if ((0, misc_1.isNode)() && buffer.length < ZIP_SYNC_THRESHOLD_BYTES) {
115
+ return Buffer.from(zlib_1.default.gunzipSync(buffer));
116
+ }
117
+ return Buffer.from(pako.ungzip(buffer));
118
+ }
119
+ }
120
+ exports.Zip = Zip;
121
+ __decorate([
122
+ measure_1.measureFnc
123
+ ], Zip, "gzip", null);
124
+ __decorate([
125
+ measure_1.measureFnc
126
+ ], Zip, "gzipSync", null);
127
+ __decorate([
128
+ measure_1.measureFnc
129
+ ], Zip, "gunzip", null);
130
+ __decorate([
131
+ measure_1.measureFnc
132
+ ], Zip, "gunzipAsyncBase", null);
133
+ __decorate([
134
+ measure_1.measureFnc
135
+ ], Zip, "gunzipSync", null);
136
+ __decorate([
137
+ measure_1.measureFnc
138
+ ], Zip, "gunzipBatch", null);
139
+ async function doStream(stream, buffer) {
140
+ let reader = stream.readable.getReader();
141
+ let writer = stream.writable.getWriter();
142
+ let writePromise = writer.write(buffer);
143
+ let closePromise = writer.close();
144
+ let outputBuffers = [];
145
+ while (true) {
146
+ let { value, done } = await reader.read();
147
+ if (done) {
148
+ await writePromise;
149
+ await closePromise;
150
+ return Buffer.concat(outputBuffers);
151
+ }
152
+ outputBuffers.push(Buffer.from(value));
153
+ }
154
+ }
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmlwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiWmlwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaUNBQWdDO0FBQ2hDLGlEQUFpRDtBQUNqRCxnREFBd0I7QUFDeEIsMkNBQTZCO0FBRTdCLDBEQUFrRDtBQUVsRCxJQUFBLHNCQUFPLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFOUMsTUFBTSxvQkFBb0IsR0FBRyxTQUFXLENBQUM7QUFDekMsTUFBTSx3QkFBd0IsR0FBRyxRQUFVLENBQUM7QUFFNUMsa1FBQWtRO0FBQ2xRLE1BQWEsR0FBRztJQUVRLEFBQWIsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBYyxFQUFFLEtBQWM7UUFDbkQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLHdCQUF3QixFQUFFLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsSUFBSSxJQUFBLGFBQU0sR0FBRSxFQUFFLENBQUM7WUFDWCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNuQyxjQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBUSxFQUFFLE1BQWMsRUFBRSxFQUFFO29CQUN0RCxJQUFJLEdBQUc7d0JBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzt3QkFDaEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN6QixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSixhQUFhO1lBQ2IsT0FBTyxNQUFNLFFBQVEsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FB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Q0FBQztBQUVMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwiLi9taXNjXCI7XG5pbXBvcnQgeyBtZWFzdXJlRm5jIH0gZnJvbSBcIi4vcHJvZmlsaW5nL21lYXN1cmVcIjtcbmltcG9ydCB6bGliIGZyb20gXCJ6bGliXCI7XG5pbXBvcnQgKiBhcyBwYWtvIGZyb20gXCJwYWtvXCI7XG5cbmltcG9ydCB7IHNldEZsYWcgfSBmcm9tIFwiLi4vcmVxdWlyZS9jb21waWxlRmxhZ3NcIjtcbmltcG9ydCB7IE1heWJlUHJvbWlzZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5zZXRGbGFnKHJlcXVpcmUsIFwicGFrb1wiLCBcImFsbG93Y2xpZW50XCIsIHRydWUpO1xuXG5jb25zdCBTWU5DX1RIUkVTSE9MRF9CWVRFUyA9IDEwMF8wMDBfMDAwO1xuY29uc3QgWklQX1NZTkNfVEhSRVNIT0xEX0JZVEVTID0gMTBfMDAwXzAwMDtcblxuLy8gSU1QT1JUQU5UISBJZiB0aGlzIGlzIHNsb3csIGFkZCBhIExaNCB2ZXJzaW9uLCB3aGljaCB1c2VzIGx6NC13YXNtLW5vZGVqcy4gVGhpcyBzaG91bGQgYmUgYWJvdXQgMTBYIGZhc3RlciBpbiBib3RoIGRjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiwgb25seSB1c2luZyA1MCUgbW9yZSBzcGFjZSAod2hpY2ggaXNuJ3QgZ3JlYXQsIGJ1dC4uLiBpZiBpdCBpcyBsYWdnaW5nIHRoZSBtYWluIHRocmVhZCBpdCBtaWdodCBiZSB3b3J0aCBpdCkuXG5leHBvcnQgY2xhc3MgWmlwIHtcbiAgICBAbWVhc3VyZUZuY1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ3ppcChidWZmZXI6IEJ1ZmZlciwgbGV2ZWw/OiBudW1iZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IFpJUF9TWU5DX1RIUkVTSE9MRF9CWVRFUykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3ppcFN5bmMoYnVmZmVyLCBsZXZlbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTm9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHpsaWIuZ3ppcChidWZmZXIsIHsgbGV2ZWwgfSwgKGVycjogYW55LCByZXN1bHQ6IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkb1N0cmVhbShuZXcgQ29tcHJlc3Npb25TdHJlYW0oXCJnemlwXCIpLCBidWZmZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIEBtZWFzdXJlRm5jXG4gICAgcHVibGljIHN0YXRpYyBnemlwU3luYyhidWZmZXI6IEJ1ZmZlciwgbGV2ZWw/OiBudW1iZXIpOiBCdWZmZXIge1xuICAgICAgICBpZiAoaXNOb2RlKCkgJiYgYnVmZmVyLmxlbmd0aCA8IFpJUF9TWU5DX1RIUkVTSE9MRF9CWVRFUykge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHpsaWIuZ3ppcFN5bmMoYnVmZmVyLCB7IGxldmVsIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20ocGFrby5nemlwKGJ1ZmZlcikpO1xuICAgIH1cblxuICAgIEBtZWFzdXJlRm5jXG4gICAgcHVibGljIHN0YXRpYyBndW56aXAoYnVmZmVyOiBCdWZmZXIpOiBNYXliZVByb21pc2U8QnVmZmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1bnppcFVudHJhY2tlZChidWZmZXIpO1xuICAgIH1cbiAgICBAbWVhc3VyZUZuY1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ3VuemlwQXN5bmNCYXNlKGJ1ZmZlcjogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VuemlwVW50cmFja2VkKGJ1ZmZlcik7XG4gICAgfVxuXG4gICAgQG1lYXN1cmVGbmNcbiAgICBwdWJsaWMgc3RhdGljIGd1bnppcFN5bmMoYnVmZmVyOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5ndW56aXBVbnRyYWNrZWRTeW5jKGJ1ZmZlcik7XG4gICAgfVxuXG4gICAgQG1lYXN1cmVGbmNcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGd1bnppcEJhdGNoKGJ1ZmZlcnM6IEJ1ZmZlcltdKTogUHJvbWlzZTxCdWZmZXJbXT4ge1xuICAgICAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGJ1ZmZlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChidWZmZXJzLm1hcCh4ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmd1bnppcFVudHJhY2tlZCh4KTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aW1lID0gRGF0ZS5ub3coKSAtIHRpbWU7XG4gICAgICAgIC8vIGxldCB0b3RhbFNpemUgPSBidWZmZXJzLnJlZHVjZSgoYWNjLCBidWZmZXIpID0+IGFjYyArIGJ1ZmZlci5sZW5ndGgsIDApO1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBHdW56aXAgJHtmb3JtYXROdW1iZXIodG90YWxTaXplKX1CIGF0ICR7Zm9ybWF0TnVtYmVyKHRvdGFsU2l6ZSAvIHRpbWUgKiAxMDAwKX1CL3NgKTtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcnM7XG4gICAgfVxuXG5cblxuICAgIHB1YmxpYyBzdGF0aWMgZ3VuemlwVW50cmFja2VkKGJ1ZmZlcjogQnVmZmVyKTogTWF5YmVQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICAvLyBTd2l0Y2ggdG8gdGhlIHN5bmNocm9ub3VzIHZlcnNpb24gaWYgdGhlIGJ1ZmZlciBpcyBzbWFsbC4gVGhpcyBpcyBhIGxvdCBmYXN0ZXIgaW4gTm9kZS5qcyBhbmQgY2xpZW50c2lkZS5cbiAgICAgICAgLy8gIC0gT24gdGVzdHMgb2YgcmFuZG9tIHNtYWxsIGFtb3VudHMgb2YgZGF0YSwgdGhpcyBzZWVtcyB0byBiZSB1cCB0byA3WCBmYXN0ZXIgKG9uIG5vZGUpLiBIb3dldmVyLCBvbiBub24tcmFuZG9tIGRhdGEsIG9uIHRoZSBhY3R1YWwgZGF0YSB3ZSdyZSB1c2luZywgaXQgc2VlbXMgdG8gYmUgYWxtb3N0IDUwIHRpbWVzIGZhc3Rlci4gU28uLi4gZGVmaW5pdGVseSB3b3J0aCBpdC4uLlxuICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IFNZTkNfVEhSRVNIT0xEX0JZVEVTKSB7XG4gICAgICAgICAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gWmlwLmd1bnppcFVudHJhY2tlZFN5bmMoYnVmZmVyKTtcbiAgICAgICAgICAgIGxldCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSB0aW1lO1xuICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gNTApIHtcbiAgICAgICAgICAgICAgICAvLyBXYWl0LCBzbyB3ZSBkb24ndCBsb2NrIHVwIHRoZSBtYWluIHRocmVhZC4gQW5kIGlmIHdlIGFscmVhZHkgd2FpdCBpdCA1MG1zLCB0aGVuIHdhaXRpbmcgZm9yIG9uZSBmcmFtZSBpcyBtYXJnaW5hbCwgZXZlbiBjbGllbnQtc2lkZS4gXG4gICAgICAgICAgICAgICAgcmV0dXJuICgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH0pKSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBkb1N0cmVhbShuZXcgRGVjb21wcmVzc2lvblN0cmVhbShcImd6aXBcIiksIGJ1ZmZlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gWmlwLmd1bnppcFVudHJhY2tlZFN5bmMoYnVmZmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGd1bnppcFVudHJhY2tlZFN5bmMoYnVmZmVyOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgICAgICBpZiAoaXNOb2RlKCkgJiYgYnVmZmVyLmxlbmd0aCA8IFpJUF9TWU5DX1RIUkVTSE9MRF9CWVRFUykge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHpsaWIuZ3VuemlwU3luYyhidWZmZXIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20ocGFrby51bmd6aXAoYnVmZmVyKSk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkb1N0cmVhbShzdHJlYW06IEdlbmVyaWNUcmFuc2Zvcm1TdHJlYW0sIGJ1ZmZlcjogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBsZXQgcmVhZGVyID0gc3RyZWFtLnJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgIGxldCB3cml0ZXIgPSBzdHJlYW0ud3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgbGV0IHdyaXRlUHJvbWlzZSA9IHdyaXRlci53cml0ZShidWZmZXIpO1xuICAgIGxldCBjbG9zZVByb21pc2UgPSB3cml0ZXIuY2xvc2UoKTtcblxuICAgIGxldCBvdXRwdXRCdWZmZXJzOiBCdWZmZXJbXSA9IFtdO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGxldCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVQcm9taXNlO1xuICAgICAgICAgICAgYXdhaXQgY2xvc2VQcm9taXNlO1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQob3V0cHV0QnVmZmVycyk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0QnVmZmVycy5wdXNoKEJ1ZmZlci5mcm9tKHZhbHVlKSk7XG4gICAgfVxuXG59Il19
156
+ /* _JS_SOURCE_HASH = "09b1b496be1d6f5cbcff6c1d73b1d1389ec6bd46eedf3b8fb71cbea47aa26dde"; */
@@ -0,0 +1,377 @@
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ //exports.safeLoop = exports.unblockLoop = exports.throttledLoop = exports.retryFunctional = exports.shutdownPolling = exports.runInfinitePollCallAtStart = exports.runInfinitePoll = exports.runInParallel = exports.runInSerial = exports.batchFunction = exports.batchFunctionNone = exports.delay = void 0;
4
+ const format_1 = require("./formatting/format");
5
+ const logColors_1 = require("./formatting/logColors");
6
+ const misc_1 = require("./misc");
7
+ const measure_1 = require("./profiling/measure");
8
+ function delay(delayTime,
9
+ // Delays < 10ms become "immediate"
10
+ immediateShortDelays) {
11
+ if (delayTime === "afterio") {
12
+ return new Promise(resolve => setImmediate(resolve));
13
+ }
14
+ else if (delayTime === "afterpromises") {
15
+ // NOTE: We use a promise here as it might be a bit easier to debug than queueMicrotask.
16
+ // It is equivalent though...
17
+ return Promise.resolve();
18
+ }
19
+ else if (delayTime === "immediate") {
20
+ if ((0, misc_1.isNode)()) {
21
+ return new Promise(resolve => setImmediate(resolve));
22
+ }
23
+ else {
24
+ return delay("afterpromises");
25
+ }
26
+ }
27
+ else if (delayTime === "paintLoop") {
28
+ if ((0, misc_1.isNode)()) {
29
+ return delay("immediate");
30
+ }
31
+ return (async () => {
32
+ await new Promise(resolve => requestAnimationFrame(resolve));
33
+ })();
34
+ }
35
+ else if (delayTime === "afterPaint") {
36
+ if ((0, misc_1.isNode)()) {
37
+ return delay("immediate");
38
+ }
39
+ else {
40
+ return (async () => {
41
+ await new Promise(resolve => requestAnimationFrame(resolve));
42
+ // Before first paint
43
+ await new Promise(resolve => requestAnimationFrame(resolve));
44
+ // After first paint
45
+ })();
46
+ }
47
+ }
48
+ else {
49
+ if (delayTime < 10 && immediateShortDelays) {
50
+ // NOTE: setTimeout can't wait this short of a time, so just setImmediate. This should be hard to distinguish
51
+ // anyways, as setImmediate (at least in nodejs), should happen after io, so... it should just work
52
+ // (the only difference is there will be less unnecessary delay).
53
+ // NOTE: THIS DOES break certain cases where io is depending on true delay, and by only waiting a microtick
54
+ // we don't give it a chance. But... we should just handle those cases explicitly, via an explicit "afterio".
55
+ return delay("immediate");
56
+ }
57
+ // NOTE: We check Date.now() and wait longer if setTimeout didn't wait long enough.
58
+ return (async () => {
59
+ let targetTime = Date.now() + delayTime;
60
+ while (true) {
61
+ let timeToWait = targetTime - Date.now();
62
+ await new Promise(resolve => setTimeout(resolve, timeToWait));
63
+ if (Date.now() >= targetTime) {
64
+ break;
65
+ }
66
+ }
67
+ })();
68
+ }
69
+ }
70
+ exports.delay = delay;
71
+ // NOTE: This is an easy way to turn off batching, without having to strip the extra batch handling code
72
+ function batchFunctionNone(config, fnc) {
73
+ return async (arg) => fnc([arg]);
74
+ }
75
+ exports.batchFunctionNone = batchFunctionNone;
76
+ function batchFunction(config, fnc) {
77
+ if (!config.noMeasure) {
78
+ fnc = (0, measure_1.measureWrap)(fnc, config.name);
79
+ }
80
+ let prevPromise;
81
+ let batching;
82
+ let curDelay = config.delay;
83
+ let delayRamp = 0;
84
+ if (config.throttleWindow && typeof curDelay === "number") {
85
+ delayRamp = curDelay / (config.throttleWindow / curDelay);
86
+ }
87
+ let delayTime = 0;
88
+ if (typeof curDelay === "number") {
89
+ delayTime = curDelay;
90
+ }
91
+ let countSinceBreak = 0;
92
+ let lastCall = 0;
93
+ return arg => {
94
+ let now = Date.now();
95
+ if (delayRamp) {
96
+ // The time since the last call (started) is how much budget we will have received to
97
+ // run values. If it is === delayTime, then we subtract 1, as we are right on track.
98
+ // If it is > delayTime, then we are running below the rate, so it is fine.
99
+ // If it is < delayTime, we are running too fast, and have to slow down.
100
+ let savedCount = (now - lastCall) / delayTime;
101
+ if (savedCount >= 1) {
102
+ countSinceBreak -= savedCount;
103
+ }
104
+ if (countSinceBreak < 0) {
105
+ countSinceBreak = 0;
106
+ }
107
+ countSinceBreak++;
108
+ // Set the max fairly high, as we basically ignore small delay times, so we need a high max to allow
109
+ // our delay to even apply!
110
+ curDelay = Math.min(delayTime * 20, delayRamp * countSinceBreak);
111
+ }
112
+ lastCall = now;
113
+ if (batching) {
114
+ batching.args.push(arg);
115
+ return batching.promise;
116
+ }
117
+ let curPrevPromise = prevPromise;
118
+ let args = [arg];
119
+ let promise = Promise.resolve().then(async () => {
120
+ // Ignore the error. New callers don't care about errors in previous calls,
121
+ // as they are unrelated to the current call, and just break valid calls
122
+ // due to invalid calls.
123
+ try {
124
+ await curPrevPromise;
125
+ }
126
+ catch (_a) { }
127
+ await delay(curDelay, "immediateShortDelays");
128
+ // Reset batching, as we once we start the function we can't accept args. `prevPromise` will block
129
+ // the next batch from starting before we finish.
130
+ batching = undefined;
131
+ return await fnc(args);
132
+ });
133
+ batching = { args, promise, };
134
+ prevPromise = batching.promise;
135
+ return promise;
136
+ };
137
+ }
138
+ exports.batchFunction = batchFunction;
139
+ function runInSerial(fnc) {
140
+ let updateQueue = [];
141
+ return (async function runInSerial(...args) {
142
+ var _a;
143
+ let promise = {
144
+ promise: null,
145
+ resolve: () => { },
146
+ };
147
+ promise.promise = new Promise(resolve => {
148
+ promise.resolve = resolve;
149
+ });
150
+ const queueWasEmpty = updateQueue.length === 0;
151
+ if (queueWasEmpty) {
152
+ promise.resolve();
153
+ }
154
+ updateQueue.push(promise);
155
+ await promise.promise;
156
+ try {
157
+ return await fnc(...args);
158
+ }
159
+ finally {
160
+ // Pop ourself off
161
+ updateQueue.shift();
162
+ // Resolve the next promise
163
+ (_a = updateQueue[0]) === null || _a === void 0 ? void 0 : _a.resolve();
164
+ }
165
+ });
166
+ }
167
+ exports.runInSerial = runInSerial;
168
+ function runInParallel(config, fnc) {
169
+ let queued = [];
170
+ let runningCount = 0;
171
+ function runIfNeeded() {
172
+ if (runningCount >= config.parallelCount) {
173
+ return;
174
+ }
175
+ const queuedObj = queued.shift();
176
+ if (!queuedObj)
177
+ return;
178
+ queuedObj.result.resolve((async () => {
179
+ runningCount++;
180
+ try {
181
+ if (config.callTimeout) {
182
+ return await (0, misc_1.timeoutToError)(config.callTimeout, fnc(...queuedObj.parameters), () => new Error(`Parallel call timed out for fnc ${fnc.name}`));
183
+ }
184
+ else {
185
+ return await fnc(...queuedObj.parameters);
186
+ }
187
+ }
188
+ finally {
189
+ runningCount--;
190
+ runIfNeeded();
191
+ }
192
+ })());
193
+ }
194
+ function parallelCall(...args) {
195
+ queued.push({
196
+ parameters: args,
197
+ result: new misc_1.PromiseObj(),
198
+ });
199
+ let queuedObj = queued[queued.length - 1];
200
+ runIfNeeded();
201
+ return queuedObj.result.promise;
202
+ }
203
+ return parallelCall;
204
+ }
205
+ exports.runInParallel = runInParallel;
206
+ let pollingRunning = true;
207
+ let pendingPolls = new Set();
208
+ function runInfinitePoll(delayTime, fnc, stopObj) {
209
+ void (async () => {
210
+ while (!(stopObj === null || stopObj === void 0 ? void 0 : stopObj.stop) && pollingRunning) {
211
+ await delay(delayTime);
212
+ if (!pollingRunning)
213
+ break;
214
+ await runPollFnc(fnc);
215
+ }
216
+ })();
217
+ }
218
+ exports.runInfinitePoll = runInfinitePoll;
219
+ async function runInfinitePollCallAtStart(delayTime, fnc, stopObj) {
220
+ try {
221
+ return await fnc();
222
+ }
223
+ finally {
224
+ void (async () => {
225
+ while (!(stopObj === null || stopObj === void 0 ? void 0 : stopObj.stop) && pollingRunning) {
226
+ await delay(delayTime);
227
+ if (!pollingRunning)
228
+ break;
229
+ await runPollFnc(fnc);
230
+ }
231
+ })();
232
+ }
233
+ }
234
+ exports.runInfinitePollCallAtStart = runInfinitePollCallAtStart;
235
+ async function runPollFnc(fnc) {
236
+ let promise = (async () => {
237
+ try {
238
+ return await fnc();
239
+ }
240
+ catch (e) {
241
+ console.error(`Error in infinite poll ${fnc.name || fnc.toString().slice(0, 100)} (continuing poll loop)\n${e.stack}`);
242
+ }
243
+ })();
244
+ pendingPolls.add(promise);
245
+ await promise;
246
+ pendingPolls.delete(promise);
247
+ }
248
+ /** Disables polling, called on shutdown. Blocks until all pending poll loops finish */
249
+ async function shutdownPolling() {
250
+ pollingRunning = false;
251
+ await Promise.all(Array.from(pendingPolls));
252
+ }
253
+ exports.shutdownPolling = shutdownPolling;
254
+ const DEFAULT_RETRY_DELAY = 5000;
255
+ const DEFAULT_MAX_RETRIES = 3;
256
+ function retryFunctional(fnc, config) {
257
+ let { maxRetries = DEFAULT_MAX_RETRIES, shouldRetry, minDelay = DEFAULT_RETRY_DELAY, maxDelay = DEFAULT_RETRY_DELAY, timeout, warningInterval, } = config || {};
258
+ let expFactor = Math.max(1, Math.log(maxDelay / minDelay) / Math.log(Math.max(maxRetries, 2)));
259
+ let name = fnc.name || fnc.toString().slice(0, 100);
260
+ async function runFnc(args, retries) {
261
+ try {
262
+ let promise = fnc(...args);
263
+ if (timeout !== undefined) {
264
+ promise = (0, misc_1.timeoutToError)(timeout, promise, () => new Error(`timed out after ${(0, format_1.formatTime)(timeout)}`));
265
+ }
266
+ if (warningInterval !== undefined) {
267
+ promise = (0, misc_1.watchSlowPromise)(name, promise, { interval: warningInterval });
268
+ }
269
+ return await promise;
270
+ }
271
+ catch (e) {
272
+ if (shouldRetry && !shouldRetry(String(e.stack))) {
273
+ throw e;
274
+ }
275
+ if (retries < 0)
276
+ throw e;
277
+ retries--;
278
+ console.warn(`Retrying ${name} (${retries}/${maxRetries} left), due to error ${String(e.stack)}`);
279
+ let curCount = maxRetries - retries;
280
+ await delay(minDelay * expFactor ** curCount);
281
+ return runFnc(args, retries);
282
+ }
283
+ }
284
+ return async function (...args) {
285
+ return await runFnc(args, maxRetries);
286
+ };
287
+ }
288
+ exports.retryFunctional = retryFunctional;
289
+ /** @deprecated Use safeLoop instead */
290
+ exports.throttledLoop = unblockLoop;
291
+ /** @deprecated Use safeLoop instead */
292
+ async function unblockLoop(config, fnc) {
293
+ var _a, _b;
294
+ let data = Array.isArray(config) ? config : config.data;
295
+ let maxBlockingTime = 300;
296
+ let backOffTime = 50;
297
+ if (!Array.isArray(config)) {
298
+ maxBlockingTime = (_a = config.maxBlockingTime) !== null && _a !== void 0 ? _a : 300;
299
+ backOffTime = (_b = config.backOffTime) !== null && _b !== void 0 ? _b : 50;
300
+ }
301
+ let lastYieldTime = Date.now();
302
+ let results = [];
303
+ for (let item of data) {
304
+ let result = fnc(item);
305
+ // If the function returns a promise, await it
306
+ if (result && typeof result === "object" && "then" in result) {
307
+ result = await result;
308
+ }
309
+ results.push(result);
310
+ // Check if we've been blocking for too long
311
+ if (Date.now() - lastYieldTime > maxBlockingTime) {
312
+ await delay(backOffTime);
313
+ lastYieldTime = Date.now();
314
+ }
315
+ }
316
+ return results;
317
+ }
318
+ exports.unblockLoop = unblockLoop;
319
+ async function safeLoop(config, fnc) {
320
+ var _a;
321
+ let { data, maxActiveFraction, doNotWarnOnSlow, name } = config;
322
+ let maxBlockingTime = (_a = config.maxBlockingTime) !== null && _a !== void 0 ? _a : 1000;
323
+ let label = name || fnc.name || fnc.toString().slice(0, 100).replaceAll("\n", "\\n");
324
+ let startTime = Date.now();
325
+ let index = 0;
326
+ let indexStartTime = Date.now();
327
+ let done = false;
328
+ if (!doNotWarnOnSlow) {
329
+ void (async () => {
330
+ while (!done) {
331
+ await delay(5000);
332
+ if (done)
333
+ break;
334
+ let message = `${(0, logColors_1.red)("SLOW LOOP")} | ${index} / ${data.length} | ${(0, format_1.formatTime)(Date.now() - startTime)} | ${label}`;
335
+ let timeOnCurrent = Date.now() - indexStartTime;
336
+ if (timeOnCurrent > 5000) {
337
+ message += `| SLOW INDEX (${index}) ${(0, format_1.formatTime)(timeOnCurrent)}+`;
338
+ }
339
+ console.log(message);
340
+ }
341
+ })();
342
+ }
343
+ let results = [];
344
+ let activeTimeSinceYield = 0;
345
+ try {
346
+ for (index = 0; index < data.length; index++) {
347
+ indexStartTime = Date.now();
348
+ let result = fnc(data[index]);
349
+ let isPromise = false;
350
+ if (result && typeof result === "object" && "then" in result) {
351
+ isPromise = true;
352
+ result = await result;
353
+ }
354
+ results.push(result);
355
+ activeTimeSinceYield += Date.now() - indexStartTime;
356
+ let backOffTime;
357
+ if (!isPromise && activeTimeSinceYield > maxBlockingTime) {
358
+ backOffTime = 0;
359
+ }
360
+ if (maxActiveFraction !== undefined && maxActiveFraction > 0 && maxActiveFraction < 1) {
361
+ let target = activeTimeSinceYield / maxActiveFraction - activeTimeSinceYield;
362
+ backOffTime = Math.max(backOffTime !== null && backOffTime !== void 0 ? backOffTime : 0, target);
363
+ }
364
+ if (backOffTime !== undefined) {
365
+ await delay(backOffTime);
366
+ activeTimeSinceYield = 0;
367
+ }
368
+ }
369
+ }
370
+ finally {
371
+ done = true;
372
+ }
373
+ return results;
374
+ }
375
+ exports.safeLoop = safeLoop;
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJiYXRjaGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnREFBaUQ7QUFDakQsc0RBQTZDO0FBQzdDLGlDQUE4RTtBQUM5RSxpREFBa0Q7QUFvQmxELFNBQWdCLEtBQUssQ0FDakIsU0FBb0I7QUFDcEIsbUNBQW1DO0FBQ25DLG9CQUE2QztJQUU3QyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksT0FBTyxDQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztTQUFNLElBQUksU0FBUyxLQUFLLGVBQWUsRUFBRSxDQUFDO1FBQ3ZDLHdGQUF3RjtRQUN4Riw4QkFBOEI7UUFDOUIsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0IsQ0FBQztTQUFNLElBQUksU0FBUyxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQ25DLElBQUksSUFBQSxhQUFNLEdBQUUsRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLE9BQU8sQ0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7YUFBTSxDQUFDO1lBQ0osT0FBTyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNMLENBQUM7U0FBTSxJQUFJLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxJQUFJLElBQUEsYUFBTSxHQUFFLEVBQUUsQ0FBQztZQUNYLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDZixNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDLENB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QztBQUNuQixDQUFDO0FBcEVELDRCQW9FQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcm1hdFRpbWUgfSBmcm9tIFwiLi9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHsgcmVkIH0gZnJvbSBcIi4vZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcbmltcG9ydCB7IFByb21pc2VPYmosIGlzTm9kZSwgdGltZW91dFRvRXJyb3IsIHdhdGNoU2xvd1Byb21pc2UgfSBmcm9tIFwiLi9taXNjXCI7XG5pbXBvcnQgeyBtZWFzdXJlV3JhcCB9IGZyb20gXCIuL3Byb2ZpbGluZy9tZWFzdXJlXCI7XG5pbXBvcnQgeyBBbnlGdW5jdGlvbiwgQXJncywgTWF5YmVQcm9taXNlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLypcbiAgICBcIm51bWJlcnNcIiB1c2Ugc2V0VGltZW91dFxuICAgIFwiYWZ0ZXJwcm9taXNlc1wiIHVzZXMgYSBtaWNyb3Rhc2ssIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTF9ET01fQVBJL01pY3JvdGFza19ndWlkZVxuICAgIFwiYWZ0ZXJpb1wiIHVzZXMgc2V0SW1tZWRpYXRlLCB3aGljaCB3aWxsIGJlIGFmdGVyIGFsbCBwZW5kaW5nIGFuZCBhbGwgY3JlYXRlZCBwcm9taXNlc1xuICAgICAgICAoaW4gdGhlIGJyb3dzZXIgaXQgaXMgbGlrZWx5IHNldEltbWVkaWF0ZSB3aWxsIGJlIHNoaW1tZWQgd2l0aCBzZXRUaW1lb3V0KVxuICAgIFwiaW1tZWRpYXRlXCIgdXNlcyBzZXRJbW1lZGlhdGUsIGJ1dCBpZiBub3QgYXZhaWxhYmxlIHVzZXMgXCJhZnRlcnByb21pc2VzXCJcbiAgICAgICAgLSBUaGUgZW5zdXJlcyBhIHByb21wdCByZXR1cm4sIHdpdGhvdXQgcmVzb3J0aW5nIHRvIHNldFRpbWVvdXQgaW4gdGhlIGJyb3dzZXIgKHdoaWNoIHdpbGwgY2F1c2VcbiAgICAgICAgICAgIHRoZSBjYWxsYmFjayB0byBiZSBkZWxheWVkIGEgZnJhbWUpLlxuKi9cbmV4cG9ydCB0eXBlIERlbGF5VHlwZSA9IChcbiAgICBudW1iZXIgfCBcImFmdGVyaW9cIiB8IFwiaW1tZWRpYXRlXCIgfCBcImFmdGVycHJvbWlzZXNcIlxuICAgIC8vIFdhaXRzIGZvciBwYWludCwgdXNhYmxlIGluIGEgbG9vcC4gVGhlIGZpcnN0IHdhaXQgZG9lc24ndCB3YWl0IHVudGlsIHRoZSBuZXh0XG4gICAgLy8gIHdhaXQsIGJ1dCB0aGUgc2Vjb25kIHdhaXQgd2lsbC5cbiAgICB8IFwicGFpbnRMb29wXCJcbiAgICAvLyBXYWl0cyB1bnRpbCBhZnRlciBwYWludCwgYnkgd2FpdGluZyB0d2ljZS5cbiAgICB8IFwiYWZ0ZXJQYWludFwiXG4pXG5leHBvcnQgZnVuY3Rpb24gZGVsYXkoXG4gICAgZGVsYXlUaW1lOiBEZWxheVR5cGUsXG4gICAgLy8gRGVsYXlzIDwgMTBtcyBiZWNvbWUgXCJpbW1lZGlhdGVcIlxuICAgIGltbWVkaWF0ZVNob3J0RGVsYXlzPzogXCJpbW1lZGlhdGVTaG9ydERlbGF5c1wiXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZGVsYXlUaW1lID09PSBcImFmdGVyaW9cIikge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgIH0gZWxzZSBpZiAoZGVsYXlUaW1lID09PSBcImFmdGVycHJvbWlzZXNcIikge1xuICAgICAgICAvLyBOT1RFOiBXZSB1c2UgYSBwcm9taXNlIGhlcmUgYXMgaXQgbWlnaHQgYmUgYSBiaXQgZWFzaWVyIHRvIGRlYnVnIHRoYW4gcXVldWVNaWNyb3Rhc2suXG4gICAgICAgIC8vICBJdCBpcyBlcXVpdmFsZW50IHRob3VnaC4uLlxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfSBlbHNlIGlmIChkZWxheVRpbWUgPT09IFwiaW1tZWRpYXRlXCIpIHtcbiAgICAgICAgaWYgKGlzTm9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRlbGF5KFwiYWZ0ZXJwcm9taXNlc1wiKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVsYXlUaW1lID09PSBcInBhaW50TG9vcFwiKSB7XG4gICAgICAgIGlmIChpc05vZGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlbGF5KFwiaW1tZWRpYXRlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSkpO1xuICAgICAgICB9KSgpO1xuICAgIH0gZWxzZSBpZiAoZGVsYXlUaW1lID09PSBcImFmdGVyUGFpbnRcIikge1xuICAgICAgICBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWxheShcImltbWVkaWF0ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlc29sdmUpKTtcbiAgICAgICAgICAgICAgICAvLyBCZWZvcmUgZmlyc3QgcGFpbnRcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXNvbHZlKSk7XG4gICAgICAgICAgICAgICAgLy8gQWZ0ZXIgZmlyc3QgcGFpbnRcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmIChkZWxheVRpbWUgPCAxMCAmJiBpbW1lZGlhdGVTaG9ydERlbGF5cykge1xuICAgICAgICAgICAgLy8gTk9URTogc2V0VGltZW91dCBjYW4ndCB3YWl0IHRoaXMgc2hvcnQgb2YgYSB0aW1lLCBzbyBqdXN0IHNldEltbWVkaWF0ZS4gVGhpcyBzaG91bGQgYmUgaGFyZCB0byBkaXN0aW5ndWlzaFxuICAgICAgICAgICAgLy8gIGFueXdheXMsIGFzIHNldEltbWVkaWF0ZSAoYXQgbGVhc3QgaW4gbm9kZWpzKSwgc2hvdWxkIGhhcHBlbiBhZnRlciBpbywgc28uLi4gaXQgc2hvdWxkIGp1c3Qgd29ya1xuICAgICAgICAgICAgLy8gICh0aGUgb25seSBkaWZmZXJlbmNlIGlzIHRoZXJlIHdpbGwgYmUgbGVzcyB1bm5lY2Vzc2FyeSBkZWxheSkuXG4gICAgICAgICAgICAvLyBOT1RFOiBUSElTIERPRVMgYnJlYWsgY2VydGFpbiBjYXNlcyB3aGVyZSBpbyBpcyBkZXBlbmRpbmcgb24gdHJ1ZSBkZWxheSwgYW5kIGJ5IG9ubHkgd2FpdGluZyBhIG1pY3JvdGlja1xuICAgICAgICAgICAgLy8gIHdlIGRvbid0IGdpdmUgaXQgYSBjaGFuY2UuIEJ1dC4uLiB3ZSBzaG91bGQganVzdCBoYW5kbGUgdGhvc2UgY2FzZXMgZXhwbGljaXRseSwgdmlhIGFuIGV4cGxpY2l0IFwiYWZ0ZXJpb1wiLlxuICAgICAgICAgICAgcmV0dXJuIGRlbGF5KFwiaW1tZWRpYXRlXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5PVEU6IFdlIGNoZWNrIERhdGUubm93KCkgYW5kIHdhaXQgbG9uZ2VyIGlmIHNldFRpbWVvdXQgZGlkbid0IHdhaXQgbG9uZyBlbm91Z2guXG4gICAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHRhcmdldFRpbWUgPSBEYXRlLm5vdygpICsgZGVsYXlUaW1lO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGltZVRvV2FpdCA9IHRhcmdldFRpbWUgLSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0aW1lVG9XYWl0KSk7XG4gICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPj0gdGFyZ2V0VGltZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgfVxufVxuXG4vLyBOT1RFOiBUaGlzIGlzIGFuIGVhc3kgd2F5IHRvIHR1cm4gb2ZmIGJhdGNoaW5nLCB3aXRob3V0IGhhdmluZyB0byBzdHJpcCB0aGUgZXh0cmEgYmF0Y2ggaGFuZGxpbmcgY29kZVxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoRnVuY3Rpb25Ob25lPEFyZywgUmVzdWx0ID0gdm9pZD4oXG4gICAgY29uZmlnOiB1bmtub3duLFxuICAgIGZuYzogKGFyZzogQXJnW10pID0+IChQcm9taXNlPFJlc3VsdD4gfCBSZXN1bHQpXG4pOiAoYXJnOiBBcmcpID0+IFByb21pc2U8UmVzdWx0PiB7XG4gICAgcmV0dXJuIGFzeW5jIGFyZyA9PiBmbmMoW2FyZ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmF0Y2hGdW5jdGlvbjxBcmcsIFJlc3VsdCA9IHZvaWQ+KFxuICAgIGNvbmZpZzoge1xuICAgICAgICBkZWxheTogRGVsYXlUeXBlO1xuICAgICAgICAvKiogSW5zdGVhZCBvZiBpbW1lZGlhdGVseSB3YWl0aW5nIGRlbGF5LCBzdGFydHMgYnkgd2FpdGluZyAwbXMsIGFuZCBldmVyeSBjYWxsIGluY3JlbWVudHMgdGhlIGRlbGF5IGZhY3RvclxuICAgICAgICAgKiAgICAgIGJ5IDEuIERlbGF5IGlzIGBmYWN0b3IgKiAoZGVsYXkgLyB0aHJvdHRsZVdpbmRvdylgLiBGb3IgZXZlcnkgZGVsYXkgaW50ZXJ2YWwgd2UgaGF2ZSBubyBjYWxscywgd2UgZGVjcmVhc2UgYnlcbiAgICAgICAgICogICAgICBub19jYWxscy9kZWxheS5cbiAgICAgICAgICogICAgICAtIFRoaXMgZXNzZW50aWFsbHkgdHVybnMgZGVsYXkgaW50byBhIGBjYWxscyBwZXIgc2Vjb25kYCB0eXBlIGluZGljYXRvciAoZXgsIDEwbXMgaXMgMTAwIGNhbGxlcnNcbiAgICAgICAgICogICAgICAgICAgcGVyIHNlY29uZCwgNTAwbXMgaXMgMiBjYWxscywgZXRjKSwgd2hpY2ggaXMgYWNjdXJhdGUgb3ZlciBkZWxheSAqIHRocm90dGxlV2luZG93IHRpbWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aHJvdHRsZVdpbmRvdz86IG51bWJlcjtcbiAgICAgICAgbmFtZT86IHN0cmluZztcbiAgICAgICAgbm9NZWFzdXJlPzogYm9vbGVhbjtcbiAgICB9LFxuICAgIGZuYzogKGFyZzogQXJnW10pID0+IChQcm9taXNlPFJlc3VsdD4gfCBSZXN1bHQpXG4pOiAoYXJnOiBBcmcpID0+IFByb21pc2U8UmVzdWx0PiB7XG4gICAgaWYgKCFjb25maWcubm9NZWFzdXJlKSB7XG4gICAgICAgIGZuYyA9IG1lYXN1cmVXcmFwKGZuYywgY29uZmlnLm5hbWUpO1xuICAgIH1cblxuICAgIGxldCBwcmV2UHJvbWlzZTogUHJvbWlzZTxSZXN1bHQ+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBiYXRjaGluZzoge1xuICAgICAgICBhcmdzOiBBcmdbXTtcbiAgICAgICAgcHJvbWlzZTogUHJvbWlzZTxSZXN1bHQ+O1xuICAgIH0gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGN1ckRlbGF5ID0gY29uZmlnLmRlbGF5O1xuICAgIGxldCBkZWxheVJhbXAgPSAwO1xuICAgIGlmIChjb25maWcudGhyb3R0bGVXaW5kb3cgJiYgdHlwZW9mIGN1ckRlbGF5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGRlbGF5UmFtcCA9IGN1ckRlbGF5IC8gKGNvbmZpZy50aHJvdHRsZVdpbmRvdyAvIGN1ckRlbGF5KTtcbiAgICB9XG4gICAgbGV0IGRlbGF5VGltZSA9IDA7XG4gICAgaWYgKHR5cGVvZiBjdXJEZWxheSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBkZWxheVRpbWUgPSBjdXJEZWxheTtcbiAgICB9XG4gICAgbGV0IGNvdW50U2luY2VCcmVhayA9IDA7XG4gICAgbGV0IGxhc3RDYWxsID0gMDtcblxuICAgIHJldHVybiBhcmcgPT4ge1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGRlbGF5UmFtcCkge1xuICAgICAgICAgICAgLy8gVGhlIHRpbWUgc2luY2UgdGhlIGxhc3QgY2FsbCAoc3RhcnRlZCkgaXMgaG93IG11Y2ggYnVkZ2V0IHdlIHdpbGwgaGF2ZSByZWNlaXZlZCB0b1xuICAgICAgICAgICAgLy8gIHJ1biB2YWx1ZXMuIElmIGl0IGlzID09PSBkZWxheVRpbWUsIHRoZW4gd2Ugc3VidHJhY3QgMSwgYXMgd2UgYXJlIHJpZ2h0IG9uIHRyYWNrLlxuICAgICAgICAgICAgLy8gIElmIGl0IGlzID4gZGVsYXlUaW1lLCB0aGVuIHdlIGFyZSBydW5uaW5nIGJlbG93IHRoZSByYXRlLCBzbyBpdCBpcyBmaW5lLlxuICAgICAgICAgICAgLy8gIElmIGl0IGlzIDwgZGVsYXlUaW1lLCB3ZSBhcmUgcnVubmluZyB0b28gZmFzdCwgYW5kIGhhdmUgdG8gc2xvdyBkb3duLlxuICAgICAgICAgICAgbGV0IHNhdmVkQ291bnQgPSAobm93IC0gbGFzdENhbGwpIC8gZGVsYXlUaW1lO1xuICAgICAgICAgICAgaWYgKHNhdmVkQ291bnQgPj0gMSkge1xuICAgICAgICAgICAgICAgIGNvdW50U2luY2VCcmVhayAtPSBzYXZlZENvdW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvdW50U2luY2VCcmVhayA8IDApIHtcbiAgICAgICAgICAgICAgICBjb3VudFNpbmNlQnJlYWsgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb3VudFNpbmNlQnJlYWsrKztcbiAgICAgICAgICAgIC8vIFNldCB0aGUgbWF4IGZhaXJseSBoaWdoLCBhcyB3ZSBiYXNpY2FsbHkgaWdub3JlIHNtYWxsIGRlbGF5IHRpbWVzLCBzbyB3ZSBuZWVkIGEgaGlnaCBtYXggdG8gYWxsb3dcbiAgICAgICAgICAgIC8vICBvdXIgZGVsYXkgdG8gZXZlbiBhcHBseSFcbiAgICAgICAgICAgIGN1ckRlbGF5ID0gTWF0aC5taW4oZGVsYXlUaW1lICogMjAsIGRlbGF5UmFtcCAqIGNvdW50U2luY2VCcmVhayk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdENhbGwgPSBub3c7XG5cbiAgICAgICAgaWYgKGJhdGNoaW5nKSB7XG4gICAgICAgICAgICBiYXRjaGluZy5hcmdzLnB1c2goYXJnKTtcbiAgICAgICAgICAgIHJldHVybiBiYXRjaGluZy5wcm9taXNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1clByZXZQcm9taXNlID0gcHJldlByb21pc2U7XG4gICAgICAgIGxldCBhcmdzOiBBcmdbXSA9IFthcmddO1xuICAgICAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gSWdub3JlIHRoZSBlcnJvci4gTmV3IGNhbGxlcnMgZG9uJ3QgY2FyZSBhYm91dCBlcnJvcnMgaW4gcHJldmlvdXMgY2FsbHMsXG4gICAgICAgICAgICAvLyAgYXMgdGhleSBhcmUgdW5yZWxhdGVkIHRvIHRoZSBjdXJyZW50IGNhbGwsIGFuZCBqdXN0IGJyZWFrIHZhbGlkIGNhbGxzXG4gICAgICAgICAgICAvLyAgZHVlIHRvIGludmFsaWQgY2FsbHMuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGN1clByZXZQcm9taXNlO1xuICAgICAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KGN1ckRlbGF5LCBcImltbWVkaWF0ZVNob3J0RGVsYXlzXCIpO1xuICAgICAgICAgICAgLy8gUmVzZXQgYmF0Y2hpbmcsIGFzIHdlIG9uY2Ugd2Ugc3RhcnQgdGhlIGZ1bmN0aW9uIHdlIGNhbid0IGFjY2VwdCBhcmdzLiBgcHJldlByb21pc2VgIHdpbGwgYmxvY2tcbiAgICAgICAgICAgIC8vICB0aGUgbmV4dCBiYXRjaCBmcm9tIHN0YXJ0aW5nIGJlZm9yZSB3ZSBmaW5pc2guXG4gICAgICAgICAgICBiYXRjaGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbmMoYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgICBiYXRjaGluZyA9IHsgYXJncywgcHJvbWlzZSwgfTtcbiAgICAgICAgcHJldlByb21pc2UgPSBiYXRjaGluZy5wcm9taXNlO1xuXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5JblNlcmlhbDxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT4+KGZuYzogVCk6IFQge1xuICAgIGxldCB1cGRhdGVRdWV1ZTogeyBwcm9taXNlOiBQcm9taXNlPHZvaWQ+OyByZXNvbHZlOiAoKSA9PiB2b2lkOyB9W10gPSBbXTtcblxuICAgIHJldHVybiAoYXN5bmMgZnVuY3Rpb24gcnVuSW5TZXJpYWwoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgbGV0IHByb21pc2UgPSB7XG4gICAgICAgICAgICBwcm9taXNlOiBudWxsIGFzIGFueSBhcyBQcm9taXNlPHZvaWQ+LFxuICAgICAgICAgICAgcmVzb2x2ZTogKCkgPT4geyB9LFxuICAgICAgICB9O1xuICAgICAgICBwcm9taXNlLnByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHByb21pc2UucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBxdWV1ZVdhc0VtcHR5ID0gdXBkYXRlUXVldWUubGVuZ3RoID09PSAwO1xuICAgICAgICBpZiAocXVldWVXYXNFbXB0eSkge1xuICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlUXVldWUucHVzaChwcm9taXNlKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZS5wcm9taXNlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm5jKC4uLmFyZ3MpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgLy8gUG9wIG91cnNlbGYgb2ZmXG4gICAgICAgICAgICB1cGRhdGVRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgbmV4dCBwcm9taXNlXG4gICAgICAgICAgICB1cGRhdGVRdWV1ZVswXT8ucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgfSkgYXMgVDtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcnVuSW5QYXJhbGxlbDxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT4+KFxuICAgIGNvbmZpZzoge1xuICAgICAgICBwYXJhbGxlbENvdW50OiBudW1iZXI7XG4gICAgICAgIGNhbGxUaW1lb3V0PzogbnVtYmVyO1xuICAgIH0sXG4gICAgZm5jOiBUXG4pOiBUIHtcbiAgICBsZXQgcXVldWVkOiB7XG4gICAgICAgIHBhcmFtZXRlcnM6IEFyZ3M8VD47XG4gICAgICAgIHJlc3VsdDogUHJvbWlzZU9iajxSZXR1cm5UeXBlPFQ+PjtcbiAgICB9W10gPSBbXTtcbiAgICBsZXQgcnVubmluZ0NvdW50ID0gMDtcblxuICAgIGZ1bmN0aW9uIHJ1bklmTmVlZGVkKCkge1xuICAgICAgICBpZiAocnVubmluZ0NvdW50ID49IGNvbmZpZy5wYXJhbGxlbENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcXVldWVkT2JqID0gcXVldWVkLnNoaWZ0KCk7XG4gICAgICAgIGlmICghcXVldWVkT2JqKSByZXR1cm47XG5cbiAgICAgICAgcXVldWVkT2JqLnJlc3VsdC5yZXNvbHZlKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBydW5uaW5nQ291bnQrKztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5jYWxsVGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGltZW91dFRvRXJyb3IoY29uZmlnLmNhbGxUaW1lb3V0LCBmbmMoLi4ucXVldWVkT2JqLnBhcmFtZXRlcnMpLCAoKSA9PiBuZXcgRXJyb3IoYFBhcmFsbGVsIGNhbGwgdGltZWQgb3V0IGZvciBmbmMgJHtmbmMubmFtZX1gKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuYyguLi5xdWV1ZWRPYmoucGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBydW5uaW5nQ291bnQtLTtcbiAgICAgICAgICAgICAgICBydW5JZk5lZWRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJhbGxlbENhbGwoLi4uYXJnczogQXJnczxUPikge1xuICAgICAgICBxdWV1ZWQucHVzaCh7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgICAgICAgcmVzdWx0OiBuZXcgUHJvbWlzZU9iajxSZXR1cm5UeXBlPFQ+PigpLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHF1ZXVlZE9iaiA9IHF1ZXVlZFtxdWV1ZWQubGVuZ3RoIC0gMV07XG4gICAgICAgIHJ1bklmTmVlZGVkKCk7XG4gICAgICAgIHJldHVybiBxdWV1ZWRPYmoucmVzdWx0LnByb21pc2U7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbGxlbENhbGwgYXMgVDtcbn1cblxubGV0IHBvbGxpbmdSdW5uaW5nID0gdHJ1ZTtcbmxldCBwZW5kaW5nUG9sbHMgPSBuZXcgU2V0PFByb21pc2U8dW5rbm93bj4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5JbmZpbml0ZVBvbGwoXG4gICAgZGVsYXlUaW1lOiBudW1iZXIsXG4gICAgZm5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCxcbiAgICBzdG9wT2JqPzogeyBzdG9wOiBib29sZWFuOyB9XG4pIHtcbiAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHdoaWxlICghc3RvcE9iaj8uc3RvcCAmJiBwb2xsaW5nUnVubmluZykge1xuICAgICAgICAgICAgYXdhaXQgZGVsYXkoZGVsYXlUaW1lKTtcbiAgICAgICAgICAgIGlmICghcG9sbGluZ1J1bm5pbmcpIGJyZWFrO1xuICAgICAgICAgICAgYXdhaXQgcnVuUG9sbEZuYyhmbmMpO1xuICAgICAgICB9XG4gICAgfSkoKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkluZmluaXRlUG9sbENhbGxBdFN0YXJ0KFxuICAgIGRlbGF5VGltZTogbnVtYmVyLFxuICAgIGZuYzogKCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQsXG4gICAgc3RvcE9iaj86IHsgc3RvcDogYm9vbGVhbjsgfVxuKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuYygpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHdoaWxlICghc3RvcE9iaj8uc3RvcCAmJiBwb2xsaW5nUnVubmluZykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KGRlbGF5VGltZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwb2xsaW5nUnVubmluZykgYnJlYWs7XG4gICAgICAgICAgICAgICAgYXdhaXQgcnVuUG9sbEZuYyhmbmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUG9sbEZuYyhmbmM6ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKSB7XG4gICAgbGV0IHByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuYygpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGluIGluZmluaXRlIHBvbGwgJHtmbmMubmFtZSB8fCBmbmMudG9TdHJpbmcoKS5zbGljZSgwLCAxMDApfSAoY29udGludWluZyBwb2xsIGxvb3ApXFxuJHtlLnN0YWNrfWApO1xuICAgICAgICB9XG4gICAgfSkoKTtcbiAgICBwZW5kaW5nUG9sbHMuYWRkKHByb21pc2UpO1xuICAgIGF3YWl0IHByb21pc2U7XG4gICAgcGVuZGluZ1BvbGxzLmRlbGV0ZShwcm9taXNlKTtcbn1cblxuLyoqIERpc2FibGVzIHBvbGxpbmcsIGNhbGxlZCBvbiBzaHV0ZG93bi4gQmxvY2tzIHVudGlsIGFsbCBwZW5kaW5nIHBvbGwgbG9vcHMgZmluaXNoICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2h1dGRvd25Qb2xsaW5nKCkge1xuICAgIHBvbGxpbmdSdW5uaW5nID0gZmFsc2U7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShwZW5kaW5nUG9sbHMpKTtcbn1cblxuXG5jb25zdCBERUZBVUxUX1JFVFJZX0RFTEFZID0gNTAwMDtcbmNvbnN0IERFRkFVTFRfTUFYX1JFVFJJRVMgPSAzO1xuZXhwb3J0IGZ1bmN0aW9uIHJldHJ5RnVuY3Rpb25hbDxUIGV4dGVuZHMgQW55RnVuY3Rpb24+KGZuYzogVCwgY29uZmlnPzoge1xuICAgIG1heFJldHJpZXM/OiBudW1iZXI7XG4gICAgc2hvdWxkUmV0cnk/OiAobWVzc2FnZTogc3RyaW5nKSA9PiBib29sZWFuO1xuICAgIG1pbkRlbGF5PzogbnVtYmVyO1xuICAgIG1heERlbGF5PzogbnVtYmVyO1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gICAgd2FybmluZ0ludGVydmFsPzogbnVtYmVyO1xufSk6IFQge1xuICAgIGxldCB7XG4gICAgICAgIG1heFJldHJpZXMgPSBERUZBVUxUX01BWF9SRVRSSUVTLCBzaG91bGRSZXRyeSwgbWluRGVsYXkgPSBERUZBVUxUX1JFVFJZX0RFTEFZLCBtYXhEZWxheSA9IERFRkFVTFRfUkVUUllfREVMQVksXG4gICAgICAgIHRpbWVvdXQsXG4gICAgICAgIHdhcm5pbmdJbnRlcnZhbCxcbiAgICB9ID0gY29uZmlnIHx8IHt9O1xuICAgIGxldCBleHBGYWN0b3IgPSBNYXRoLm1heCgxLCBNYXRoLmxvZyhtYXhEZWxheSAvIG1pbkRlbGF5KSAvIE1hdGgubG9nKE1hdGgubWF4KG1heFJldHJpZXMsIDIpKSk7XG4gICAgbGV0IG5hbWUgPSBmbmMubmFtZSB8fCBmbmMudG9TdHJpbmcoKS5zbGljZSgwLCAxMDApO1xuICAgIGFzeW5jIGZ1bmN0aW9uIHJ1bkZuYyhhcmdzOiBhbnlbXSwgcmV0cmllczogbnVtYmVyKTogUHJvbWlzZTxSZXR1cm5UeXBlPFQ+PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcHJvbWlzZSA9IChmbmMgYXMgYW55KSguLi5hcmdzKTtcbiAgICAgICAgICAgIGlmICh0aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlID0gdGltZW91dFRvRXJyb3IodGltZW91dCwgcHJvbWlzZSwgKCkgPT4gbmV3IEVycm9yKGB0aW1lZCBvdXQgYWZ0ZXIgJHtmb3JtYXRUaW1lKHRpbWVvdXQpfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3YXJuaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHByb21pc2UgPSB3YXRjaFNsb3dQcm9taXNlKG5hbWUsIHByb21pc2UsIHsgaW50ZXJ2YWw6IHdhcm5pbmdJbnRlcnZhbCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBwcm9taXNlO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoU3RyaW5nKGUuc3RhY2spKSkge1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmV0cmllcyA8IDApIHRocm93IGU7XG4gICAgICAgICAgICByZXRyaWVzLS07XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFJldHJ5aW5nICR7bmFtZX0gKCR7cmV0cmllc30vJHttYXhSZXRyaWVzfSBsZWZ0KSwgZHVlIHRvIGVycm9yICR7U3RyaW5nKGUuc3RhY2spfWApO1xuICAgICAgICAgICAgbGV0IGN1ckNvdW50ID0gbWF4UmV0cmllcyAtIHJldHJpZXM7XG4gICAgICAgICAgICBhd2FpdCBkZWxheShtaW5EZWxheSAqIGV4cEZhY3RvciAqKiBjdXJDb3VudCk7XG4gICAgICAgICAgICByZXR1cm4gcnVuRm5jKGFyZ3MsIHJldHJpZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bkZuYyhhcmdzLCBtYXhSZXRyaWVzKTtcbiAgICB9IGFzIGFueTtcbn1cblxuLyoqIEBkZXByZWNhdGVkIFVzZSBzYWZlTG9vcCBpbnN0ZWFkICovXG5leHBvcnQgY29uc3QgdGhyb3R0bGVkTG9vcCA9IHVuYmxvY2tMb29wO1xuLyoqIEBkZXByZWNhdGVkIFVzZSBzYWZlTG9vcCBpbnN0ZWFkICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdW5ibG9ja0xvb3A8VCwgUj4oY29uZmlnOiB7XG4gICAgZGF0YTogVFtdO1xuICAgIG1heEJsb2NraW5nVGltZT86IG51bWJlcjtcbiAgICBiYWNrT2ZmVGltZT86IG51bWJlcjtcbn0gfCBUW10sIGZuYzogKGl0ZW06IFQpID0+IE1heWJlUHJvbWlzZTxSPik6IFByb21pc2U8UltdPiB7XG5cbiAgICBsZXQgZGF0YSA9IEFycmF5LmlzQXJyYXkoY29uZmlnKSA/IGNvbmZpZyA6IGNvbmZpZy5kYXRhO1xuICAgIGxldCBtYXhCbG9ja2luZ1RpbWUgPSAzMDA7XG4gICAgbGV0IGJhY2tPZmZUaW1lID0gNTA7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICAgICAgbWF4QmxvY2tpbmdUaW1lID0gY29uZmlnLm1heEJsb2NraW5nVGltZSA/PyAzMDA7XG4gICAgICAgIGJhY2tPZmZUaW1lID0gY29uZmlnLmJhY2tPZmZUaW1lID8/IDUwO1xuICAgIH1cblxuICAgIGxldCBsYXN0WWllbGRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgcmVzdWx0czogUltdID0gW107XG5cbiAgICBmb3IgKGxldCBpdGVtIG9mIGRhdGEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZuYyhpdGVtKTtcblxuICAgICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UsIGF3YWl0IGl0XG4gICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiBcInRoZW5cIiBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSd2ZSBiZWVuIGJsb2NraW5nIGZvciB0b28gbG9uZ1xuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RZaWVsZFRpbWUgPiBtYXhCbG9ja2luZ1RpbWUpIHtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KGJhY2tPZmZUaW1lKTtcbiAgICAgICAgICAgIGxhc3RZaWVsZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FmZUxvb3A8VCwgUj4oY29uZmlnOiB7XG4gICAgZGF0YTogVFtdO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqIElmIHNldCwgeWllbGRzIGFmdGVyIGJsb2NraW5nIGZvciB0aGlzIG1hbnkgbXMuIE9OTFkgYXBwbGllcyBpZiB5b3VyIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBwcm9taXNlcy4gRGVmYXVsdCA9IDEwMDBtcyAqL1xuICAgIG1heEJsb2NraW5nVGltZT86IG51bWJlcjtcbiAgICAvKiogRnJhY3Rpb24gb2YgdGltZSBzcGVudCBhY3RpdmUgdnMgeWllbGRlZC4gZS5nLiAwLjUgPT4gYWZ0ZXIgcnVubmluZyBYIG1zLCB3YWl0IFggbXMgYmVmb3JlIGNvbnRpbnVpbmcuICovXG4gICAgbWF4QWN0aXZlRnJhY3Rpb24/OiBudW1iZXI7XG4gICAgZG9Ob3RXYXJuT25TbG93PzogYm9vbGVhbjtcbn0sIGZuYzogKGl0ZW06IFQpID0+IE1heWJlUHJvbWlzZTxSPik6IFByb21pc2U8UltdPiB7XG4gICAgbGV0IHsgZGF0YSwgbWF4QWN0aXZlRnJhY3Rpb24sIGRvTm90V2Fybk9uU2xvdywgbmFtZSB9ID0gY29uZmlnO1xuICAgIGxldCBtYXhCbG9ja2luZ1RpbWUgPSBjb25maWcubWF4QmxvY2tpbmdUaW1lID8/IDEwMDA7XG5cbiAgICBsZXQgbGFiZWwgPSBuYW1lIHx8IGZuYy5uYW1lIHx8IGZuYy50b1N0cmluZygpLnNsaWNlKDAsIDEwMCkucmVwbGFjZUFsbChcIlxcblwiLCBcIlxcXFxuXCIpO1xuICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgbGV0IGluZGV4U3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuXG4gICAgaWYgKCFkb05vdFdhcm5PblNsb3cpIHtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoNTAwMCk7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYCR7cmVkKFwiU0xPVyBMT09QXCIpfSB8ICR7aW5kZXh9IC8gJHtkYXRhLmxlbmd0aH0gfCAke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9IHwgJHtsYWJlbH1gO1xuICAgICAgICAgICAgICAgIGxldCB0aW1lT25DdXJyZW50ID0gRGF0ZS5ub3coKSAtIGluZGV4U3RhcnRUaW1lO1xuICAgICAgICAgICAgICAgIGlmICh0aW1lT25DdXJyZW50ID4gNTAwMCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9IGB8IFNMT1cgSU5ERVggKCR7aW5kZXh9KSAke2Zvcm1hdFRpbWUodGltZU9uQ3VycmVudCl9K2A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgIH1cblxuICAgIGxldCByZXN1bHRzOiBSW10gPSBbXTtcbiAgICBsZXQgYWN0aXZlVGltZVNpbmNlWWllbGQgPSAwO1xuICAgIHRyeSB7XG4gICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGRhdGEubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBpbmRleFN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZm5jKGRhdGFbaW5kZXhdKTtcbiAgICAgICAgICAgIGxldCBpc1Byb21pc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiBcInRoZW5cIiBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpc1Byb21pc2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuXG4gICAgICAgICAgICBhY3RpdmVUaW1lU2luY2VZaWVsZCArPSBEYXRlLm5vdygpIC0gaW5kZXhTdGFydFRpbWU7XG5cbiAgICAgICAgICAgIGxldCBiYWNrT2ZmVGltZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBpZiAoIWlzUHJvbWlzZSAmJiBhY3RpdmVUaW1lU2luY2VZaWVsZCA+IG1heEJsb2NraW5nVGltZSkge1xuICAgICAgICAgICAgICAgIGJhY2tPZmZUaW1lID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1heEFjdGl2ZUZyYWN0aW9uICE9PSB1bmRlZmluZWQgJiYgbWF4QWN0aXZlRnJhY3Rpb24gPiAwICYmIG1heEFjdGl2ZUZyYWN0aW9uIDwgMSkge1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBhY3RpdmVUaW1lU2luY2VZaWVsZCAvIG1heEFjdGl2ZUZyYWN0aW9uIC0gYWN0aXZlVGltZVNpbmNlWWllbGQ7XG4gICAgICAgICAgICAgICAgYmFja09mZlRpbWUgPSBNYXRoLm1heChiYWNrT2ZmVGltZSA/PyAwLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYmFja09mZlRpbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KGJhY2tPZmZUaW1lKTtcbiAgICAgICAgICAgICAgICBhY3RpdmVUaW1lU2luY2VZaWVsZCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG59Il19
377
+ /* _JS_SOURCE_HASH = "9799d140cb038e8cb87b2d854c3850d4cf273d8a43b662ace82c78f9a0753e86"; */