sliftutils 1.7.87 → 1.7.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +3 -1
- package/dist/treeSummary.ts.cache +2 -2
- package/index.d.ts +675 -296
- package/misc/dist/environment.ts.cache +2 -2
- package/misc/dist/getSecret.ts.cache +2 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/dist/zip.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/cloudflareHelpers.ts.cache +2 -2
- package/misc/https/dist/dns.ts.cache +2 -2
- package/misc/https/dist/hostServer.ts.cache +49 -21
- package/misc/https/dist/hostsFile.ts.cache +82 -0
- package/misc/https/dist/httpsCerts.ts.cache +2 -2
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/misc/https/hostServer.d.ts +6 -2
- package/misc/https/hostServer.ts +52 -19
- package/misc/https/hostsFile.d.ts +7 -0
- package/misc/https/hostsFile.ts +66 -0
- package/package.json +1 -1
- package/render-utils/dist/observer.tsx.cache +2 -2
- package/storage/ArchivesDisk.d.ts +3 -6
- package/storage/ArchivesDisk.ts +26 -2
- package/storage/BulkDatabase2/BulkDatabaseReader.ts +1 -1
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +3 -3
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
- package/storage/IArchives.d.ts +37 -24
- package/storage/IArchives.ts +47 -62
- package/storage/LogMap.d.ts +56 -0
- package/storage/LogMap.ts +220 -0
- package/storage/archiveHelpers.d.ts +36 -0
- package/storage/archiveHelpers.ts +103 -0
- package/storage/backblaze.d.ts +7 -12
- package/storage/backblaze.ts +53 -48
- package/storage/dist/ArchivesDisk.ts.cache +28 -2
- package/storage/dist/FileFolderAPI.tsx.cache +2 -2
- package/storage/dist/IArchives.ts.cache +16 -52
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
- package/storage/dist/JSONStorage.ts.cache +2 -2
- package/storage/dist/LogMap.ts.cache +212 -0
- package/storage/dist/PendingManager.tsx.cache +2 -2
- package/storage/dist/TransactionStorage.ts.cache +2 -2
- package/storage/dist/backblaze.ts.cache +58 -44
- package/storage/dist/fileSystemPointer.ts.cache +2 -2
- package/storage/dist/remoteFileStorage.ts.cache +2 -2
- package/storage/remoteStorage/ArchivesDelayed.d.ts +66 -0
- package/storage/remoteStorage/ArchivesDelayed.ts +237 -0
- package/storage/remoteStorage/ArchivesRemote.d.ts +5 -6
- package/storage/remoteStorage/ArchivesRemote.ts +26 -5
- package/storage/remoteStorage/ArchivesUrl.d.ts +2 -5
- package/storage/remoteStorage/ArchivesUrl.ts +2 -2
- package/storage/remoteStorage/accessPage.tsx +12 -0
- package/storage/remoteStorage/accessStats.d.ts +1 -1
- package/storage/remoteStorage/accessStats.ts +3 -3
- package/storage/remoteStorage/blobStore.d.ts +162 -189
- package/storage/remoteStorage/blobStore.ts +495 -952
- package/storage/remoteStorage/bucketDisk.d.ts +24 -3
- package/storage/remoteStorage/bucketDisk.ts +56 -22
- package/storage/remoteStorage/certTrustModal.d.ts +1 -0
- package/storage/remoteStorage/certTrustModal.tsx +48 -0
- package/storage/remoteStorage/cliArgs.d.ts +2 -0
- package/storage/remoteStorage/cliArgs.ts +5 -0
- package/storage/remoteStorage/createArchives.d.ts +8 -7
- package/storage/remoteStorage/createArchives.ts +65 -26
- package/storage/remoteStorage/deployTakeover.ts +1 -1
- package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +220 -0
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +25 -5
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +3 -3
- package/storage/remoteStorage/dist/accessPage.tsx.cache +13 -3
- package/storage/remoteStorage/dist/accessStats.ts.cache +6 -6
- package/storage/remoteStorage/dist/blobStore.ts.cache +483 -965
- package/storage/remoteStorage/dist/bucketDisk.ts.cache +60 -29
- package/storage/remoteStorage/dist/certTrustModal.tsx.cache +55 -0
- package/storage/remoteStorage/dist/cliArgs.ts.cache +9 -4
- package/storage/remoteStorage/dist/createArchives.ts.cache +63 -26
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +5 -5
- package/storage/remoteStorage/dist/intermediateManagement.ts.cache +286 -0
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +122 -56
- package/storage/remoteStorage/dist/serverConfig.ts.cache +4 -4
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +7 -11
- package/storage/remoteStorage/dist/sourcesList.ts.cache +3 -6
- package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageController.ts.cache +27 -12
- package/storage/remoteStorage/dist/storageServer.ts.cache +27 -7
- package/storage/remoteStorage/dist/storageServerCli.ts.cache +7 -3
- package/storage/remoteStorage/dist/storageServerState.ts.cache +133 -696
- package/storage/remoteStorage/dist/storeConfig.ts.cache +52 -0
- package/storage/remoteStorage/dist/storePlan.ts.cache +110 -81
- package/storage/remoteStorage/dist/storeSources.ts.cache +51 -0
- package/storage/remoteStorage/dist/storeSync.ts.cache +650 -0
- package/storage/remoteStorage/dist/validation.ts.cache +14 -4
- package/storage/remoteStorage/intermediateManagement.d.ts +12 -0
- package/storage/remoteStorage/intermediateManagement.ts +264 -0
- package/storage/remoteStorage/remoteConfig.d.ts +32 -0
- package/storage/remoteStorage/remoteConfig.ts +115 -50
- package/storage/remoteStorage/serverConfig.d.ts +1 -1
- package/storage/remoteStorage/serverConfig.ts +1 -1
- package/storage/remoteStorage/sourceWrapper.ts +4 -8
- package/storage/remoteStorage/sourcesList.d.ts +0 -2
- package/storage/remoteStorage/sourcesList.ts +0 -3
- package/storage/remoteStorage/spec.md +18 -4
- package/storage/remoteStorage/storageController.d.ts +10 -0
- package/storage/remoteStorage/storageController.ts +29 -16
- package/storage/remoteStorage/storageServer.d.ts +2 -0
- package/storage/remoteStorage/storageServer.ts +28 -4
- package/storage/remoteStorage/storageServerCli.ts +5 -1
- package/storage/remoteStorage/storageServerState.d.ts +34 -21
- package/storage/remoteStorage/storageServerState.ts +147 -662
- package/storage/remoteStorage/storeConfig.d.ts +30 -0
- package/storage/remoteStorage/storeConfig.ts +62 -0
- package/storage/remoteStorage/storePlan.d.ts +29 -17
- package/storage/remoteStorage/storePlan.ts +112 -85
- package/storage/remoteStorage/storeSources.d.ts +11 -0
- package/storage/remoteStorage/storeSources.ts +47 -0
- package/storage/remoteStorage/storeSync.d.ts +53 -0
- package/storage/remoteStorage/storeSync.ts +632 -0
- package/storage/remoteStorage/validation.d.ts +2 -0
- package/storage/remoteStorage/validation.ts +10 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true , configurable: true}
|
|
|
6
6
|
//exports.getMainPortAcquireDelay = exports.getAltPortListenEnd = exports.getTakeoverIntermediate = exports.setAltPort = exports.detectDeployTakeover = void 0;
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const
|
|
9
|
+
const intermediateManagement_1 = require("./intermediateManagement");
|
|
10
10
|
const PARAMETERS_TIMELINE_FILE_REGEX = /^(\d+)-parameters\.json$/;
|
|
11
11
|
const DEPLOY_DETECT_RETRY_DELAY = 5 * 1000;
|
|
12
12
|
const DEPLOY_DETECT_TIMEOUT = 30 * 1000;
|
|
@@ -99,7 +99,7 @@ function setAltPort(port) {
|
|
|
99
99
|
// Needs to be enough after our startup time that the previous node has time to see it's going to be shut down and flush (and so we have time to start up), and enough before the kill time that nodes have time to notice we exist and prepare to connect to us - halfway between now and the kill time satisfies both
|
|
100
100
|
takeover.intermediateStart = Math.round((Date.now() + getKillTime()) / 2);
|
|
101
101
|
console.warn(`${logPrefix()} Listening on alternate port ${port}: writes route here from ${iso(takeover.intermediateStart)} until ${iso(getIntermediateEnd())}, and we keep listening until ${iso(getAltPortListenEnd())}`);
|
|
102
|
-
(0,
|
|
102
|
+
(0, intermediateManagement_1.startIntermediateMaintenance)();
|
|
103
103
|
}
|
|
104
104
|
exports.setAltPort = setAltPort;
|
|
105
105
|
/** The window in which writes belong to our alternate port: from partway through the overlap (giving the predecessor notice to flush) until safely past its kill (giving us time to actually take the main port). */
|
|
@@ -137,5 +137,5 @@ function getMainPortAcquireDelay() {
|
|
|
137
137
|
return ACQUIRE_SLOW_DELAY;
|
|
138
138
|
}
|
|
139
139
|
exports.getMainPortAcquireDelay = getMainPortAcquireDelay;
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95VGFrZW92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3lUYWtlb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLDZEQUFvRTtBQUVwRSxNQUFNLDhCQUE4QixHQUFHLDBCQUEwQixDQUFDO0FBQ2xFLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUMzQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDeEMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLHFNQUFxTTtBQUNyTSxNQUFNLDJCQUEyQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2xELE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNyQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQztBQUNoQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFjdEMsSUFBSSxRQUFvQyxDQUFDO0FBRXpDLFNBQVMsR0FBRyxDQUFDLElBQVk7SUFDckIsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBRUQsU0FBUyxTQUFTO0lBQ2QsT0FBTyxRQUFRLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxDQUFDO0FBRUQsU0FBUyxpQkFBaUI7SUFDdEIsT0FBTyxjQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25FLENBQUM7QUFFRCxLQUFLLFVBQVUsbUJBQW1COztJQUM5QixJ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LENBQUM7QUFIRCxrREFHQztBQUVELGlLQUFpSztBQUNqSyxTQUFnQix1QkFBdUI7SUFDbkMsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLGtCQUFrQixDQUFDO0lBQ3pDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLFdBQVcsRUFBRSxHQUFHLG1CQUFtQixFQUFFLENBQUM7UUFDcEQsT0FBTyxrQkFBa0IsQ0FBQztJQUM5QixDQUFDO0lBQ0QsT0FBTyxrQkFBa0IsQ0FBQztBQUM5QixDQUFDO0FBTkQsMERBTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgc3RhcnRJbnRlcm1lZGlhdGVNYWludGVuYW5jZSB9IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJTdGF0ZVwiO1xuXG5jb25zdCBQQVJBTUVURVJTX1RJTUVMSU5FX0ZJTEVfUkVHRVggPSAvXihcXGQrKS1wYXJhbWV0ZXJzXFwuanNvbiQvO1xuY29uc3QgREVQTE9ZX0RFVEVDVF9SRVRSWV9ERUxBWSA9IDUgKiAxMDAwO1xuY29uc3QgREVQTE9ZX0RFVEVDVF9USU1FT1VUID0gMzAgKiAxMDAwO1xuY29uc3QgRVhJVF9MT0dfRkxVU0hfREVMQVkgPSA1ICogMTAwMDtcbmNvbnN0IEFMVF9QT1JUX0xJTkdFUiA9IDMwICogNjAgKiAxMDAwO1xuLy8gVGhlIGVuZCB0aW1lIG5lZWRzIHRvIGJlIGVub3VnaCBhZnRlciB0aGUga2lsbCB0aW1lIHRoYXQgd2UgYXJlIGNlcnRhaW4gd2Ugd2lsbCBoYXZlIHRoZSBtYWluIHBvcnQgYnkgdGhlbi4gU2NhbGVkIHVwIHdpdGggdGhlIG92ZXJsYXAsIHNvIHVudXN1YWxseSBsb25nIG92ZXJsYXBzIGdldCBhbiBlcXVhbGx5IGdlbmVyb3VzIGJ1ZmZlci5cbmNvbnN0IElOVEVSTUVESUFURV9FTkRfTUlOX0JVRkZFUiA9IDUgKiA2MCAqIDEwMDA7XG5jb25zdCBBQ1FVSVJFX1NMT1dfREVMQVkgPSAzMCAqIDEwMDA7XG5jb25zdCBBQ1FVSVJFX0ZBU1RfREVMQVkgPSAxMDAwO1xuY29uc3QgQUNRVUlSRV9GQVNUX1dJTkRPVyA9IDYwICogMTAwMDtcblxudHlwZSBUaW1lbGluZUVudHJ5ID0ge1xuICAgIHBhcmFtZXRlcnM6IHsgcmVsZWFzZVRpbWU/OiBudW1iZXI7IG92ZXJsYXBUaW1lPzogbnVtYmVyIH07XG59O1xuXG50eXBlIERlcGxveVRha2VvdmVyID0ge1xuICAgIHJlbGVhc2VUaW1lOiBudW1iZXI7XG4gICAgb3ZlcmxhcFRpbWU6IG51bWJlcjtcbiAgICBhbHRQb3J0PzogbnVtYmVyO1xuICAgIC8vIEZyb3plbiB3aGVuIHRoZSBhbHQgcG9ydCBpcyB0YWtlbiAoYSBtb3Zpbmcgc3RhcnQgd291bGQgbWFrZSBldmVyeSBtYWludGVuYW5jZSBwYXNzIHdyaXRlIGEgbmV3IGNvbmZpZylcbiAgICBpbnRlcm1lZGlhdGVTdGFydD86IG51bWJlcjtcbn07XG5cbmxldCB0YWtlb3ZlcjogRGVwbG95VGFrZW92ZXIgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzbyh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lKS50b0lTT1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiBsb2dQcmVmaXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFtwaWQgJHtwcm9jZXNzLnBpZH1dYDtcbn1cblxuZnVuY3Rpb24gZ2V0VGltZWxpbmVGb2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHByb2Nlc3MuY3dkKCkpLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKSArIFwiL1wiO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkVGltZWxpbmVFbnRyaWVzKCk6IFByb21pc2U8VGltZWxpbmVFbnRyeVtdPiB7XG4gICAgbGV0IGZvbGRlciA9IGdldFRpbWVsaW5lRm9sZGVyKCk7XG4gICAgbGV0IGZpbGVzOiBzdHJpbmdbXTtcbiAgICB0cnkge1xuICAgICAgICBmaWxlcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZm9sZGVyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHtsb2dQcmVmaXgoKX0gQ291bGQgbm90IHJlYWQgdGhlIGRlcGxveSB0aW1lbGluZSBmb2xkZXIgJHtmb2xkZXJ9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGxldCBlbnRyaWVzOiBUaW1lbGluZUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmICghUEFSQU1FVEVSU19USU1FTElORV9GSUxFX1JFR0VYLnRlc3QoZmlsZSkpIGNvbnRpbnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW50cmllcy5wdXNoKEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZm9sZGVyICsgZmlsZSwgXCJ1dGY4XCIpKSBhcyBUaW1lbGluZUVudHJ5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGAke2xvZ1ByZWZpeCgpfSBDb3VsZCBub3QgcmVhZCBkZXBsb3kgdGltZWxpbmUgZmlsZSAke2ZvbGRlciArIGZpbGV9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnRyaWVzO1xufVxuXG4vLyBUaGUgbmV3ZXN0IHJlbGVhc2UgaW4gdGhlIHRpbWVsaW5lIGlzIHRoZSBvbmUgd2UgYXJlIHBhcnQgb2YgLSB0aGUgdGltZWxpbmUgaXMgYXBwZW5kLW9ubHkgaGlzdG9yeSwgc28gd2hhdGV2ZXIgcHJvY2VzcyBzdGFydHMgdXAgZHVyaW5nIGEgdGFrZW92ZXIgYmVsb25ncyB0byBpdHMgbGF0ZXN0IGVudHJ5XG5mdW5jdGlvbiBmaW5kT3VyUmVsZWFzZShlbnRyaWVzOiBUaW1lbGluZUVudHJ5W10pOiBEZXBsb3lUYWtlb3ZlciB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGJlc3Q6IERlcGxveVRha2VvdmVyIHwgdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgbGV0IHJlbGVhc2VUaW1lID0gZW50cnkucGFyYW1ldGVycy5yZWxlYXNlVGltZTtcbiAgICAgICAgaWYgKHJlbGVhc2VUaW1lID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgb3ZlcmxhcFRpbWUgPSBlbnRyeS5wYXJhbWV0ZXJzLm92ZXJsYXBUaW1lIHx8IDA7XG4gICAgICAgIGlmIChiZXN0ICYmIGJlc3QucmVsZWFzZVRpbWUgPj0gcmVsZWFzZVRpbWUpIGNvbnRpbnVlO1xuICAgICAgICBiZXN0ID0geyByZWxlYXNlVGltZSwgb3ZlcmxhcFRpbWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIGJlc3Q7XG59XG5cbi8qKiBDYWxsZWQgd2hlbiB0aGUgbWFpbiBwb3J0IGlzIGFscmVhZHkgaW4gdXNlLCB3aGljaCBvbiBhIGhlYWx0aHkgbWFjaGluZSBvbmx5IGhhcHBlbnMgd2hpbGUgb3VyIHByZWRlY2Vzc29yIGlzIHN0aWxsIHJ1bm5pbmcgYSBkZXBsb3kgb3ZlcmxhcC4gQ29uZmlybXMgdGhhdCBhZ2FpbnN0IHRoZSBkZXBsb3kgdGltZWxpbmU7IGlmIG5vIGRlcGxveSBpcyBpbiBwcm9ncmVzcyB3ZSBhcmUgaW4gYSBiYWQgc3RhdGUgKHNvbWVvbmUgZWxzZSBob2xkcyBvdXIgcG9ydCkgYW5kIHRoZSBwcm9jZXNzIG11c3Qgbm90IGtlZXAgcnVubmluZy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXRlY3REZXBsb3lUYWtlb3ZlcigpOiBQcm9taXNlPERlcGxveVRha2VvdmVyPiB7XG4gICAgY29uc29sZS53YXJuKGAke2xvZ1ByZWZpeCgpfSBPdXIgbWFpbiBwb3J0IGlzIGluIHVzZSwgd2hpY2ggc2hvdWxkIG9ubHkgaGFwcGVuIHdoaWxlIGEgZGVwbG95IG92ZXJsYXAgaXMgcnVubmluZyAtIGNoZWNraW5nIHRoZSBkZXBsb3kgdGltZWxpbmUgaW4gJHtnZXRUaW1lbGluZUZvbGRlcigpfSBmb3IgdGhlIHJlbGVhc2Ugd2UgYXJlIHBhcnQgb2ZgKTtcbiAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgIGxldCBlbnRyaWVzID0gYXdhaXQgcmVhZFRpbWVsaW5lRW50cmllcygpO1xuICAgICAgICBsZXQgZm91bmQgPSBmaW5kT3VyUmVsZWFzZShlbnRyaWVzKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICB0YWtlb3ZlciA9IGZvdW5kO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGAke2xvZ1ByZWZpeCgpfSBEZXBsb3kgdGFrZW92ZXIgY29uZmlybWVkIG9uIGF0dGVtcHQgJHthdHRlbXB0fTogcmVsZWFzZSBhdCAke2lzbyhmb3VuZC5yZWxlYXNlVGltZSl9LCBvdmVybGFwICR7Zm91bmQub3ZlcmxhcFRpbWV9bXMsIHNvIG91ciBwcmVkZWNlc3NvciBob2xkcyB0aGUgbWFpbiBwb3J0IHVudGlsICR7aXNvKGZvdW5kLnJlbGVhc2VUaW1lICsgZm91bmQub3ZlcmxhcFRpbWUpfS4gV2UgYXJlIHRoZSBzdWNjZXNzb3IuYCk7XG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgIGlmIChlbGFwc2VkID49IERFUExPWV9ERVRFQ1RfVElNRU9VVCkge1xuICAgICAgICAgICAgLy8gTm90IGEgZGVwbG95LCBzbyBzb21ldGhpbmcgZWxzZSBob2xkcyBvdXIgcG9ydCBhbmQgbm90aGluZyB3ZSBkbyBmcm9tIGhlcmUgaXMgY29ycmVjdC4gRXhpdCwgZ2l2aW5nIHRoZSBsb2cgdGltZSB0byByZWFjaCB0aGUgZGlzayBmaXJzdCAtIHRoZSBtZXNzYWdlIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgZXhwbGFpbnMgdGhlIGV4aXQuXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke2xvZ1ByZWZpeCgpfSBPdXIgbWFpbiBwb3J0IGlzIGluIHVzZSwgYnV0IHRoZSBkZXBsb3kgdGltZWxpbmUgaW4gJHtnZXRUaW1lbGluZUZvbGRlcigpfSBzaG93ZWQgbm8gcmVsZWFzZSBpbiBwcm9ncmVzcyBhY3Jvc3MgJHthdHRlbXB0fSBjaGVja3Mgb3ZlciAke2VsYXBzZWR9bXMuIFNvbWV0aGluZyBlbHNlIGlzIGhvbGRpbmcgb3VyIHBvcnQsIHNvIHRoaXMgcHJvY2VzcyBpcyBpbiBhIGJhZCBzdGF0ZS4gRXhpdGluZyBpbiAke0VYSVRfTE9HX0ZMVVNIX0RFTEFZfW1zLmApO1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIEVYSVRfTE9HX0ZMVVNIX0RFTEFZKSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKGAke2xvZ1ByZWZpeCgpfSBObyByZWxlYXNlIGluIHByb2dyZXNzIGluIHRoZSBkZXBsb3kgdGltZWxpbmUgeWV0IChhdHRlbXB0ICR7YXR0ZW1wdH0sICR7ZWxhcHNlZH1tcyBvZiAke0RFUExPWV9ERVRFQ1RfVElNRU9VVH1tcyk7IHJldHJ5aW5nIGluICR7REVQTE9ZX0RFVEVDVF9SRVRSWV9ERUxBWX1tc2ApO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgREVQTE9ZX0RFVEVDVF9SRVRSWV9ERUxBWSkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEFsdFBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0YWtlb3Zlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuIGFsdGVybmF0ZSBwb3J0ICgke3BvcnR9KSB3YXMgdGFrZW4gd2l0aG91dCBhIGRldGVjdGVkIGRlcGxveSB0YWtlb3ZlciAtIGRldGVjdERlcGxveVRha2VvdmVyIG11c3QgcnVuIGZpcnN0YCk7XG4gICAgfVxuICAgIHRha2VvdmVyLmFsdFBvcnQgPSBwb3J0O1xuICAgIC8vIE5lZWRzIHRvIGJlIGVub3VnaCBhZnRlciBvdXIgc3RhcnR1cCB0aW1lIHRoYXQgdGhlIHByZXZpb3VzIG5vZGUgaGFzIHRpbWUgdG8gc2VlIGl0J3MgZ29pbmcgdG8gYmUgc2h1dCBkb3duIGFuZCBmbHVzaCAoYW5kIHNvIHdlIGhhdmUgdGltZSB0byBzdGFydCB1cCksIGFuZCBlbm91Z2ggYmVmb3JlIHRoZSBraWxsIHRpbWUgdGhhdCBub2RlcyBoYXZlIHRpbWUgdG8gbm90aWNlIHdlIGV4aXN0IGFuZCBwcmVwYXJlIHRvIGNvbm5lY3QgdG8gdXMgLSBoYWxmd2F5IGJldHdlZW4gbm93IGFuZCB0aGUga2lsbCB0aW1lIHNhdGlzZmllcyBib3RoXG4gICAgdGFrZW92ZXIuaW50ZXJtZWRpYXRlU3RhcnQgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpICsgZ2V0S2lsbFRpbWUoKSkgLyAyKTtcbiAgICBjb25zb2xlLndhcm4oYCR7bG9nUHJlZml4KCl9IExpc3RlbmluZyBvbiBhbHRlcm5hdGUgcG9ydCAke3BvcnR9OiB3cml0ZXMgcm91dGUgaGVyZSBmcm9tICR7aXNvKHRha2VvdmVyLmludGVybWVkaWF0ZVN0YXJ0KX0gdW50aWwgJHtpc28oZ2V0SW50ZXJtZWRpYXRlRW5kKCkpfSwgYW5kIHdlIGtlZXAgbGlzdGVuaW5nIHVudGlsICR7aXNvKGdldEFsdFBvcnRMaXN0ZW5FbmQoKSl9YCk7XG4gICAgc3RhcnRJbnRlcm1lZGlhdGVNYWludGVuYW5jZSgpO1xufVxuXG4vKiogVGhlIHdpbmRvdyBpbiB3aGljaCB3cml0ZXMgYmVsb25nIHRvIG91ciBhbHRlcm5hdGUgcG9ydDogZnJvbSBwYXJ0d2F5IHRocm91Z2ggdGhlIG92ZXJsYXAgKGdpdmluZyB0aGUgcHJlZGVjZXNzb3Igbm90aWNlIHRvIGZsdXNoKSB1bnRpbCBzYWZlbHkgcGFzdCBpdHMga2lsbCAoZ2l2aW5nIHVzIHRpbWUgdG8gYWN0dWFsbHkgdGFrZSB0aGUgbWFpbiBwb3J0KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWtlb3ZlckludGVybWVkaWF0ZSgpOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyOyBhbHRQb3J0OiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0YWtlb3Zlcj8uYWx0UG9ydCB8fCB0YWtlb3Zlci5pbnRlcm1lZGlhdGVTdGFydCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IHN0YXJ0OiB0YWtlb3Zlci5pbnRlcm1lZGlhdGVTdGFydCwgZW5kOiBnZXRJbnRlcm1lZGlhdGVFbmQoKSwgYWx0UG9ydDogdGFrZW92ZXIuYWx0UG9ydCB9O1xufVxuXG4vKiogV2hlbiBvdXIgcHJlZGVjZXNzb3IgaXMga2lsbGVkIGFuZCB0aGUgbWFpbiBwb3J0IGZyZWVzLiBQb3J0IGFjcXVpc2l0aW9uIHBvbGxzIGFnYWluc3QgdGhpcyBvbiBpdHMgb3duIC0gaXQgaXMgZW50aXJlbHkgaW5kZXBlbmRlbnQgb2YgdGhlIGludGVybWVkaWF0ZSB3aW5kb3cuICovXG5mdW5jdGlvbiBnZXRLaWxsVGltZSgpOiBudW1iZXIge1xuICAgIGlmICghdGFrZW92ZXIpIHJldHVybiAwO1xuICAgIHJldHVybiB0YWtlb3Zlci5yZWxlYXNlVGltZSArIHRha2VvdmVyLm92ZXJsYXBUaW1lO1xufVxuXG5mdW5jdGlvbiBnZXRJbnRlcm1lZGlhdGVFbmQoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRha2VvdmVyKSByZXR1cm4gMDtcbiAgICByZXR1cm4gZ2V0S2lsbFRpbWUoKSArIE1hdGgubWF4KElOVEVSTUVESUFURV9FTkRfTUlOX0JVRkZFUiwgdGFrZW92ZXIub3ZlcmxhcFRpbWUpO1xufVxuXG4vKiogV2UgbmV2ZXIgc3RvcCBsaXN0ZW5pbmcgb24gdGhlIGFsdGVybmF0ZSBwb3J0IHdoaWxlIGl0cyB3aW5kb3cgaXMgc3RpbGwgdmFsaWQsIGFuZCBob2xkIGl0IHdlbGwgcGFzdCB0aGF0IGZvciBjbGllbnRzIHRoYXQgaGF2ZSBub3QgY2F1Z2h0IHVwIHlldC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbHRQb3J0TGlzdGVuRW5kKCk6IG51bWJlciB7XG4gICAgaWYgKCF0YWtlb3ZlcikgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWF4KHRha2VvdmVyLnJlbGVhc2VUaW1lICsgdGFrZW92ZXIub3ZlcmxhcFRpbWUgKiAyLCBnZXRJbnRlcm1lZGlhdGVFbmQoKSArIEFMVF9QT1JUX0xJTkdFUik7XG59XG5cbi8qKiBIb3cgbG9uZyB0byB3YWl0IGJldHdlZW4gbWFpbi1wb3J0IGFjcXVpc2l0aW9uIGF0dGVtcHRzOiB0aWdodCBhcm91bmQgb3VyIHByZWRlY2Vzc29yJ3Mgc2NoZWR1bGVkIGRlYXRoICh3aGVuIHRoZSBwb3J0IGFjdHVhbGx5IGZyZWVzKSwgcmVsYXhlZCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpblBvcnRBY3F1aXJlRGVsYXkoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRha2VvdmVyKSByZXR1cm4gQUNRVUlSRV9TTE9XX0RFTEFZO1xuICAgIGlmIChEYXRlLm5vdygpID49IGdldEtpbGxUaW1lKCkgLSBBQ1FVSVJFX0ZBU1RfV0lORE9XKSB7XG4gICAgICAgIHJldHVybiBBQ1FVSVJFX0ZBU1RfREVMQVk7XG4gICAgfVxuICAgIHJldHVybiBBQ1FVSVJFX1NMT1dfREVMQVk7XG59XG4iXX0=
|
|
141
|
-
/* _JS_SOURCE_HASH = "
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95VGFrZW92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3lUYWtlb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLHFFQUF3RTtBQUV4RSxNQUFNLDhCQUE4QixHQUFHLDBCQUEwQixDQUFDO0FBQ2xFLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUMzQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDeEMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLHFNQUFxTTtBQUNyTSxNQUFNLDJCQUEyQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2xELE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNyQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQztBQUNoQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFjdEMsSUFBSSxRQUFvQyxDQUFDO0FBRXpDLFNBQVMsR0FBRyxDQUFDLElBQVk7SUFDckIsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBRUQsU0FBUyxTQUFTO0lBQ2QsT0FBTyxRQUFRLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxDQUFDO0FBRUQsU0FBUyxpQkFBaUI7SUFDdEIsT0FBTyxjQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25FLENBQUM7QUFFRCxLQUFLLFVBQVUsbUJBQW1COztJQUM5QixJ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LENBQUM7QUFIRCxrREFHQztBQUVELGlLQUFpSztBQUNqSyxTQUFnQix1QkFBdUI7SUFDbkMsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLGtCQUFrQixDQUFDO0lBQ3pDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLFdBQVcsRUFBRSxHQUFHLG1CQUFtQixFQUFFLENBQUM7UUFDcEQsT0FBTyxrQkFBa0IsQ0FBQztJQUM5QixDQUFDO0lBQ0QsT0FBTyxrQkFBa0IsQ0FBQztBQUM5QixDQUFDO0FBTkQsMERBTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgc3RhcnRJbnRlcm1lZGlhdGVNYWludGVuYW5jZSB9IGZyb20gXCIuL2ludGVybWVkaWF0ZU1hbmFnZW1lbnRcIjtcblxuY29uc3QgUEFSQU1FVEVSU19USU1FTElORV9GSUxFX1JFR0VYID0gL14oXFxkKyktcGFyYW1ldGVyc1xcLmpzb24kLztcbmNvbnN0IERFUExPWV9ERVRFQ1RfUkVUUllfREVMQVkgPSA1ICogMTAwMDtcbmNvbnN0IERFUExPWV9ERVRFQ1RfVElNRU9VVCA9IDMwICogMTAwMDtcbmNvbnN0IEVYSVRfTE9HX0ZMVVNIX0RFTEFZID0gNSAqIDEwMDA7XG5jb25zdCBBTFRfUE9SVF9MSU5HRVIgPSAzMCAqIDYwICogMTAwMDtcbi8vIFRoZSBlbmQgdGltZSBuZWVkcyB0byBiZSBlbm91Z2ggYWZ0ZXIgdGhlIGtpbGwgdGltZSB0aGF0IHdlIGFyZSBjZXJ0YWluIHdlIHdpbGwgaGF2ZSB0aGUgbWFpbiBwb3J0IGJ5IHRoZW4uIFNjYWxlZCB1cCB3aXRoIHRoZSBvdmVybGFwLCBzbyB1bnVzdWFsbHkgbG9uZyBvdmVybGFwcyBnZXQgYW4gZXF1YWxseSBnZW5lcm91cyBidWZmZXIuXG5jb25zdCBJTlRFUk1FRElBVEVfRU5EX01JTl9CVUZGRVIgPSA1ICogNjAgKiAxMDAwO1xuY29uc3QgQUNRVUlSRV9TTE9XX0RFTEFZID0gMzAgKiAxMDAwO1xuY29uc3QgQUNRVUlSRV9GQVNUX0RFTEFZID0gMTAwMDtcbmNvbnN0IEFDUVVJUkVfRkFTVF9XSU5ET1cgPSA2MCAqIDEwMDA7XG5cbnR5cGUgVGltZWxpbmVFbnRyeSA9IHtcbiAgICBwYXJhbWV0ZXJzOiB7IHJlbGVhc2VUaW1lPzogbnVtYmVyOyBvdmVybGFwVGltZT86IG51bWJlciB9O1xufTtcblxudHlwZSBEZXBsb3lUYWtlb3ZlciA9IHtcbiAgICByZWxlYXNlVGltZTogbnVtYmVyO1xuICAgIG92ZXJsYXBUaW1lOiBudW1iZXI7XG4gICAgYWx0UG9ydD86IG51bWJlcjtcbiAgICAvLyBGcm96ZW4gd2hlbiB0aGUgYWx0IHBvcnQgaXMgdGFrZW4gKGEgbW92aW5nIHN0YXJ0IHdvdWxkIG1ha2UgZXZlcnkgbWFpbnRlbmFuY2UgcGFzcyB3cml0ZSBhIG5ldyBjb25maWcpXG4gICAgaW50ZXJtZWRpYXRlU3RhcnQ/OiBudW1iZXI7XG59O1xuXG5sZXQgdGFrZW92ZXI6IERlcGxveVRha2VvdmVyIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc28odGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGltZSkudG9JU09TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gbG9nUHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbcGlkICR7cHJvY2Vzcy5waWR9XWA7XG59XG5cbmZ1bmN0aW9uIGdldFRpbWVsaW5lRm9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZShwcm9jZXNzLmN3ZCgpKS5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIikgKyBcIi9cIjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFRpbWVsaW5lRW50cmllcygpOiBQcm9taXNlPFRpbWVsaW5lRW50cnlbXT4ge1xuICAgIGxldCBmb2xkZXIgPSBnZXRUaW1lbGluZUZvbGRlcigpO1xuICAgIGxldCBmaWxlczogc3RyaW5nW107XG4gICAgdHJ5IHtcbiAgICAgICAgZmlsZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGZvbGRlcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCR7bG9nUHJlZml4KCl9IENvdWxkIG5vdCByZWFkIHRoZSBkZXBsb3kgdGltZWxpbmUgZm9sZGVyICR7Zm9sZGVyfTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsZXQgZW50cmllczogVGltZWxpbmVFbnRyeVtdID0gW107XG4gICAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBpZiAoIVBBUkFNRVRFUlNfVElNRUxJTkVfRklMRV9SRUdFWC50ZXN0KGZpbGUpKSBjb250aW51ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaChKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZvbGRlciArIGZpbGUsIFwidXRmOFwiKSkgYXMgVGltZWxpbmVFbnRyeSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHtsb2dQcmVmaXgoKX0gQ291bGQgbm90IHJlYWQgZGVwbG95IHRpbWVsaW5lIGZpbGUgJHtmb2xkZXIgKyBmaWxlfTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZW50cmllcztcbn1cblxuLy8gVGhlIG5ld2VzdCByZWxlYXNlIGluIHRoZSB0aW1lbGluZSBpcyB0aGUgb25lIHdlIGFyZSBwYXJ0IG9mIC0gdGhlIHRpbWVsaW5lIGlzIGFwcGVuZC1vbmx5IGhpc3RvcnksIHNvIHdoYXRldmVyIHByb2Nlc3Mgc3RhcnRzIHVwIGR1cmluZyBhIHRha2VvdmVyIGJlbG9uZ3MgdG8gaXRzIGxhdGVzdCBlbnRyeVxuZnVuY3Rpb24gZmluZE91clJlbGVhc2UoZW50cmllczogVGltZWxpbmVFbnRyeVtdKTogRGVwbG95VGFrZW92ZXIgfCB1bmRlZmluZWQge1xuICAgIGxldCBiZXN0OiBEZXBsb3lUYWtlb3ZlciB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGxldCByZWxlYXNlVGltZSA9IGVudHJ5LnBhcmFtZXRlcnMucmVsZWFzZVRpbWU7XG4gICAgICAgIGlmIChyZWxlYXNlVGltZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgbGV0IG92ZXJsYXBUaW1lID0gZW50cnkucGFyYW1ldGVycy5vdmVybGFwVGltZSB8fCAwO1xuICAgICAgICBpZiAoYmVzdCAmJiBiZXN0LnJlbGVhc2VUaW1lID49IHJlbGVhc2VUaW1lKSBjb250aW51ZTtcbiAgICAgICAgYmVzdCA9IHsgcmVsZWFzZVRpbWUsIG92ZXJsYXBUaW1lIH07XG4gICAgfVxuICAgIHJldHVybiBiZXN0O1xufVxuXG4vKiogQ2FsbGVkIHdoZW4gdGhlIG1haW4gcG9ydCBpcyBhbHJlYWR5IGluIHVzZSwgd2hpY2ggb24gYSBoZWFsdGh5IG1hY2hpbmUgb25seSBoYXBwZW5zIHdoaWxlIG91ciBwcmVkZWNlc3NvciBpcyBzdGlsbCBydW5uaW5nIGEgZGVwbG95IG92ZXJsYXAuIENvbmZpcm1zIHRoYXQgYWdhaW5zdCB0aGUgZGVwbG95IHRpbWVsaW5lOyBpZiBubyBkZXBsb3kgaXMgaW4gcHJvZ3Jlc3Mgd2UgYXJlIGluIGEgYmFkIHN0YXRlIChzb21lb25lIGVsc2UgaG9sZHMgb3VyIHBvcnQpIGFuZCB0aGUgcHJvY2VzcyBtdXN0IG5vdCBrZWVwIHJ1bm5pbmcuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV0ZWN0RGVwbG95VGFrZW92ZXIoKTogUHJvbWlzZTxEZXBsb3lUYWtlb3Zlcj4ge1xuICAgIGNvbnNvbGUud2FybihgJHtsb2dQcmVmaXgoKX0gT3VyIG1haW4gcG9ydCBpcyBpbiB1c2UsIHdoaWNoIHNob3VsZCBvbmx5IGhhcHBlbiB3aGlsZSBhIGRlcGxveSBvdmVybGFwIGlzIHJ1bm5pbmcgLSBjaGVja2luZyB0aGUgZGVwbG95IHRpbWVsaW5lIGluICR7Z2V0VGltZWxpbmVGb2xkZXIoKX0gZm9yIHRoZSByZWxlYXNlIHdlIGFyZSBwYXJ0IG9mYCk7XG4gICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICBsZXQgZW50cmllcyA9IGF3YWl0IHJlYWRUaW1lbGluZUVudHJpZXMoKTtcbiAgICAgICAgbGV0IGZvdW5kID0gZmluZE91clJlbGVhc2UoZW50cmllcyk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgdGFrZW92ZXIgPSBmb3VuZDtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHtsb2dQcmVmaXgoKX0gRGVwbG95IHRha2VvdmVyIGNvbmZpcm1lZCBvbiBhdHRlbXB0ICR7YXR0ZW1wdH06IHJlbGVhc2UgYXQgJHtpc28oZm91bmQucmVsZWFzZVRpbWUpfSwgb3ZlcmxhcCAke2ZvdW5kLm92ZXJsYXBUaW1lfW1zLCBzbyBvdXIgcHJlZGVjZXNzb3IgaG9sZHMgdGhlIG1haW4gcG9ydCB1bnRpbCAke2lzbyhmb3VuZC5yZWxlYXNlVGltZSArIGZvdW5kLm92ZXJsYXBUaW1lKX0uIFdlIGFyZSB0aGUgc3VjY2Vzc29yLmApO1xuICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHN0YXJ0O1xuICAgICAgICBpZiAoZWxhcHNlZCA+PSBERVBMT1lfREVURUNUX1RJTUVPVVQpIHtcbiAgICAgICAgICAgIC8vIE5vdCBhIGRlcGxveSwgc28gc29tZXRoaW5nIGVsc2UgaG9sZHMgb3VyIHBvcnQgYW5kIG5vdGhpbmcgd2UgZG8gZnJvbSBoZXJlIGlzIGNvcnJlY3QuIEV4aXQsIGdpdmluZyB0aGUgbG9nIHRpbWUgdG8gcmVhY2ggdGhlIGRpc2sgZmlyc3QgLSB0aGUgbWVzc2FnZSBpcyB0aGUgb25seSB0aGluZyB0aGF0IGV4cGxhaW5zIHRoZSBleGl0LlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtsb2dQcmVmaXgoKX0gT3VyIG1haW4gcG9ydCBpcyBpbiB1c2UsIGJ1dCB0aGUgZGVwbG95IHRpbWVsaW5lIGluICR7Z2V0VGltZWxpbmVGb2xkZXIoKX0gc2hvd2VkIG5vIHJlbGVhc2UgaW4gcHJvZ3Jlc3MgYWNyb3NzICR7YXR0ZW1wdH0gY2hlY2tzIG92ZXIgJHtlbGFwc2VkfW1zLiBTb21ldGhpbmcgZWxzZSBpcyBob2xkaW5nIG91ciBwb3J0LCBzbyB0aGlzIHByb2Nlc3MgaXMgaW4gYSBiYWQgc3RhdGUuIEV4aXRpbmcgaW4gJHtFWElUX0xPR19GTFVTSF9ERUxBWX1tcy5gKTtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBFWElUX0xPR19GTFVTSF9ERUxBWSkpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihgJHtsb2dQcmVmaXgoKX0gTm8gcmVsZWFzZSBpbiBwcm9ncmVzcyBpbiB0aGUgZGVwbG95IHRpbWVsaW5lIHlldCAoYXR0ZW1wdCAke2F0dGVtcHR9LCAke2VsYXBzZWR9bXMgb2YgJHtERVBMT1lfREVURUNUX1RJTUVPVVR9bXMpOyByZXRyeWluZyBpbiAke0RFUExPWV9ERVRFQ1RfUkVUUllfREVMQVl9bXNgKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIERFUExPWV9ERVRFQ1RfUkVUUllfREVMQVkpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBbHRQb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGFrZW92ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbiBhbHRlcm5hdGUgcG9ydCAoJHtwb3J0fSkgd2FzIHRha2VuIHdpdGhvdXQgYSBkZXRlY3RlZCBkZXBsb3kgdGFrZW92ZXIgLSBkZXRlY3REZXBsb3lUYWtlb3ZlciBtdXN0IHJ1biBmaXJzdGApO1xuICAgIH1cbiAgICB0YWtlb3Zlci5hbHRQb3J0ID0gcG9ydDtcbiAgICAvLyBOZWVkcyB0byBiZSBlbm91Z2ggYWZ0ZXIgb3VyIHN0YXJ0dXAgdGltZSB0aGF0IHRoZSBwcmV2aW91cyBub2RlIGhhcyB0aW1lIHRvIHNlZSBpdCdzIGdvaW5nIHRvIGJlIHNodXQgZG93biBhbmQgZmx1c2ggKGFuZCBzbyB3ZSBoYXZlIHRpbWUgdG8gc3RhcnQgdXApLCBhbmQgZW5vdWdoIGJlZm9yZSB0aGUga2lsbCB0aW1lIHRoYXQgbm9kZXMgaGF2ZSB0aW1lIHRvIG5vdGljZSB3ZSBleGlzdCBhbmQgcHJlcGFyZSB0byBjb25uZWN0IHRvIHVzIC0gaGFsZndheSBiZXR3ZWVuIG5vdyBhbmQgdGhlIGtpbGwgdGltZSBzYXRpc2ZpZXMgYm90aFxuICAgIHRha2VvdmVyLmludGVybWVkaWF0ZVN0YXJ0ID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSArIGdldEtpbGxUaW1lKCkpIC8gMik7XG4gICAgY29uc29sZS53YXJuKGAke2xvZ1ByZWZpeCgpfSBMaXN0ZW5pbmcgb24gYWx0ZXJuYXRlIHBvcnQgJHtwb3J0fTogd3JpdGVzIHJvdXRlIGhlcmUgZnJvbSAke2lzbyh0YWtlb3Zlci5pbnRlcm1lZGlhdGVTdGFydCl9IHVudGlsICR7aXNvKGdldEludGVybWVkaWF0ZUVuZCgpKX0sIGFuZCB3ZSBrZWVwIGxpc3RlbmluZyB1bnRpbCAke2lzbyhnZXRBbHRQb3J0TGlzdGVuRW5kKCkpfWApO1xuICAgIHN0YXJ0SW50ZXJtZWRpYXRlTWFpbnRlbmFuY2UoKTtcbn1cblxuLyoqIFRoZSB3aW5kb3cgaW4gd2hpY2ggd3JpdGVzIGJlbG9uZyB0byBvdXIgYWx0ZXJuYXRlIHBvcnQ6IGZyb20gcGFydHdheSB0aHJvdWdoIHRoZSBvdmVybGFwIChnaXZpbmcgdGhlIHByZWRlY2Vzc29yIG5vdGljZSB0byBmbHVzaCkgdW50aWwgc2FmZWx5IHBhc3QgaXRzIGtpbGwgKGdpdmluZyB1cyB0aW1lIHRvIGFjdHVhbGx5IHRha2UgdGhlIG1haW4gcG9ydCkuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFrZW92ZXJJbnRlcm1lZGlhdGUoKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgYWx0UG9ydDogbnVtYmVyIH0gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGFrZW92ZXI/LmFsdFBvcnQgfHwgdGFrZW92ZXIuaW50ZXJtZWRpYXRlU3RhcnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBzdGFydDogdGFrZW92ZXIuaW50ZXJtZWRpYXRlU3RhcnQsIGVuZDogZ2V0SW50ZXJtZWRpYXRlRW5kKCksIGFsdFBvcnQ6IHRha2VvdmVyLmFsdFBvcnQgfTtcbn1cblxuLyoqIFdoZW4gb3VyIHByZWRlY2Vzc29yIGlzIGtpbGxlZCBhbmQgdGhlIG1haW4gcG9ydCBmcmVlcy4gUG9ydCBhY3F1aXNpdGlvbiBwb2xscyBhZ2FpbnN0IHRoaXMgb24gaXRzIG93biAtIGl0IGlzIGVudGlyZWx5IGluZGVwZW5kZW50IG9mIHRoZSBpbnRlcm1lZGlhdGUgd2luZG93LiAqL1xuZnVuY3Rpb24gZ2V0S2lsbFRpbWUoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRha2VvdmVyKSByZXR1cm4gMDtcbiAgICByZXR1cm4gdGFrZW92ZXIucmVsZWFzZVRpbWUgKyB0YWtlb3Zlci5vdmVybGFwVGltZTtcbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJtZWRpYXRlRW5kKCk6IG51bWJlciB7XG4gICAgaWYgKCF0YWtlb3ZlcikgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGdldEtpbGxUaW1lKCkgKyBNYXRoLm1heChJTlRFUk1FRElBVEVfRU5EX01JTl9CVUZGRVIsIHRha2VvdmVyLm92ZXJsYXBUaW1lKTtcbn1cblxuLyoqIFdlIG5ldmVyIHN0b3AgbGlzdGVuaW5nIG9uIHRoZSBhbHRlcm5hdGUgcG9ydCB3aGlsZSBpdHMgd2luZG93IGlzIHN0aWxsIHZhbGlkLCBhbmQgaG9sZCBpdCB3ZWxsIHBhc3QgdGhhdCBmb3IgY2xpZW50cyB0aGF0IGhhdmUgbm90IGNhdWdodCB1cCB5ZXQuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWx0UG9ydExpc3RlbkVuZCgpOiBudW1iZXIge1xuICAgIGlmICghdGFrZW92ZXIpIHJldHVybiAwO1xuICAgIHJldHVybiBNYXRoLm1heCh0YWtlb3Zlci5yZWxlYXNlVGltZSArIHRha2VvdmVyLm92ZXJsYXBUaW1lICogMiwgZ2V0SW50ZXJtZWRpYXRlRW5kKCkgKyBBTFRfUE9SVF9MSU5HRVIpO1xufVxuXG4vKiogSG93IGxvbmcgdG8gd2FpdCBiZXR3ZWVuIG1haW4tcG9ydCBhY3F1aXNpdGlvbiBhdHRlbXB0czogdGlnaHQgYXJvdW5kIG91ciBwcmVkZWNlc3NvcidzIHNjaGVkdWxlZCBkZWF0aCAod2hlbiB0aGUgcG9ydCBhY3R1YWxseSBmcmVlcyksIHJlbGF4ZWQgb3RoZXJ3aXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW5Qb3J0QWNxdWlyZURlbGF5KCk6IG51bWJlciB7XG4gICAgaWYgKCF0YWtlb3ZlcikgcmV0dXJuIEFDUVVJUkVfU0xPV19ERUxBWTtcbiAgICBpZiAoRGF0ZS5ub3coKSA+PSBnZXRLaWxsVGltZSgpIC0gQUNRVUlSRV9GQVNUX1dJTkRPVykge1xuICAgICAgICByZXR1cm4gQUNRVUlSRV9GQVNUX0RFTEFZO1xuICAgIH1cbiAgICByZXR1cm4gQUNRVUlSRV9TTE9XX0RFTEFZO1xufVxuIl19
|
|
141
|
+
/* _JS_SOURCE_HASH = "11ff1075ff67636a0f2c166f6aee2bcab11c81d67b911b589da0927f01baea4a"; */
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
|
+
//exports.startIntermediateMaintenance = exports.reinjectIntermediates = exports.scheduleBoundaryWork = void 0;
|
|
4
|
+
const caching_1 = require("socket-function/src/caching");
|
|
5
|
+
const batching_1 = require("socket-function/src/batching");
|
|
6
|
+
const remoteConfig_1 = require("./remoteConfig");
|
|
7
|
+
const intermediateSources_1 = require("./intermediateSources");
|
|
8
|
+
const deployTakeover_1 = require("./deployTakeover");
|
|
9
|
+
const serverConfig_1 = require("./serverConfig");
|
|
10
|
+
const createArchives_1 = require("./createArchives");
|
|
11
|
+
const storePlan_1 = require("./storePlan");
|
|
12
|
+
const storageServerState_1 = require("./storageServerState");
|
|
13
|
+
const ArchivesDelayed_1 = require("./ArchivesDelayed");
|
|
14
|
+
const blobStore_1 = require("./blobStore");
|
|
15
|
+
// Deploy switchovers, and the handovers they cause. A switchover is a source moving to a new port for a few minutes: we give it a virtual valid window on that port (an "intermediate"), which means the write target changes twice in quick succession, which means the store taking over has to go and collect the writes that landed just before it did. None of that is storage - it is scheduling - so it lives here rather than in the store or in the server's bucket state.
|
|
16
|
+
const MAX_TIMER_DELAY = 2 ** 31 - 1;
|
|
17
|
+
const BOUNDARY_BUFFER = 1000;
|
|
18
|
+
// A handover is scanned just before the boundary, just after, and again a little later - the last writes to the old target can land after the boundary itself
|
|
19
|
+
const BOUNDARY_SCAN_OFFSETS = [-30 * 1000, 2 * 1000, 30 * 1000];
|
|
20
|
+
// How far back a boundary scan asks for changes: everything that could still have been buffered when the window ended
|
|
21
|
+
const BOUNDARY_SCAN_LOOKBACK = ArchivesDelayed_1.DEFAULT_FAST_WRITE_DELAY + blobStore_1.WINDOW_END_FLUSH_MARGIN;
|
|
22
|
+
const STARTUP_BOUNDARY_SCAN_DELAY = 30 * 1000;
|
|
23
|
+
const OWN_CONFIG_WRITE_THROTTLE = 30 * 1000;
|
|
24
|
+
const INTERMEDIATE_MAINTAIN_INTERVAL = 60 * 1000;
|
|
25
|
+
const scheduledBoundaryScans = new Set();
|
|
26
|
+
const boundaryScansRunning = new Set();
|
|
27
|
+
/** Called whenever a bucket's state is (re)built: arms the scans its upcoming window boundaries need. Each scan is scheduled once - the key includes the boundary it is for - so re-arming on every config change is harmless. */
|
|
28
|
+
function scheduleBoundaryWork(loaded) {
|
|
29
|
+
var _a, _b;
|
|
30
|
+
let key = `${loaded.account}/${loaded.bucketName}`;
|
|
31
|
+
let now = Date.now();
|
|
32
|
+
let starts = new Set();
|
|
33
|
+
for (let self of loaded.selfEntries) {
|
|
34
|
+
let start = self.validWindow[0];
|
|
35
|
+
if (start > now && start < Number.MAX_SAFE_INTEGER) {
|
|
36
|
+
starts.add(start);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// A window we have only just taken over, on a server that has only just started: the boundary happened while we were not running, so its scan still has to happen
|
|
40
|
+
for (let self of loaded.selfEntries) {
|
|
41
|
+
let [start, end] = self.validWindow;
|
|
42
|
+
if (!(start <= now && now < end) || start <= 0)
|
|
43
|
+
continue;
|
|
44
|
+
if (now - start > BOUNDARY_SCAN_LOOKBACK)
|
|
45
|
+
continue;
|
|
46
|
+
let scheduleKey = `${key}|${start}|startup`;
|
|
47
|
+
if (scheduledBoundaryScans.has(scheduleKey))
|
|
48
|
+
continue;
|
|
49
|
+
scheduledBoundaryScans.add(scheduleKey);
|
|
50
|
+
let timer = setTimeout(() => {
|
|
51
|
+
void runBoundaryScan(loaded, start, STARTUP_BOUNDARY_SCAN_DELAY, "startup+30s").catch((e) => { var _a; return console.error(`Boundary scan for bucket ${key} failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); });
|
|
52
|
+
}, STARTUP_BOUNDARY_SCAN_DELAY);
|
|
53
|
+
(_b = (_a = timer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
54
|
+
}
|
|
55
|
+
for (let start of starts) {
|
|
56
|
+
for (let offset of BOUNDARY_SCAN_OFFSETS) {
|
|
57
|
+
let at = start + offset;
|
|
58
|
+
if (at <= now)
|
|
59
|
+
continue;
|
|
60
|
+
let scheduleKey = `${key}|${start}|${offset}`;
|
|
61
|
+
if (scheduledBoundaryScans.has(scheduleKey))
|
|
62
|
+
continue;
|
|
63
|
+
scheduledBoundaryScans.add(scheduleKey);
|
|
64
|
+
// Re-armed rather than trusted: a long timer can fire early after a suspend, and firing early would scan for a handover that has not happened
|
|
65
|
+
let arm = () => {
|
|
66
|
+
var _a, _b;
|
|
67
|
+
let timer = setTimeout(() => {
|
|
68
|
+
if (Date.now() < at) {
|
|
69
|
+
arm();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
void runBoundaryScan(loaded, start, offset).catch((e) => { var _a; return console.error(`Boundary scan for bucket ${key} failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); });
|
|
73
|
+
}, Math.min(at - Date.now(), MAX_TIMER_DELAY));
|
|
74
|
+
(_b = (_a = timer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
75
|
+
};
|
|
76
|
+
arm();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.scheduleBoundaryWork = scheduleBoundaryWork;
|
|
81
|
+
/** Collects the writes that landed on the previous window's owners just before a boundary, into the store that has just taken over. Who owned what is worked out purely from the config (see previousWindowOwners); this only does the pulling. */
|
|
82
|
+
async function runBoundaryScan(loaded, windowStart, offset, offsetLabel) {
|
|
83
|
+
var _a;
|
|
84
|
+
let key = `${loaded.account}/${loaded.bucketName}`;
|
|
85
|
+
let label = `bucket ${key}, window starting ${new Date(windowStart).toISOString()}, offset ${offsetLabel || `${offset / 1000}s`}`;
|
|
86
|
+
if (boundaryScansRunning.has(key)) {
|
|
87
|
+
console.log(`Skipping boundary scan (${label}): the previous boundary scan is still running`);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
boundaryScansRunning.add(key);
|
|
91
|
+
try {
|
|
92
|
+
let effective = loaded.routing;
|
|
93
|
+
if (!effective)
|
|
94
|
+
return;
|
|
95
|
+
let handovers = (0, storePlan_1.previousWindowOwners)(effective, windowStart, (0, storePlan_1.findSelfIndexes)(effective, loaded.account, loaded.bucketName));
|
|
96
|
+
if (!handovers.length)
|
|
97
|
+
return;
|
|
98
|
+
console.log(`Boundary scan (${label}): ${handovers.length} route(s) taking over: ${handovers.map(x => `${JSON.stringify(x.route)} from ${x.scanOwnDisk && "our own disk" || ""}${x.scanOwnDisk && x.remotes.size && " + " || ""}${[...x.remotes.keys()].map(i => `source ${i}`).join(", ")}`).join("; ")}`);
|
|
99
|
+
let since = windowStart - BOUNDARY_SCAN_LOOKBACK;
|
|
100
|
+
for (let handover of handovers) {
|
|
101
|
+
let selfStore = loaded.stores.find(x => x.name === handover.name);
|
|
102
|
+
if (!selfStore)
|
|
103
|
+
continue;
|
|
104
|
+
if (handover.scanOwnDisk) {
|
|
105
|
+
await selfStore.store.rescanBase();
|
|
106
|
+
}
|
|
107
|
+
for (let [sourceIndex, route] of handover.remotes) {
|
|
108
|
+
let ownerSource = effective.sources[sourceIndex];
|
|
109
|
+
if (typeof ownerSource === "string")
|
|
110
|
+
continue;
|
|
111
|
+
try {
|
|
112
|
+
await selfStore.store.boundaryScanRemote((0, createArchives_1.createApiArchives)(ownerSource), { since, route });
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
console.error(`Boundary scan (${label}) of previous-window owner (source index ${sourceIndex}) failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
boundaryScansRunning.delete(key);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** An operator's config knows nothing about a switchover that is in flight right now, so writing it as-is would cancel one mid-handover. The in-flight windows are put back into it first. */
|
|
125
|
+
function reinjectIntermediates(current, incoming) {
|
|
126
|
+
if (!current)
|
|
127
|
+
return incoming;
|
|
128
|
+
let stored = incoming;
|
|
129
|
+
let reinjected = 0;
|
|
130
|
+
for (let intermediate of (0, intermediateSources_1.getIntermediateSources)((0, intermediateSources_1.expireIntermediateSources)(current, Date.now()))) {
|
|
131
|
+
stored = (0, intermediateSources_1.injectIntermediateSource)(stored, {
|
|
132
|
+
splitUrl: intermediate.intermediate || intermediate.url,
|
|
133
|
+
intermediateUrl: intermediate.url,
|
|
134
|
+
start: intermediate.validWindow[0],
|
|
135
|
+
end: intermediate.validWindow[1],
|
|
136
|
+
});
|
|
137
|
+
reinjected++;
|
|
138
|
+
}
|
|
139
|
+
if (reinjected) {
|
|
140
|
+
console.log(`Re-injected ${reinjected} in-flight switchover window(s) into an incoming routing config (version ${(0, remoteConfig_1.getConfigVersion)(incoming)})`);
|
|
141
|
+
}
|
|
142
|
+
return stored;
|
|
143
|
+
}
|
|
144
|
+
exports.reinjectIntermediates = reinjectIntermediates;
|
|
145
|
+
// Per bucket, not global: a switchover has to write every bucket's windows at once, and a shared throttle would let only one bucket through per interval
|
|
146
|
+
const lastOwnConfigWrite = new Map();
|
|
147
|
+
async function writeOwnRoutingConfig(loaded, updated, reason) {
|
|
148
|
+
let key = `${loaded.account}/${loaded.bucketName}`;
|
|
149
|
+
let sinceLast = Date.now() - (lastOwnConfigWrite.get(key) || 0);
|
|
150
|
+
if (sinceLast < OWN_CONFIG_WRITE_THROTTLE) {
|
|
151
|
+
console.log(`Not writing our own routing config update for bucket ${key} (${reason}): the last one was ${sinceLast}ms ago, under the ${OWN_CONFIG_WRITE_THROTTLE}ms throttle. Retrying on the next maintenance pass.`);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
lastOwnConfigWrite.set(key, Date.now());
|
|
155
|
+
// A switchover writes on top of whatever the bucket is running; with no config at all there is nothing to switch over
|
|
156
|
+
if (!loaded.routing)
|
|
157
|
+
return;
|
|
158
|
+
let currentVersion = (0, remoteConfig_1.getConfigVersion)(loaded.routing);
|
|
159
|
+
let version = (0, intermediateSources_1.nextIntermediateVersion)(currentVersion);
|
|
160
|
+
let next = { ...updated, version };
|
|
161
|
+
console.log(`Writing ${remoteConfig_1.ROUTING_FILE} for bucket ${key} (${reason}), version ${currentVersion} -> ${version}: ${JSON.stringify(next)}`);
|
|
162
|
+
let data = Buffer.from((0, remoteConfig_1.serializeRemoteConfig)(next));
|
|
163
|
+
// Into one of our own stores - it applies it and its peers pull it - and directly to the other servers, which is what makes a switchover take effect in seconds rather than at the next poll
|
|
164
|
+
let ourStore = loaded.stores[0];
|
|
165
|
+
if (ourStore) {
|
|
166
|
+
await (0, storageServerState_1.writeRoutingConfig)(loaded.account, loaded.bucketName, ourStore.name, data);
|
|
167
|
+
}
|
|
168
|
+
await propagateRoutingConfig(loaded, next, data);
|
|
169
|
+
}
|
|
170
|
+
async function propagateRoutingConfig(loaded, next, data) {
|
|
171
|
+
var _a, _b;
|
|
172
|
+
let targets = new Map();
|
|
173
|
+
for (let source of [...((_a = loaded.routing) === null || _a === void 0 ? void 0 : _a.sources) || [], ...next.sources]) {
|
|
174
|
+
if (typeof source === "string" || source.intermediate)
|
|
175
|
+
continue;
|
|
176
|
+
if (source.type === "remote") {
|
|
177
|
+
let parsed = (0, remoteConfig_1.parseHostedUrl)(source.url);
|
|
178
|
+
if (parsed.account !== loaded.account || parsed.bucketName !== loaded.bucketName)
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
if (targets.has(source.url))
|
|
182
|
+
continue;
|
|
183
|
+
targets.set(source.url, source);
|
|
184
|
+
}
|
|
185
|
+
for (let [url, source] of targets) {
|
|
186
|
+
try {
|
|
187
|
+
await (0, createArchives_1.createApiArchives)(source).set(remoteConfig_1.ROUTING_FILE, data);
|
|
188
|
+
console.log(`Wrote ${remoteConfig_1.ROUTING_FILE} for bucket ${loaded.account}/${loaded.bucketName} to ${url}`);
|
|
189
|
+
}
|
|
190
|
+
catch (e) {
|
|
191
|
+
console.error(`Propagating our routing config update to ${url} failed: ${(_b = e.stack) !== null && _b !== void 0 ? _b : e}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/** Keeps every loaded bucket's switchover windows current: gives our alternate port its window while a takeover is in flight, and takes expired ones back out. */
|
|
196
|
+
async function maintainIntermediates() {
|
|
197
|
+
let { domain, port } = (0, serverConfig_1.getStorageServerConfig)();
|
|
198
|
+
let takeover = (0, deployTakeover_1.getTakeoverIntermediate)();
|
|
199
|
+
let written = [];
|
|
200
|
+
let alreadyCorrect = [];
|
|
201
|
+
let notOurs = [];
|
|
202
|
+
// ONLY buckets already in memory. A switchover must never load a bucket: loading starts its synchronization, and buckets nothing has touched (legacy ones especially) have no writes to hand off in the first place. One that does get used mid-switchover loads on that access, and the next pass gives it its window.
|
|
203
|
+
let states = (0, storageServerState_1.getBucketStates)();
|
|
204
|
+
for (let loaded of states) {
|
|
205
|
+
let key = `${loaded.account}/${loaded.bucketName}`;
|
|
206
|
+
let routing = loaded.routing;
|
|
207
|
+
if (!routing)
|
|
208
|
+
continue;
|
|
209
|
+
let expired = (0, intermediateSources_1.expireIntermediateSources)(routing, Date.now());
|
|
210
|
+
if (JSON.stringify(expired) !== JSON.stringify(routing)) {
|
|
211
|
+
await writeOwnRoutingConfig(loaded, expired, `switchover windows expired more than ${intermediateSources_1.INTERMEDIATE_EXPIRE_GRACE / 1000}s ago`);
|
|
212
|
+
written.push(key);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (!takeover)
|
|
216
|
+
continue;
|
|
217
|
+
let mainUrl = routing.sources.find(x => {
|
|
218
|
+
if (typeof x === "string" || x.type !== "remote" || x.intermediate)
|
|
219
|
+
return false;
|
|
220
|
+
let parsed = (0, remoteConfig_1.parseHostedUrl)(x.url);
|
|
221
|
+
return parsed.address === domain && parsed.port === port;
|
|
222
|
+
});
|
|
223
|
+
if (!mainUrl) {
|
|
224
|
+
notOurs.push(key);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
let injected = (0, intermediateSources_1.injectIntermediateSource)(routing, {
|
|
228
|
+
splitUrl: mainUrl.url,
|
|
229
|
+
intermediateUrl: (0, remoteConfig_1.replaceHostedUrlPort)(mainUrl.url, takeover.altPort),
|
|
230
|
+
start: takeover.start,
|
|
231
|
+
end: takeover.end,
|
|
232
|
+
});
|
|
233
|
+
if (JSON.stringify(injected) === JSON.stringify(routing)) {
|
|
234
|
+
alreadyCorrect.push(key);
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
await writeOwnRoutingConfig(loaded, injected, `we are a deploy successor: writes route to our alternate port ${takeover.altPort} from ${new Date(takeover.start).toISOString()} until our predecessor is killed at ${new Date(takeover.end).toISOString()}`);
|
|
238
|
+
written.push(key);
|
|
239
|
+
}
|
|
240
|
+
if (!takeover)
|
|
241
|
+
return;
|
|
242
|
+
if (!states.length) {
|
|
243
|
+
console.log(`No active buckets, so no config files to write the intermediate into (a bucket is only active once something uses it)`);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (!written.length) {
|
|
247
|
+
console.log(`Wrote no config files: of ${states.length} active buckets, ${alreadyCorrect.length} already contain the intermediate and ${notOurs.length} are not hosted by us`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/** Our predecessor still holds the main port and has been serving all along, so it - not us - knows which buckets are in use. We activate exactly those, which is what makes their config files get the intermediate; nothing else on disk is touched. */
|
|
251
|
+
async function activatePredecessorBuckets() {
|
|
252
|
+
var _a, _b;
|
|
253
|
+
let { domain, port } = (0, serverConfig_1.getStorageServerConfig)();
|
|
254
|
+
let url = `https://${domain}:${port}`;
|
|
255
|
+
let keys;
|
|
256
|
+
try {
|
|
257
|
+
keys = await (0, createArchives_1.listServerActiveBucketKeys)({ url });
|
|
258
|
+
}
|
|
259
|
+
catch (e) {
|
|
260
|
+
console.error(`Could not ask our predecessor on ${url} which buckets are active, so only buckets used on this process get the intermediate: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (!keys.length) {
|
|
264
|
+
console.log(`Our predecessor on ${url} has no active buckets, so there are no config files to write the intermediate into`);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
console.log(`Our predecessor on ${url} has ${keys.length} active buckets, activating them here so their config files get the intermediate: ${keys.map(x => `${x.account}/${x.bucketName}`).join(", ")}`);
|
|
268
|
+
for (let { account, bucketName } of keys) {
|
|
269
|
+
try {
|
|
270
|
+
await (0, storageServerState_1.getLoadedBucket)(account, bucketName);
|
|
271
|
+
}
|
|
272
|
+
catch (e) {
|
|
273
|
+
console.error(`Activating bucket ${account}/${bucketName} (active on our predecessor) failed: ${(_b = e.stack) !== null && _b !== void 0 ? _b : e}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/** Started by deployTakeover once we are actually a deploy successor listening on an alternate port. Until then there are no switchover windows to write or expire, so nothing polls. */
|
|
278
|
+
exports.startIntermediateMaintenance = (0, caching_1.lazy)(() => {
|
|
279
|
+
void (async () => {
|
|
280
|
+
await activatePredecessorBuckets();
|
|
281
|
+
await maintainIntermediates();
|
|
282
|
+
})().catch((e) => { var _a; return console.error(`Writing the intermediate into the config files failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); });
|
|
283
|
+
(0, batching_1.runInfinitePoll)(INTERMEDIATE_MAINTAIN_INTERVAL, maintainIntermediates);
|
|
284
|
+
});
|
|
285
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJtZWRpYXRlTWFuYWdlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImludGVybWVkaWF0ZU1hbmFnZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseURBQW1EO0FBQ25ELDJEQUErRDtBQUUvRCxpREFBNkg7QUFDN0gsK0RBQXdLO0FBQ3hLLHFEQUEyRDtBQUMzRCxpREFBd0Q7QUFDeEQscURBQWlGO0FBQ2pGLDJDQUFvRTtBQUNwRSw2REFBeUc7QUFDekcsdURBQTZEO0FBQzdELDJDQUFzRDtBQUV0RCxvZEFBb2Q7QUFFcGQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDcEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBQzdCLDhKQUE4SjtBQUM5SixNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ2hFLHNIQUFzSDtBQUN0SCxNQUFNLHNCQUFzQixHQUFHLDBDQUF3QixHQUFHLG1DQUF1QixDQUFDO0FBQ2xGLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM5QyxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDNUMsTUFBTSw4QkFBOEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRWpELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUNqRCxNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFFL0Msa09BQWtPO0FBQ2xPLFNBQWdCLG9CQUFvQixDQUFDLE1BQW1COztJQUNwRCxJQUFJLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ25ELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxH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QUMvQyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLE9BQU8sSUFBSSxVQUFVLHdDQUF3QyxNQUFDLENBQVcsQ0FBQyxLQUFLLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0gsQ0FBQztJQUNMLENBQUM7QUFDTCxDQUFDO0FBRUQseUxBQXlMO0FBQzVLLFFBQUEsNEJBQTRCLEdBQUcsSUFBQSxjQUFJLEVBQUMsR0FBRyxFQUFFO0lBQ2xELEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNiLE1BQU0sMEJBQTBCLEVBQUUsQ0FBQztRQUNuQyxNQUFNLHFCQUFxQixFQUFFLENBQUM7SUFDbEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFRLEVBQUUsRUFBRSxXQUFDLE9BQUEsT0FBTyxDQUFDLEtBQUssQ0FBQywwREFBMEQsTUFBQSxDQUFDLENBQUMsS0FBSyxtQ0FBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBLEVBQUEsQ0FBQyxDQUFDO0lBQ2xILElBQUEsMEJBQWUsRUFBQyw4QkFBOEIsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0FBQzNFLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBSZW1vdGVDb25maWcsIFNvdXJjZUNvbmZpZywgSG9zdGVkQ29uZmlnIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBnZXRDb25maWdWZXJzaW9uLCBzZXJpYWxpemVSZW1vdGVDb25maWcsIHBhcnNlSG9zdGVkVXJsLCByZXBsYWNlSG9zdGVkVXJsUG9ydCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgaW5qZWN0SW50ZXJtZWRpYXRlU291cmNlLCBleHBpcmVJbnRlcm1lZGlhdGVTb3VyY2VzLCBnZXRJbnRlcm1lZGlhdGVTb3VyY2VzLCBuZXh0SW50ZXJtZWRpYXRlVmVyc2lvbiwgSU5URVJNRURJQVRFX0VYUElSRV9HUkFDRSB9IGZyb20gXCIuL2ludGVybWVkaWF0ZVNvdXJjZXNcIjtcbmltcG9ydCB7IGdldFRha2VvdmVySW50ZXJtZWRpYXRlIH0gZnJvbSBcIi4vZGVwbG95VGFrZW92ZXJcIjtcbmltcG9ydCB7IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcgfSBmcm9tIFwiLi9zZXJ2ZXJDb25maWdcIjtcbmltcG9ydCB7IGNyZWF0ZUFwaUFyY2hpdmVzLCBsaXN0U2VydmVyQWN0aXZlQnVja2V0S2V5cyB9IGZyb20gXCIuL2NyZWF0ZUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBmaW5kU2VsZkluZGV4ZXMsIHByZXZpb3VzV2luZG93T3duZXJzIH0gZnJvbSBcIi4vc3RvcmVQbGFuXCI7XG5pbXBvcnQgeyBCdWNrZXRTdGF0ZSwgZ2V0QnVja2V0U3RhdGVzLCBnZXRMb2FkZWRCdWNrZXQsIHdyaXRlUm91dGluZ0NvbmZpZyB9IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJTdGF0ZVwiO1xuaW1wb3J0IHsgREVGQVVMVF9GQVNUX1dSSVRFX0RFTEFZIH0gZnJvbSBcIi4vQXJjaGl2ZXNEZWxheWVkXCI7XG5pbXBvcnQgeyBXSU5ET1dfRU5EX0ZMVVNIX01BUkdJTiB9IGZyb20gXCIuL2Jsb2JTdG9yZVwiO1xuXG4vLyBEZXBsb3kgc3dpdGNob3ZlcnMsIGFuZCB0aGUgaGFuZG92ZXJzIHRoZXkgY2F1c2UuIEEgc3dpdGNob3ZlciBpcyBhIHNvdXJjZSBtb3ZpbmcgdG8gYSBuZXcgcG9ydCBmb3IgYSBmZXcgbWludXRlczogd2UgZ2l2ZSBpdCBhIHZpcnR1YWwgdmFsaWQgd2luZG93IG9uIHRoYXQgcG9ydCAoYW4gXCJpbnRlcm1lZGlhdGVcIiksIHdoaWNoIG1lYW5zIHRoZSB3cml0ZSB0YXJnZXQgY2hhbmdlcyB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB3aGljaCBtZWFucyB0aGUgc3RvcmUgdGFraW5nIG92ZXIgaGFzIHRvIGdvIGFuZCBjb2xsZWN0IHRoZSB3cml0ZXMgdGhhdCBsYW5kZWQganVzdCBiZWZvcmUgaXQgZGlkLiBOb25lIG9mIHRoYXQgaXMgc3RvcmFnZSAtIGl0IGlzIHNjaGVkdWxpbmcgLSBzbyBpdCBsaXZlcyBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBzdG9yZSBvciBpbiB0aGUgc2VydmVyJ3MgYnVja2V0IHN0YXRlLlxuXG5jb25zdCBNQVhfVElNRVJfREVMQVkgPSAyICoqIDMxIC0gMTtcbmNvbnN0IEJPVU5EQVJZX0JVRkZFUiA9IDEwMDA7XG4vLyBBIGhhbmRvdmVyIGlzIHNjYW5uZWQganVzdCBiZWZvcmUgdGhlIGJvdW5kYXJ5LCBqdXN0IGFmdGVyLCBhbmQgYWdhaW4gYSBsaXR0bGUgbGF0ZXIgLSB0aGUgbGFzdCB3cml0ZXMgdG8gdGhlIG9sZCB0YXJnZXQgY2FuIGxhbmQgYWZ0ZXIgdGhlIGJvdW5kYXJ5IGl0c2VsZlxuY29uc3QgQk9VTkRBUllfU0NBTl9PRkZTRVRTID0gWy0zMCAqIDEwMDAsIDIgKiAxMDAwLCAzMCAqIDEwMDBdO1xuLy8gSG93IGZhciBiYWNrIGEgYm91bmRhcnkgc2NhbiBhc2tzIGZvciBjaGFuZ2VzOiBldmVyeXRoaW5nIHRoYXQgY291bGQgc3RpbGwgaGF2ZSBiZWVuIGJ1ZmZlcmVkIHdoZW4gdGhlIHdpbmRvdyBlbmRlZFxuY29uc3QgQk9VTkRBUllfU0NBTl9MT09LQkFDSyA9IERFRkFVTFRfRkFTVF9XUklURV9ERUxBWSArIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOO1xuY29uc3QgU1RBUlRVUF9CT1VOREFSWV9TQ0FOX0RFTEFZID0gMzAgKiAxMDAwO1xuY29uc3QgT1dOX0NPTkZJR19XUklURV9USFJPVFRMRSA9IDMwICogMTAwMDtcbmNvbnN0IElOVEVSTUVESUFURV9NQUlOVEFJTl9JTlRFUlZBTCA9IDYwICogMTAwMDtcblxuY29uc3Qgc2NoZWR1bGVkQm91bmRhcnlTY2FucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuY29uc3QgYm91bmRhcnlTY2Fuc1J1bm5pbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqIENhbGxlZCB3aGVuZXZlciBhIGJ1Y2tldCdzIHN0YXRlIGlzIChyZSlidWlsdDogYXJtcyB0aGUgc2NhbnMgaXRzIHVwY29taW5nIHdpbmRvdyBib3VuZGFyaWVzIG5lZWQuIEVhY2ggc2NhbiBpcyBzY2hlZHVsZWQgb25jZSAtIHRoZSBrZXkgaW5jbHVkZXMgdGhlIGJvdW5kYXJ5IGl0IGlzIGZvciAtIHNvIHJlLWFybWluZyBvbiBldmVyeSBjb25maWcgY2hhbmdlIGlzIGhhcm1sZXNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlQm91bmRhcnlXb3JrKGxvYWRlZDogQnVja2V0U3RhdGUpOiB2b2lkIHtcbiAgICBsZXQga2V5ID0gYCR7bG9hZGVkLmFjY291bnR9LyR7bG9hZGVkLmJ1Y2tldE5hbWV9YDtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgc3RhcnRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgZm9yIChsZXQgc2VsZiBvZiBsb2FkZWQuc2VsZkVudHJpZXMpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gc2VsZi52YWxpZFdpbmRvd1swXTtcbiAgICAgICAgaWYgKHN0YXJ0ID4gbm93ICYmIHN0YXJ0IDwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIHN0YXJ0cy5hZGQoc3RhcnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEEgd2luZG93IHdlIGhhdmUgb25seSBqdXN0IHRha2VuIG92ZXIsIG9uIGEgc2VydmVyIHRoYXQgaGFzIG9ubHkganVzdCBzdGFydGVkOiB0aGUgYm91bmRhcnkgaGFwcGVuZWQgd2hpbGUgd2Ugd2VyZSBub3QgcnVubmluZywgc28gaXRzIHNjYW4gc3RpbGwgaGFzIHRvIGhhcHBlblxuICAgIGZvciAobGV0IHNlbGYgb2YgbG9hZGVkLnNlbGZFbnRyaWVzKSB7XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSBzZWxmLnZhbGlkV2luZG93O1xuICAgICAgICBpZiAoIShzdGFydCA8PSBub3cgJiYgbm93IDwgZW5kKSB8fCBzdGFydCA8PSAwKSBjb250aW51ZTtcbiAgICAgICAgaWYgKG5vdyAtIHN0YXJ0ID4gQk9VTkRBUllfU0NBTl9MT09LQkFDSykgY29udGludWU7XG4gICAgICAgIGxldCBzY2hlZHVsZUtleSA9IGAke2tleX18JHtzdGFydH18c3RhcnR1cGA7XG4gICAgICAgIGlmIChzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmhhcyhzY2hlZHVsZUtleSkpIGNvbnRpbnVlO1xuICAgICAgICBzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmFkZChzY2hlZHVsZUtleSk7XG4gICAgICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdm9pZCBydW5Cb3VuZGFyeVNjYW4obG9hZGVkLCBzdGFydCwgU1RBUlRVUF9CT1VOREFSWV9TQ0FOX0RFTEFZLCBcInN0YXJ0dXArMzBzXCIpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgQm91bmRhcnkgc2NhbiBmb3IgYnVja2V0ICR7a2V5fSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgfSwgU1RBUlRVUF9CT1VOREFSWV9TQ0FOX0RFTEFZKTtcbiAgICAgICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG4gICAgZm9yIChsZXQgc3RhcnQgb2Ygc3RhcnRzKSB7XG4gICAgICAgIGZvciAobGV0IG9mZnNldCBvZiBCT1VOREFSWV9TQ0FOX09GRlNFVFMpIHtcbiAgICAgICAgICAgIGxldCBhdCA9IHN0YXJ0ICsgb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKGF0IDw9IG5vdykgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc2NoZWR1bGVLZXkgPSBgJHtrZXl9fCR7c3RhcnR9fCR7b2Zmc2V0fWA7XG4gICAgICAgICAgICBpZiAoc2NoZWR1bGVkQm91bmRhcnlTY2Fucy5oYXMoc2NoZWR1bGVLZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuYWRkKHNjaGVkdWxlS2V5KTtcbiAgICAgICAgICAgIC8vIFJlLWFybWVkIHJhdGhlciB0aGFuIHRydXN0ZWQ6IGEgbG9uZyB0aW1lciBjYW4gZmlyZSBlYXJseSBhZnRlciBhIHN1c3BlbmQsIGFuZCBmaXJpbmcgZWFybHkgd291bGQgc2NhbiBmb3IgYSBoYW5kb3ZlciB0aGF0IGhhcyBub3QgaGFwcGVuZWRcbiAgICAgICAgICAgIGxldCBhcm0gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIDwgYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFybSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZvaWQgcnVuQm91bmRhcnlTY2FuKGxvYWRlZCwgc3RhcnQsIG9mZnNldCkuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBCb3VuZGFyeSBzY2FuIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICAgICAgICAgIH0sIE1hdGgubWluKGF0IC0gRGF0ZS5ub3coKSwgTUFYX1RJTUVSX0RFTEFZKSk7XG4gICAgICAgICAgICAgICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhcm0oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqIENvbGxlY3RzIHRoZSB3cml0ZXMgdGhhdCBsYW5kZWQgb24gdGhlIHByZXZpb3VzIHdpbmRvdydzIG93bmVycyBqdXN0IGJlZm9yZSBhIGJvdW5kYXJ5LCBpbnRvIHRoZSBzdG9yZSB0aGF0IGhhcyBqdXN0IHRha2VuIG92ZXIuIFdobyBvd25lZCB3aGF0IGlzIHdvcmtlZCBvdXQgcHVyZWx5IGZyb20gdGhlIGNvbmZpZyAoc2VlIHByZXZpb3VzV2luZG93T3duZXJzKTsgdGhpcyBvbmx5IGRvZXMgdGhlIHB1bGxpbmcuICovXG5hc3luYyBmdW5jdGlvbiBydW5Cb3VuZGFyeVNjYW4obG9hZGVkOiBCdWNrZXRTdGF0ZSwgd2luZG93U3RhcnQ6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIsIG9mZnNldExhYmVsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfWA7XG4gICAgbGV0IGxhYmVsID0gYGJ1Y2tldCAke2tleX0sIHdpbmRvdyBzdGFydGluZyAke25ldyBEYXRlKHdpbmRvd1N0YXJ0KS50b0lTT1N0cmluZygpfSwgb2Zmc2V0ICR7b2Zmc2V0TGFiZWwgfHwgYCR7b2Zmc2V0IC8gMTAwMH1zYH1gO1xuICAgIGlmIChib3VuZGFyeVNjYW5zUnVubmluZy5oYXMoa2V5KSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgU2tpcHBpbmcgYm91bmRhcnkgc2NhbiAoJHtsYWJlbH0pOiB0aGUgcHJldmlvdXMgYm91bmRhcnkgc2NhbiBpcyBzdGlsbCBydW5uaW5nYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYm91bmRhcnlTY2Fuc1J1bm5pbmcuYWRkKGtleSk7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IGVmZmVjdGl2ZSA9IGxvYWRlZC5yb3V0aW5nO1xuICAgICAgICBpZiAoIWVmZmVjdGl2ZSkgcmV0dXJuO1xuICAgICAgICBsZXQgaGFuZG92ZXJzID0gcHJldmlvdXNXaW5kb3dPd25lcnMoZWZmZWN0aXZlLCB3aW5kb3dTdGFydCwgZmluZFNlbGZJbmRleGVzKGVmZmVjdGl2ZSwgbG9hZGVkLmFjY291bnQsIGxvYWRlZC5idWNrZXROYW1lKSk7XG4gICAgICAgIGlmICghaGFuZG92ZXJzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmxvZyhgQm91bmRhcnkgc2NhbiAoJHtsYWJlbH0pOiAke2hhbmRvdmVycy5sZW5ndGh9IHJvdXRlKHMpIHRha2luZyBvdmVyOiAke2hhbmRvdmVycy5tYXAoeCA9PiBgJHtKU09OLnN0cmluZ2lmeSh4LnJvdXRlKX0gZnJvbSAke3guc2Nhbk93bkRpc2sgJiYgXCJvdXIgb3duIGRpc2tcIiB8fCBcIlwifSR7eC5zY2FuT3duRGlzayAmJiB4LnJlbW90ZXMuc2l6ZSAmJiBcIiArIFwiIHx8IFwiXCJ9JHtbLi4ueC5yZW1vdGVzLmtleXMoKV0ubWFwKGkgPT4gYHNvdXJjZSAke2l9YCkuam9pbihcIiwgXCIpfWApLmpvaW4oXCI7IFwiKX1gKTtcbiAgICAgICAgbGV0IHNpbmNlID0gd2luZG93U3RhcnQgLSBCT1VOREFSWV9TQ0FOX0xPT0tCQUNLO1xuICAgICAgICBmb3IgKGxldCBoYW5kb3ZlciBvZiBoYW5kb3ZlcnMpIHtcbiAgICAgICAgICAgIGxldCBzZWxmU3RvcmUgPSBsb2FkZWQuc3RvcmVzLmZpbmQoeCA9PiB4Lm5hbWUgPT09IGhhbmRvdmVyLm5hbWUpO1xuICAgICAgICAgICAgaWYgKCFzZWxmU3RvcmUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGhhbmRvdmVyLnNjYW5Pd25EaXNrKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc2VsZlN0b3JlLnN0b3JlLnJlc2NhbkJhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IFtzb3VyY2VJbmRleCwgcm91dGVdIG9mIGhhbmRvdmVyLnJlbW90ZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgb3duZXJTb3VyY2UgPSBlZmZlY3RpdmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvd25lclNvdXJjZSA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2VsZlN0b3JlLnN0b3JlLmJvdW5kYXJ5U2NhblJlbW90ZShjcmVhdGVBcGlBcmNoaXZlcyhvd25lclNvdXJjZSksIHsgc2luY2UsIHJvdXRlIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQm91bmRhcnkgc2NhbiAoJHtsYWJlbH0pIG9mIHByZXZpb3VzLXdpbmRvdyBvd25lciAoc291cmNlIGluZGV4ICR7c291cmNlSW5kZXh9KSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYm91bmRhcnlTY2Fuc1J1bm5pbmcuZGVsZXRlKGtleSk7XG4gICAgfVxufVxuXG4vKiogQW4gb3BlcmF0b3IncyBjb25maWcga25vd3Mgbm90aGluZyBhYm91dCBhIHN3aXRjaG92ZXIgdGhhdCBpcyBpbiBmbGlnaHQgcmlnaHQgbm93LCBzbyB3cml0aW5nIGl0IGFzLWlzIHdvdWxkIGNhbmNlbCBvbmUgbWlkLWhhbmRvdmVyLiBUaGUgaW4tZmxpZ2h0IHdpbmRvd3MgYXJlIHB1dCBiYWNrIGludG8gaXQgZmlyc3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVpbmplY3RJbnRlcm1lZGlhdGVzKGN1cnJlbnQ6IFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZCwgaW5jb21pbmc6IFJlbW90ZUNvbmZpZyk6IFJlbW90ZUNvbmZpZyB7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm4gaW5jb21pbmc7XG4gICAgbGV0IHN0b3JlZCA9IGluY29taW5nO1xuICAgIGxldCByZWluamVjdGVkID0gMDtcbiAgICBmb3IgKGxldCBpbnRlcm1lZGlhdGUgb2YgZ2V0SW50ZXJtZWRpYXRlU291cmNlcyhleHBpcmVJbnRlcm1lZGlhdGVTb3VyY2VzKGN1cnJlbnQsIERhdGUubm93KCkpKSkge1xuICAgICAgICBzdG9yZWQgPSBpbmplY3RJbnRlcm1lZGlhdGVTb3VyY2Uoc3RvcmVkLCB7XG4gICAgICAgICAgICBzcGxpdFVybDogaW50ZXJtZWRpYXRlLmludGVybWVkaWF0ZSB8fCBpbnRlcm1lZGlhdGUudXJsLFxuICAgICAgICAgICAgaW50ZXJtZWRpYXRlVXJsOiBpbnRlcm1lZGlhdGUudXJsLFxuICAgICAgICAgICAgc3RhcnQ6IGludGVybWVkaWF0ZS52YWxpZFdpbmRvd1swXSxcbiAgICAgICAgICAgIGVuZDogaW50ZXJtZWRpYXRlLnZhbGlkV2luZG93WzFdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVpbmplY3RlZCsrO1xuICAgIH1cbiAgICBpZiAocmVpbmplY3RlZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmUtaW5qZWN0ZWQgJHtyZWluamVjdGVkfSBpbi1mbGlnaHQgc3dpdGNob3ZlciB3aW5kb3cocykgaW50byBhbiBpbmNvbWluZyByb3V0aW5nIGNvbmZpZyAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24oaW5jb21pbmcpfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0b3JlZDtcbn1cblxuLy8gUGVyIGJ1Y2tldCwgbm90IGdsb2JhbDogYSBzd2l0Y2hvdmVyIGhhcyB0byB3cml0ZSBldmVyeSBidWNrZXQncyB3aW5kb3dzIGF0IG9uY2UsIGFuZCBhIHNoYXJlZCB0aHJvdHRsZSB3b3VsZCBsZXQgb25seSBvbmUgYnVja2V0IHRocm91Z2ggcGVyIGludGVydmFsXG5jb25zdCBsYXN0T3duQ29uZmlnV3JpdGUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU93blJvdXRpbmdDb25maWcobG9hZGVkOiBCdWNrZXRTdGF0ZSwgdXBkYXRlZDogUmVtb3RlQ29uZmlnLCByZWFzb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHtsb2FkZWQuYWNjb3VudH0vJHtsb2FkZWQuYnVja2V0TmFtZX1gO1xuICAgIGxldCBzaW5jZUxhc3QgPSBEYXRlLm5vdygpIC0gKGxhc3RPd25Db25maWdXcml0ZS5nZXQoa2V5KSB8fCAwKTtcbiAgICBpZiAoc2luY2VMYXN0IDwgT1dOX0NPTkZJR19XUklURV9USFJPVFRMRSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgTm90IHdyaXRpbmcgb3VyIG93biByb3V0aW5nIGNvbmZpZyB1cGRhdGUgZm9yIGJ1Y2tldCAke2tleX0gKCR7cmVhc29ufSk6IHRoZSBsYXN0IG9uZSB3YXMgJHtzaW5jZUxhc3R9bXMgYWdvLCB1bmRlciB0aGUgJHtPV05fQ09ORklHX1dSSVRFX1RIUk9UVExFfW1zIHRocm90dGxlLiBSZXRyeWluZyBvbiB0aGUgbmV4dCBtYWludGVuYW5jZSBwYXNzLmApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3RPd25Db25maWdXcml0ZS5zZXQoa2V5LCBEYXRlLm5vdygpKTtcbiAgICAvLyBBIHN3aXRjaG92ZXIgd3JpdGVzIG9uIHRvcCBvZiB3aGF0ZXZlciB0aGUgYnVja2V0IGlzIHJ1bm5pbmc7IHdpdGggbm8gY29uZmlnIGF0IGFsbCB0aGVyZSBpcyBub3RoaW5nIHRvIHN3aXRjaCBvdmVyXG4gICAgaWYgKCFsb2FkZWQucm91dGluZykgcmV0dXJuO1xuICAgIGxldCBjdXJyZW50VmVyc2lvbiA9IGdldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpO1xuICAgIGxldCB2ZXJzaW9uID0gbmV4dEludGVybWVkaWF0ZVZlcnNpb24oY3VycmVudFZlcnNpb24pO1xuICAgIGxldCBuZXh0OiBSZW1vdGVDb25maWcgPSB7IC4uLnVwZGF0ZWQsIHZlcnNpb24gfTtcbiAgICBjb25zb2xlLmxvZyhgV3JpdGluZyAke1JPVVRJTkdfRklMRX0gZm9yIGJ1Y2tldCAke2tleX0gKCR7cmVhc29ufSksIHZlcnNpb24gJHtjdXJyZW50VmVyc2lvbn0gLT4gJHt2ZXJzaW9ufTogJHtKU09OLnN0cmluZ2lmeShuZXh0KX1gKTtcbiAgICBsZXQgZGF0YSA9IEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyhuZXh0KSk7XG4gICAgLy8gSW50byBvbmUgb2Ygb3VyIG93biBzdG9yZXMgLSBpdCBhcHBsaWVzIGl0IGFuZCBpdHMgcGVlcnMgcHVsbCBpdCAtIGFuZCBkaXJlY3RseSB0byB0aGUgb3RoZXIgc2VydmVycywgd2hpY2ggaXMgd2hhdCBtYWtlcyBhIHN3aXRjaG92ZXIgdGFrZSBlZmZlY3QgaW4gc2Vjb25kcyByYXRoZXIgdGhhbiBhdCB0aGUgbmV4dCBwb2xsXG4gICAgbGV0IG91clN0b3JlID0gbG9hZGVkLnN0b3Jlc1swXTtcbiAgICBpZiAob3VyU3RvcmUpIHtcbiAgICAgICAgYXdhaXQgd3JpdGVSb3V0aW5nQ29uZmlnKGxvYWRlZC5hY2NvdW50LCBsb2FkZWQuYnVja2V0TmFtZSwgb3VyU3RvcmUubmFtZSwgZGF0YSk7XG4gICAgfVxuICAgIGF3YWl0IHByb3BhZ2F0ZVJvdXRpbmdDb25maWcobG9hZGVkLCBuZXh0LCBkYXRhKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvcGFnYXRlUm91dGluZ0NvbmZpZyhsb2FkZWQ6IEJ1Y2tldFN0YXRlLCBuZXh0OiBSZW1vdGVDb25maWcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB0YXJnZXRzID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZUNvbmZpZz4oKTtcbiAgICBmb3IgKGxldCBzb3VyY2Ugb2YgWy4uLmxvYWRlZC5yb3V0aW5nPy5zb3VyY2VzIHx8IFtdLCAuLi5uZXh0LnNvdXJjZXNdKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiIHx8IHNvdXJjZS5pbnRlcm1lZGlhdGUpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoc291cmNlLnR5cGUgPT09IFwicmVtb3RlXCIpIHtcbiAgICAgICAgICAgIGxldCBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWQuYWNjb3VudCAhPT0gbG9hZGVkLmFjY291bnQgfHwgcGFyc2VkLmJ1Y2tldE5hbWUgIT09IGxvYWRlZC5idWNrZXROYW1lKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0cy5oYXMoc291cmNlLnVybCkpIGNvbnRpbnVlO1xuICAgICAgICB0YXJnZXRzLnNldChzb3VyY2UudXJsLCBzb3VyY2UpO1xuICAgIH1cbiAgICBmb3IgKGxldCBbdXJsLCBzb3VyY2VdIG9mIHRhcmdldHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUFwaUFyY2hpdmVzKHNvdXJjZSkuc2V0KFJPVVRJTkdfRklMRSwgZGF0YSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgV3JvdGUgJHtST1VUSU5HX0ZJTEV9IGZvciBidWNrZXQgJHtsb2FkZWQuYWNjb3VudH0vJHtsb2FkZWQuYnVja2V0TmFtZX0gdG8gJHt1cmx9YCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFByb3BhZ2F0aW5nIG91ciByb3V0aW5nIGNvbmZpZyB1cGRhdGUgdG8gJHt1cmx9IGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqIEtlZXBzIGV2ZXJ5IGxvYWRlZCBidWNrZXQncyBzd2l0Y2hvdmVyIHdpbmRvd3MgY3VycmVudDogZ2l2ZXMgb3VyIGFsdGVybmF0ZSBwb3J0IGl0cyB3aW5kb3cgd2hpbGUgYSB0YWtlb3ZlciBpcyBpbiBmbGlnaHQsIGFuZCB0YWtlcyBleHBpcmVkIG9uZXMgYmFjayBvdXQuICovXG5hc3luYyBmdW5jdGlvbiBtYWludGFpbkludGVybWVkaWF0ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgbGV0IHRha2VvdmVyID0gZ2V0VGFrZW92ZXJJbnRlcm1lZGlhdGUoKTtcbiAgICBsZXQgd3JpdHRlbjogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgYWxyZWFkeUNvcnJlY3Q6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG5vdE91cnM6IHN0cmluZ1tdID0gW107XG4gICAgLy8gT05MWSBidWNrZXRzIGFscmVhZHkgaW4gbWVtb3J5LiBBIHN3aXRjaG92ZXIgbXVzdCBuZXZlciBsb2FkIGEgYnVja2V0OiBsb2FkaW5nIHN0YXJ0cyBpdHMgc3luY2hyb25pemF0aW9uLCBhbmQgYnVja2V0cyBub3RoaW5nIGhhcyB0b3VjaGVkIChsZWdhY3kgb25lcyBlc3BlY2lhbGx5KSBoYXZlIG5vIHdyaXRlcyB0byBoYW5kIG9mZiBpbiB0aGUgZmlyc3QgcGxhY2UuIE9uZSB0aGF0IGRvZXMgZ2V0IHVzZWQgbWlkLXN3aXRjaG92ZXIgbG9hZHMgb24gdGhhdCBhY2Nlc3MsIGFuZCB0aGUgbmV4dCBwYXNzIGdpdmVzIGl0IGl0cyB3aW5kb3cuXG4gICAgbGV0IHN0YXRlcyA9IGdldEJ1Y2tldFN0YXRlcygpO1xuICAgIGZvciAobGV0IGxvYWRlZCBvZiBzdGF0ZXMpIHtcbiAgICAgICAgbGV0IGtleSA9IGAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfWA7XG4gICAgICAgIGxldCByb3V0aW5nID0gbG9hZGVkLnJvdXRpbmc7XG4gICAgICAgIGlmICghcm91dGluZykgY29udGludWU7XG4gICAgICAgIGxldCBleHBpcmVkID0gZXhwaXJlSW50ZXJtZWRpYXRlU291cmNlcyhyb3V0aW5nLCBEYXRlLm5vdygpKTtcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGV4cGlyZWQpICE9PSBKU09OLnN0cmluZ2lmeShyb3V0aW5nKSkge1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVPd25Sb3V0aW5nQ29uZmlnKGxvYWRlZCwgZXhwaXJlZCwgYHN3aXRjaG92ZXIgd2luZG93cyBleHBpcmVkIG1vcmUgdGhhbiAke0lOVEVSTUVESUFURV9FWFBJUkVfR1JBQ0UgLyAxMDAwfXMgYWdvYCk7XG4gICAgICAgICAgICB3cml0dGVuLnB1c2goa2V5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGFrZW92ZXIpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbWFpblVybCA9IHJvdXRpbmcuc291cmNlcy5maW5kKHggPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB4ID09PSBcInN0cmluZ1wiIHx8IHgudHlwZSAhPT0gXCJyZW1vdGVcIiB8fCB4LmludGVybWVkaWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKHgudXJsKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZWQuYWRkcmVzcyA9PT0gZG9tYWluICYmIHBhcnNlZC5wb3J0ID09PSBwb3J0O1xuICAgICAgICB9KSBhcyBIb3N0ZWRDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghbWFpblVybCkge1xuICAgICAgICAgICAgbm90T3Vycy5wdXNoKGtleSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5qZWN0ZWQgPSBpbmplY3RJbnRlcm1lZGlhdGVTb3VyY2Uocm91dGluZywge1xuICAgICAgICAgICAgc3BsaXRVcmw6IG1haW5VcmwudXJsLFxuICAgICAgICAgICAgaW50ZXJtZWRpYXRlVXJsOiByZXBsYWNlSG9zdGVkVXJsUG9ydChtYWluVXJsLnVybCwgdGFrZW92ZXIuYWx0UG9ydCksXG4gICAgICAgICAgICBzdGFydDogdGFrZW92ZXIuc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHRha2VvdmVyLmVuZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShpbmplY3RlZCkgPT09IEpTT04uc3RyaW5naWZ5KHJvdXRpbmcpKSB7XG4gICAgICAgICAgICBhbHJlYWR5Q29ycmVjdC5wdXNoKGtleSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB3cml0ZU93blJvdXRpbmdDb25maWcobG9hZGVkLCBpbmplY3RlZCwgYHdlIGFyZSBhIGRlcGxveSBzdWNjZXNzb3I6IHdyaXRlcyByb3V0ZSB0byBvdXIgYWx0ZXJuYXRlIHBvcnQgJHt0YWtlb3Zlci5hbHRQb3J0fSBmcm9tICR7bmV3IERhdGUodGFrZW92ZXIuc3RhcnQpLnRvSVNPU3RyaW5nKCl9IHVudGlsIG91ciBwcmVkZWNlc3NvciBpcyBraWxsZWQgYXQgJHtuZXcgRGF0ZSh0YWtlb3Zlci5lbmQpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgICAgIHdyaXR0ZW4ucHVzaChrZXkpO1xuICAgIH1cbiAgICBpZiAoIXRha2VvdmVyKSByZXR1cm47XG4gICAgaWYgKCFzdGF0ZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBObyBhY3RpdmUgYnVja2V0cywgc28gbm8gY29uZmlnIGZpbGVzIHRvIHdyaXRlIHRoZSBpbnRlcm1lZGlhdGUgaW50byAoYSBidWNrZXQgaXMgb25seSBhY3RpdmUgb25jZSBzb21ldGhpbmcgdXNlcyBpdClgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXdyaXR0ZW4ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBXcm90ZSBubyBjb25maWcgZmlsZXM6IG9mICR7c3RhdGVzLmxlbmd0aH0gYWN0aXZlIGJ1Y2tldHMsICR7YWxyZWFkeUNvcnJlY3QubGVuZ3RofSBhbHJlYWR5IGNvbnRhaW4gdGhlIGludGVybWVkaWF0ZSBhbmQgJHtub3RPdXJzLmxlbmd0aH0gYXJlIG5vdCBob3N0ZWQgYnkgdXNgKTtcbiAgICB9XG59XG5cbi8qKiBPdXIgcHJlZGVjZXNzb3Igc3RpbGwgaG9sZHMgdGhlIG1haW4gcG9ydCBhbmQgaGFzIGJlZW4gc2VydmluZyBhbGwgYWxvbmcsIHNvIGl0IC0gbm90IHVzIC0ga25vd3Mgd2hpY2ggYnVja2V0cyBhcmUgaW4gdXNlLiBXZSBhY3RpdmF0ZSBleGFjdGx5IHRob3NlLCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZWlyIGNvbmZpZyBmaWxlcyBnZXQgdGhlIGludGVybWVkaWF0ZTsgbm90aGluZyBlbHNlIG9uIGRpc2sgaXMgdG91Y2hlZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlUHJlZGVjZXNzb3JCdWNrZXRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgIGxldCB1cmwgPSBgaHR0cHM6Ly8ke2RvbWFpbn06JHtwb3J0fWA7XG4gICAgbGV0IGtleXM6IHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfVtdO1xuICAgIHRyeSB7XG4gICAgICAgIGtleXMgPSBhd2FpdCBsaXN0U2VydmVyQWN0aXZlQnVja2V0S2V5cyh7IHVybCB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCBhc2sgb3VyIHByZWRlY2Vzc29yIG9uICR7dXJsfSB3aGljaCBidWNrZXRzIGFyZSBhY3RpdmUsIHNvIG9ubHkgYnVja2V0cyB1c2VkIG9uIHRoaXMgcHJvY2VzcyBnZXQgdGhlIGludGVybWVkaWF0ZTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBPdXIgcHJlZGVjZXNzb3Igb24gJHt1cmx9IGhhcyBubyBhY3RpdmUgYnVja2V0cywgc28gdGhlcmUgYXJlIG5vIGNvbmZpZyBmaWxlcyB0byB3cml0ZSB0aGUgaW50ZXJtZWRpYXRlIGludG9gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgT3VyIHByZWRlY2Vzc29yIG9uICR7dXJsfSBoYXMgJHtrZXlzLmxlbmd0aH0gYWN0aXZlIGJ1Y2tldHMsIGFjdGl2YXRpbmcgdGhlbSBoZXJlIHNvIHRoZWlyIGNvbmZpZyBmaWxlcyBnZXQgdGhlIGludGVybWVkaWF0ZTogJHtrZXlzLm1hcCh4ID0+IGAke3guYWNjb3VudH0vJHt4LmJ1Y2tldE5hbWV9YCkuam9pbihcIiwgXCIpfWApO1xuICAgIGZvciAobGV0IHsgYWNjb3VudCwgYnVja2V0TmFtZSB9IG9mIGtleXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQWN0aXZhdGluZyBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChhY3RpdmUgb24gb3VyIHByZWRlY2Vzc29yKSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKiBTdGFydGVkIGJ5IGRlcGxveVRha2VvdmVyIG9uY2Ugd2UgYXJlIGFjdHVhbGx5IGEgZGVwbG95IHN1Y2Nlc3NvciBsaXN0ZW5pbmcgb24gYW4gYWx0ZXJuYXRlIHBvcnQuIFVudGlsIHRoZW4gdGhlcmUgYXJlIG5vIHN3aXRjaG92ZXIgd2luZG93cyB0byB3cml0ZSBvciBleHBpcmUsIHNvIG5vdGhpbmcgcG9sbHMuICovXG5leHBvcnQgY29uc3Qgc3RhcnRJbnRlcm1lZGlhdGVNYWludGVuYW5jZSA9IGxhenkoKCkgPT4ge1xuICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgYWN0aXZhdGVQcmVkZWNlc3NvckJ1Y2tldHMoKTtcbiAgICAgICAgYXdhaXQgbWFpbnRhaW5JbnRlcm1lZGlhdGVzKCk7XG4gICAgfSkoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYFdyaXRpbmcgdGhlIGludGVybWVkaWF0ZSBpbnRvIHRoZSBjb25maWcgZmlsZXMgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgcnVuSW5maW5pdGVQb2xsKElOVEVSTUVESUFURV9NQUlOVEFJTl9JTlRFUlZBTCwgbWFpbnRhaW5JbnRlcm1lZGlhdGVzKTtcbn0pO1xuIl19
|
|
286
|
+
/* _JS_SOURCE_HASH = "7bbb52afe3a16abf19ef19720f1016edefc4895af6e118ddb8394d7ff8996a1a"; */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
3
|
//exports.expireIntermediateSources = exports.injectIntermediateSource = exports.resolveIntermediateSources = exports.hasIntermediateSources = exports.getIntermediateSources = exports.nextIntermediateVersion = exports.INTERMEDIATE_EXPIRE_GRACE = void 0;
|
|
4
4
|
exports.INTERMEDIATE_EXPIRE_GRACE = 15 * 60 * 1000;
|
|
@@ -111,4 +111,4 @@ function expireIntermediateSources(config, now) {
|
|
|
111
111
|
}
|
|
112
112
|
exports.expireIntermediateSources = expireIntermediateSources;
|
|
113
113
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJtZWRpYXRlU291cmNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImludGVybWVkaWF0ZVNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSx5QkFBeUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN4RCxNQUFNLDZCQUE2QixHQUFHLE9BQVMsQ0FBQztBQUVoRCwyUkFBMlI7QUFDM1IsU0FBZ0IsdUJBQXVCLENBQUMsT0FBZTtJQUNuRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLDZCQUE2QixDQUFDO0lBQzdELElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2QsSUFBSSxHQUFHLENBQUMsR0FBRyw2QkFBNkIsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsT0FBTyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQzFCLENBQUM7QUFORCwwREFNQztBQUVELFNBQVMsY0FBYyxDQUFDLE1BQXdCO0lBQzVDLE9BQU8sT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDO0FBQ3RDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxNQUF3QjtJQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzNDLE9BQU8sRUFBRSxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3RGLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxNQUFvQjtJQUNqQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsU0FBZ0Isc0JBQXNCLENB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QztJQUN0QixLQUFLLElBQUksSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDakMsTUFBTSxHQUFHLHdCQUF3QixDQUFDLE1BQU0sRUFBRTtZQUN0Qyw0SEFBNEg7WUFDNUgsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLEdBQUc7WUFDdkMsZUFBZSxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUMxQixHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDM0IsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFoQkQsOERBZ0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVtb3RlQ29uZmlnLCBSZW1vdGVDb25maWdCYXNlLCBTb3VyY2VDb25maWcgfSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5cbmV4cG9ydCBjb25zdCBJTlRFUk1FRElBVEVfRVhQSVJFX0dSQUNFID0gMTUgKiA2MCAqIDEwMDA7XG5jb25zdCBJTlRFUk1FRElBVEVfVkVSU0lPTl9GUkFDVElPTiA9IDFfMDAwXzAwMDtcblxuLyoqIEFkZGluZyBvciByZW1vdmluZyBpbnRlcm1lZGlhdGVzIGlzIGEgcmVhbCBjb25maWcgdXBkYXRlLCBzbyBpdCB0YWtlcyBhIHJlYWwgdmVyc2lvbiBpbmNyZW1lbnQgLSBidXQgYSBwcm9wb3J0aW9uYWwgb25lLCBzbyBpdCBzdGF5cyBmYXIgYmVsb3cgd2hhdGV2ZXIgdGhlIGF1dGhvcidzIG5leHQgdmVyc2lvbiB3b3VsZCBiZSAod2hldGhlciB0aGV5IGNvdW50IDEsIDIsIDMgb3IgdXNlIHRpbWVzdGFtcHMpLCBhbmQgYSBtaWxsaW9uIG9mIHRoZW0gc3RpbGwgZml0IHVuZGVyIGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5leHRJbnRlcm1lZGlhdGVWZXJzaW9uKHZlcnNpb246IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHN0ZXAgPSBNYXRoLmFicyh2ZXJzaW9uKSAvIElOVEVSTUVESUFURV9WRVJTSU9OX0ZSQUNUSU9OO1xuICAgIGlmICghKHN0ZXAgPiAwKSkge1xuICAgICAgICBzdGVwID0gMSAvIElOVEVSTUVESUFURV9WRVJTSU9OX0ZSQUNUSU9OO1xuICAgIH1cbiAgICByZXR1cm4gdmVyc2lvbiArIHN0ZXA7XG59XG5cbmZ1bmN0aW9uIGlzU291cmNlQ29uZmlnKHNvdXJjZTogUmVtb3RlQ29uZmlnQmFzZSk6IHNvdXJjZSBpcyBTb3VyY2VDb25maWcge1xuICAgIHJldHVybiB0eXBlb2Ygc291cmNlICE9PSBcInN0cmluZ1wiO1xufVxuXG5mdW5jdGlvbiBjbG9uZVNvdXJjZShzb3VyY2U6IFJlbW90ZUNvbmZpZ0Jhc2UpOiBSZW1vdGVDb25maWdCYXNlIHtcbiAgICBpZiAoIWlzU291cmNlQ29uZmlnKHNvdXJjZSkpIHJldHVybiBzb3VyY2U7XG4gICAgcmV0dXJuIHsgLi4uc291cmNlLCB2YWxpZFdpbmRvdzogW3NvdXJjZS52YWxpZFdpbmRvd1swXSwgc291cmNlLnZhbGlkV2luZG93WzFdXSB9O1xufVxuXG5mdW5jdGlvbiBqb2luS2V5KHNvdXJjZTogU291cmNlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyAuLi5zb3VyY2UsIHZhbGlkV2luZG93OiB1bmRlZmluZWQgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm1lZGlhdGVTb3VyY2VzKGNvbmZpZzogUmVtb3RlQ29uZmlnKTogU291cmNlQ29uZmlnW10ge1xuICAgIHJldHVybiBjb25maWcuc291cmNlcy5maWx0ZXIoeCA9PiBpc1NvdXJjZUNvbmZpZyh4KSAmJiB4LmludGVybWVkaWF0ZSkgYXMgU291cmNlQ29uZmlnW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNJbnRlcm1lZGlhdGVTb3VyY2VzKGNvbmZpZzogUmVtb3RlQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbmZpZy5zb3VyY2VzLnNvbWUoeCA9PiBpc1NvdXJjZUNvbmZpZyh4KSAmJiB4LmludGVybWVkaWF0ZSk7XG59XG5cbi8qKiBSZW1vdmVzIGV2ZXJ5IGludGVybWVkaWF0ZSBlbnRyeSBhbmQgcmVqb2lucyB0aGUgd2luZG93cyBpdCBzcGxpdCwgZ2l2aW5nIGJhY2sgdGhlIHVuZGVybHlpbmcgY29uZmlndXJhdGlvbi4gVHdvIGNvbmZpZ3MgdGhhdCByZXNvbHZlIGVxdWFsIGRpZmZlciBvbmx5IGJ5IGludGVybWVkaWF0ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUludGVybWVkaWF0ZVNvdXJjZXMoY29uZmlnOiBSZW1vdGVDb25maWcpOiBSZW1vdGVDb25maWcge1xuICAgIGlmICghaGFzSW50ZXJtZWRpYXRlU291cmNlcyhjb25maWcpKSByZXR1cm4gY29uZmlnO1xuICAgIGxldCByZW1vdmVkID0gZ2V0SW50ZXJtZWRpYXRlU291cmNlcyhjb25maWcpO1xuICAgIGxldCBzb3VyY2VzID0gY29uZmlnLnNvdXJjZXMuZmlsdGVyKHggPT4gIWlzU291cmNlQ29uZmlnKHgpIHx8ICF4LmludGVybWVkaWF0ZSkubWFwKGNsb25lU291cmNlKTtcbiAgICBmb3IgKGxldCBnYXAgb2YgcmVtb3ZlZCkge1xuICAgICAgICBsZXQgW2dhcFN0YXJ0LCBnYXBFbmRdID0gZ2FwLnZhbGlkV2luZG93O1xuICAgICAgICBsZXQgYmVmb3JlID0gc291cmNlcy5maW5kKHggPT4gaXNTb3VyY2VDb25maWcoeCkgJiYgeC52YWxpZFdpbmRvd1sxXSA9PT0gZ2FwU3RhcnQpIGFzIFNvdXJjZUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGFmdGVyID0gc291cmNlcy5maW5kKHggPT4gaXNTb3VyY2VDb25maWcoeCkgJiYgeC52YWxpZFdpbmRvd1swXSA9PT0gZ2FwRW5kKSBhcyBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChiZWZvcmUgJiYgYWZ0ZXIgJiYgam9pbktleShiZWZvcmUpID09PSBqb2luS2V5KGFmdGVyKSkge1xuICAgICAgICAgICAgYmVmb3JlLnZhbGlkV2luZG93ID0gW2JlZm9yZS52YWxpZFdpbmRvd1swXSwgYWZ0ZXIudmFsaWRXaW5kb3dbMV1dO1xuICAgICAgICAgICAgc291cmNlcy5zcGxpY2Uoc291cmNlcy5pbmRleE9mKGFmdGVyKSwgMSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVmb3JlKSB7XG4gICAgICAgICAgICBiZWZvcmUudmFsaWRXaW5kb3cgPSBbYmVmb3JlLnZhbGlkV2luZG93WzBdLCBnYXBFbmRdO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFmdGVyKSB7XG4gICAgICAgICAgICBhZnRlci52YWxpZFdpbmRvdyA9IFtnYXBTdGFydCwgYWZ0ZXIudmFsaWRXaW5kb3dbMV1dO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHZlcnNpb246IGNvbmZpZy52ZXJzaW9uLCBzb3VyY2VzIH07XG59XG5cbi8qKiBTcGxpdHMgZXZlcnkgc291cmNlIGF0IHNwbGl0VXJsIGNvdmVyaW5nIFtzdGFydCwgZW5kKSBzbyB0aGF0IG1pZGRsZSB3aW5kb3cgcG9pbnRzIGF0IGludGVybWVkaWF0ZVVybCBpbnN0ZWFkLCBmbGFnZ2VkIGFzIGludGVybWVkaWF0ZS4gSWRlbXBvdGVudDogYSBjb25maWcgdGhhdCBhbHJlYWR5IGNvbnRhaW5zIHRoZSBleGFjdCBpbnRlcm1lZGlhdGUgY29tZXMgYmFjayB1bmNoYW5nZWQuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0SW50ZXJtZWRpYXRlU291cmNlKGNvbmZpZzogUmVtb3RlQ29uZmlnLCBpbmplY3Q6IHsgc3BsaXRVcmw6IHN0cmluZzsgaW50ZXJtZWRpYXRlVXJsOiBzdHJpbmc7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBSZW1vdGVDb25maWcge1xuICAgIGxldCB7IHNwbGl0VXJsLCBpbnRlcm1lZGlhdGVVcmwsIHN0YXJ0LCBlbmQgfSA9IGluamVjdDtcbiAgICBpZiAoc3RhcnQgPj0gZW5kKSByZXR1cm4gY29uZmlnO1xuICAgIGlmIChjb25maWcuc291cmNlcy5zb21lKHggPT4gaXNTb3VyY2VDb25maWcoeCkgJiYgeC5pbnRlcm1lZGlhdGUgJiYgeC51cmwgPT09IGludGVybWVkaWF0ZVVybCAmJiB4LnZhbGlkV2luZG93WzBdID09PSBzdGFydCAmJiB4LnZhbGlkV2luZG93WzFdID09PSBlbmQpKSB7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIGxldCBzb3VyY2VzOiBSZW1vdGVDb25maWdCYXNlW10gPSBbXTtcbiAgICBmb3IgKGxldCBzb3VyY2Ugb2YgY29uZmlnLnNvdXJjZXMpIHtcbiAgICAgICAgaWYgKCFpc1NvdXJjZUNvbmZpZyhzb3VyY2UpIHx8IHNvdXJjZS51cmwgIT09IHNwbGl0VXJsIHx8IHNvdXJjZS5pbnRlcm1lZGlhdGUpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChjbG9uZVNvdXJjZShzb3VyY2UpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBbd2luZG93U3RhcnQsIHdpbmRvd0VuZF0gPSBzb3VyY2UudmFsaWRXaW5kb3c7XG4gICAgICAgIGlmICh3aW5kb3dFbmQgPD0gc3RhcnQgfHwgd2luZG93U3RhcnQgPj0gZW5kKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goY2xvbmVTb3VyY2Uoc291cmNlKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWlkZGxlU3RhcnQgPSBNYXRoLm1heCh3aW5kb3dTdGFydCwgc3RhcnQpO1xuICAgICAgICBsZXQgbWlkZGxlRW5kID0gTWF0aC5taW4od2luZG93RW5kLCBlbmQpO1xuICAgICAgICBpZiAobWlkZGxlU3RhcnQgPiB3aW5kb3dTdGFydCkge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHsgLi4uc291cmNlLCB2YWxpZFdpbmRvdzogW3dpbmRvd1N0YXJ0LCBtaWRkbGVTdGFydF0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW50ZXJtZWRpYXRlID0gdGhlIHVybCB0aGlzIGVudHJ5IHdhcyBzcGxpdCBvdXQgb2YsIHNvIGEgcmVxdWVzdCBuYW1pbmcgdGhlIGludGVybWVkaWF0ZSBzdGlsbCByZXNvbHZlcyB0byB0aGUgb3JpZ2luYWwgc291cmNlXG4gICAgICAgIHNvdXJjZXMucHVzaCh7IC4uLnNvdXJjZSwgdXJsOiBpbnRlcm1lZGlhdGVVcmwsIHZhbGlkV2luZG93OiBbbWlkZGxlU3RhcnQsIG1pZGRsZUVuZF0sIGludGVybWVkaWF0ZTogc3BsaXRVcmwgfSk7XG4gICAgICAgIGlmICh3aW5kb3dFbmQgPiBtaWRkbGVFbmQpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaCh7IC4uLnNvdXJjZSwgdmFsaWRXaW5kb3c6IFttaWRkbGVFbmQsIHdpbmRvd0VuZF0gfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdmVyc2lvbjogY29uZmlnLnZlcnNpb24sIHNvdXJjZXMgfTtcbn1cblxuLyoqIEludGVybWVkaWF0ZXMgd2hvc2Ugd2luZG93IGVuZGVkIG1vcmUgdGhhbiBJTlRFUk1FRElBVEVfRVhQSVJFX0dSQUNFIGFnbyBhcmUgcmVtb3ZlZCwgYW5kIHRoZSB3aW5kb3dzIHRoZXkgc3BsaXQgYXJlIHJlam9pbmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGlyZUludGVybWVkaWF0ZVNvdXJjZXMoY29uZmlnOiBSZW1vdGVDb25maWcsIG5vdzogbnVtYmVyKTogUmVtb3RlQ29uZmlnIHtcbiAgICBsZXQgZXhwaXJlZCA9IGdldEludGVybWVkaWF0ZVNvdXJjZXMoY29uZmlnKS5maWx0ZXIoeCA9PiB4LnZhbGlkV2luZG93WzFdICsgSU5URVJNRURJQVRFX0VYUElSRV9HUkFDRSA8IG5vdyk7XG4gICAgaWYgKCFleHBpcmVkLmxlbmd0aCkgcmV0dXJuIGNvbmZpZztcbiAgICBsZXQga2VwdEludGVybWVkaWF0ZXMgPSBnZXRJbnRlcm1lZGlhdGVTb3VyY2VzKGNvbmZpZykuZmlsdGVyKHggPT4gIWV4cGlyZWQuaW5jbHVkZXMoeCkpO1xuICAgIGxldCByZXNvbHZlZCA9IHJlc29sdmVJbnRlcm1lZGlhdGVTb3VyY2VzKGNvbmZpZyk7XG4gICAgbGV0IHJlc3VsdCA9IHJlc29sdmVkO1xuICAgIGZvciAobGV0IGtlZXAgb2Yga2VwdEludGVybWVkaWF0ZXMpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5qZWN0SW50ZXJtZWRpYXRlU291cmNlKHJlc3VsdCwge1xuICAgICAgICAgICAgLy8gVGhlIGludGVybWVkaWF0ZSBjYXJyaWVzIHRoZSB1cmwgaXQgd2FzIHNwbGl0IG91dCBvZjsgZmFsbCBiYWNrIHRvIGl0cyBvd24gdXJsIG9ubHkgZm9yIGEgbGVnYWN5IGVudHJ5IHRoYXQgcHJlZGF0ZXMgdGhhdFxuICAgICAgICAgICAgc3BsaXRVcmw6IGtlZXAuaW50ZXJtZWRpYXRlIHx8IGtlZXAudXJsLFxuICAgICAgICAgICAgaW50ZXJtZWRpYXRlVXJsOiBrZWVwLnVybCxcbiAgICAgICAgICAgIHN0YXJ0OiBrZWVwLnZhbGlkV2luZG93WzBdLFxuICAgICAgICAgICAgZW5kOiBrZWVwLnZhbGlkV2luZG93WzFdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
|
|
114
|
-
/* _JS_SOURCE_HASH = "
|
|
114
|
+
/* _JS_SOURCE_HASH = "2c008d5d6c726fda0142fb075908de41c6f2ab1692b4e4cf91bed85830bac02a"; */
|