sliftutils 1.7.29 → 1.7.33

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 (116) hide show
  1. package/builders/extensionBuild.ts +1 -1
  2. package/bundler/bundleEntry.ts +1 -3
  3. package/bundler/bundler.ts +2 -4
  4. package/bundler/sourceMaps.ts +1 -2
  5. package/examplestorage/browser.tsx +1 -2
  6. package/examplestorage/exampleserver.ts +1 -2
  7. package/index.d.ts +106 -99
  8. package/misc/dist/environment.ts.cache +2 -2
  9. package/misc/dist/getSecret.ts.cache +2 -2
  10. package/misc/dist/strings.ts.cache +2 -2
  11. package/misc/dist/zip.ts.cache +2 -2
  12. package/misc/https/dist/certs.ts.cache +2 -2
  13. package/misc/https/dist/dns.ts.cache +7 -16
  14. package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
  15. package/misc/https/dns.d.ts +1 -4
  16. package/misc/https/dns.ts +5 -14
  17. package/misc/https/hostServer.d.ts +2 -0
  18. package/misc/https/hostServer.ts +6 -7
  19. package/misc/https/httpsCerts.ts +4 -10
  20. package/misc/openrouter.ts +1 -2
  21. package/package.json +1 -1
  22. package/render-utils/FullscreenModal.tsx +1 -4
  23. package/render-utils/GenericFormat.tsx +2 -8
  24. package/render-utils/Input.tsx +5 -13
  25. package/render-utils/InputLabel.tsx +4 -6
  26. package/render-utils/InputPicker.tsx +1 -2
  27. package/render-utils/URLParam.ts +2 -3
  28. package/render-utils/dist/observer.tsx.cache +2 -2
  29. package/render-utils/mobxTyped.ts +2 -3
  30. package/render-utils/niceStringify.ts +2 -4
  31. package/storage/ArchivesDisk.ts +4 -14
  32. package/storage/BulkDatabase2/BulkDatabase2.d.ts +1 -2
  33. package/storage/BulkDatabase2/BulkDatabase2.ts +4 -11
  34. package/storage/BulkDatabase2/BulkDatabaseBase.ts +42 -114
  35. package/storage/BulkDatabase2/BulkDatabaseFormat.ts +31 -91
  36. package/storage/BulkDatabase2/BulkDatabaseMerge.ts +19 -57
  37. package/storage/BulkDatabase2/BulkDatabaseReader.ts +4 -12
  38. package/storage/BulkDatabase2/LoadedIndex.ts +6 -18
  39. package/storage/BulkDatabase2/WriteOverlay.ts +3 -8
  40. package/storage/BulkDatabase2/blockCache.ts +12 -28
  41. package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +40 -103
  42. package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +19 -50
  43. package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +18 -50
  44. package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +7 -15
  45. package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +9 -21
  46. package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +6 -11
  47. package/storage/BulkDatabase2/dist/blockCache.ts.cache +15 -31
  48. package/storage/BulkDatabase2/dist/mergeLock.ts.cache +10 -29
  49. package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +10 -18
  50. package/storage/BulkDatabase2/dist/streamLog.ts.cache +17 -43
  51. package/storage/BulkDatabase2/dist/syncClient.ts.cache +11 -27
  52. package/storage/BulkDatabase2/mergeLock.ts +7 -26
  53. package/storage/BulkDatabase2/mergeMarkers.ts +7 -15
  54. package/storage/BulkDatabase2/streamLog.ts +14 -40
  55. package/storage/BulkDatabase2/syncClient.ts +8 -24
  56. package/storage/FileFolderAPI.tsx +28 -75
  57. package/storage/IArchives.d.ts +3 -3
  58. package/storage/IArchives.ts +21 -50
  59. package/storage/IStorage.ts +2 -4
  60. package/storage/PendingManager.tsx +2 -3
  61. package/storage/TransactionStorage.ts +11 -24
  62. package/storage/backblaze.ts +12 -43
  63. package/storage/dist/ArchivesDisk.ts.cache +7 -17
  64. package/storage/dist/FileFolderAPI.tsx.cache +25 -63
  65. package/storage/dist/IArchives.ts.cache +10 -20
  66. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
  67. package/storage/dist/JSONStorage.ts.cache +2 -2
  68. package/storage/dist/PendingManager.tsx.cache +5 -6
  69. package/storage/dist/TransactionStorage.ts.cache +14 -27
  70. package/storage/dist/backblaze.ts.cache +15 -46
  71. package/storage/dist/embeddingFormats.ts.cache +11 -24
  72. package/storage/dist/fileSystemPointer.ts.cache +4 -7
  73. package/storage/dist/remoteFileStorage.ts.cache +17 -36
  74. package/storage/embeddingFormats.ts +11 -27
  75. package/storage/fileSystemPointer.ts +2 -7
  76. package/storage/proxydatabase/dist/ivfEmbeddingDatabase.ts.cache +8 -18
  77. package/storage/proxydatabase/dist/transactionSet.ts.cache +4 -7
  78. package/storage/proxydatabase/inMemoryDatabase.ts +1 -3
  79. package/storage/proxydatabase/ivfEmbeddingDatabase.ts +8 -23
  80. package/storage/proxydatabase/transactionSet.ts +2 -5
  81. package/storage/remoteFileServer.ts +20 -48
  82. package/storage/remoteFileStorage.ts +14 -33
  83. package/storage/remoteStorage/ArchivesRemote.d.ts +1 -4
  84. package/storage/remoteStorage/ArchivesRemote.ts +11 -26
  85. package/storage/remoteStorage/ArchivesUrl.ts +2 -4
  86. package/storage/remoteStorage/accessPage.tsx +1 -5
  87. package/storage/remoteStorage/blobStore.d.ts +5 -13
  88. package/storage/remoteStorage/blobStore.ts +52 -130
  89. package/storage/remoteStorage/createArchives.d.ts +9 -13
  90. package/storage/remoteStorage/createArchives.ts +43 -187
  91. package/storage/remoteStorage/deployTakeover.d.ts +18 -32
  92. package/storage/remoteStorage/deployTakeover.ts +70 -384
  93. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +12 -24
  94. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +5 -7
  95. package/storage/remoteStorage/dist/blobStore.ts.cache +47 -117
  96. package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
  97. package/storage/remoteStorage/dist/createArchives.ts.cache +54 -186
  98. package/storage/remoteStorage/dist/deployTakeover.ts.cache +81 -387
  99. package/storage/remoteStorage/dist/intermediateSources.ts.cache +119 -0
  100. package/storage/remoteStorage/dist/remoteConfig.ts.cache +36 -24
  101. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +20 -40
  102. package/storage/remoteStorage/dist/storageClientController.ts.cache +32 -0
  103. package/storage/remoteStorage/dist/storageController.ts.cache +30 -64
  104. package/storage/remoteStorage/dist/storageServerState.ts.cache +269 -186
  105. package/storage/remoteStorage/grantAccessCli.ts +1 -3
  106. package/storage/remoteStorage/intermediateSources.d.ts +21 -0
  107. package/storage/remoteStorage/intermediateSources.ts +117 -0
  108. package/storage/remoteStorage/remoteConfig.ts +33 -20
  109. package/storage/remoteStorage/sourceWrapper.d.ts +8 -19
  110. package/storage/remoteStorage/sourceWrapper.ts +19 -41
  111. package/storage/remoteStorage/storageClientController.ts +1 -3
  112. package/storage/remoteStorage/storageController.d.ts +5 -3
  113. package/storage/remoteStorage/storageController.ts +12 -83
  114. package/storage/remoteStorage/storageServer.ts +20 -34
  115. package/storage/remoteStorage/storageServerState.d.ts +28 -6
  116. package/storage/remoteStorage/storageServerState.ts +275 -221
@@ -1,8 +1,6 @@
1
- "use strict";
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
2
  // File format (all integers little-endian):
3
- // u32 headerLength, then headerLength bytes of JSON: { rowCount, columns: [{ name, offset, length }] }, where offset is relative to the end of the header.
4
- // Each column blob is: u32 offsets[rowCount + 1] (byte offsets into the column's data section), u8 types[rowCount], then the data section (each value's bytes, concatenated).
5
- // Values are encoded with an explicit type tag per value (see the TYPE_ constants). Reads only fetch the byte ranges they need.
3
+ // u32 headerLength, then headerLength bytes of JSON: { rowCount, columns: [{ name, offset, length }] }, where offset is relative to the end of the header. Each column blob is: u32 offsets[rowCount + 1] (byte offsets into the column's data section), u8 types[rowCount], then the data section (each value's bytes, concatenated). Values are encoded with an explicit type tag per value (see the TYPE_ constants). Reads only fetch the byte ranges they need.
6
4
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
7
5
  //exports.loadBulkDatabase = exports.loadBulkHeader = exports.buildFileBufferRaw = exports.buildFileBuffer = exports.assemblePlannedFile = exports.columnIndexByteLength = exports.TARGET_FILE_BYTES = exports.encodeValue = exports.TYPE_ABSENT_TAG = exports.ABSENT = exports.EMPTY_BUFFER = exports.KEY_COLUMN = void 0;
8
6
  exports.KEY_COLUMN = "key";
@@ -21,9 +19,7 @@ const TYPE_INT32_ARRAY = 10;
21
19
  const TYPE_UINT32_ARRAY = 11;
22
20
  const TYPE_FLOAT32_ARRAY = 12;
23
21
  const TYPE_FLOAT64_ARRAY = 13;
24
- // A cell whose row never set this column at all — as opposed to TYPE_UNDEFINED, an explicitly stored
25
- // undefined. On read, ABSENT falls through to older readers for that column; a stored undefined stops
26
- // the fall-through (it's a real value that clears the column).
22
+ // A cell whose row never set this column at all — as opposed to TYPE_UNDEFINED, an explicitly stored undefined. On read, ABSENT falls through to older readers for that column; a stored undefined stops the fall-through (it's a real value that clears the column).
27
23
  const TYPE_ABSENT = 14;
28
24
  const TYPED_ARRAY_TYPES = [
29
25
  { type: TYPE_INT8_ARRAY, ctor: Int8Array },
@@ -37,15 +33,11 @@ const TYPED_ARRAY_TYPES = [
37
33
  { type: TYPE_FLOAT64_ARRAY, ctor: Float64Array },
38
34
  ];
39
35
  exports.EMPTY_BUFFER = Buffer.alloc(0);
40
- // Sentinel a reader returns for a cell whose row never set this column, so the join can fall through
41
- // to an older reader for that column. Distinct from a stored undefined, which is a real clearing value.
36
+ // Sentinel a reader returns for a cell whose row never set this column, so the join can fall through to an older reader for that column. Distinct from a stored undefined, which is a real clearing value.
42
37
  exports.ABSENT = Symbol("absent");
43
- // The type tag a cell carries when its row never set this column — read it from the column's `types`
44
- // array to detect ABSENT without decoding. Re-exported so the merge planner (which works at the
45
- // column-index level, no value materialization) can check it.
38
+ // The type tag a cell carries when its row never set this column — read it from the column's `types` array to detect ABSENT without decoding. Re-exported so the merge planner (which works at the column-index level, no value materialization) can check it.
46
39
  exports.TYPE_ABSENT_TAG = TYPE_ABSENT;
47
- // Hidden per-row column holding each row's write-time (so reads can resolve a key to its latest value
48
- // by actual time). NUL-prefixed so it can't collide with a user column; excluded from `columns`.
40
+ // Hidden per-row column holding each row's write-time (so reads can resolve a key to its latest value by actual time). NUL-prefixed so it can't collide with a user column; excluded from `columns`.
49
41
  const TIME_COLUMN = String.fromCharCode(0) + "t";
50
42
  function encodeValue(value) {
51
43
  if (value === exports.ABSENT) {
@@ -136,9 +128,7 @@ function encodeBulkData(data) {
136
128
  offsets.writeUInt32LE(pos, 4 * n);
137
129
  return Buffer.concat([offsets, types, ...parts]);
138
130
  }
139
- // Like encodeBulkData but the values are already encoded (a merge supplies the winning cells' raw bytes
140
- // straight from the input files). Lays out the same offsets / types / data section without touching the
141
- // values themselves.
131
+ // Like encodeBulkData but the values are already encoded (a merge supplies the winning cells' raw bytes straight from the input files). Lays out the same offsets / types / data section without touching the values themselves.
142
132
  function encodeBulkDataRaw(cells) {
143
133
  const n = cells.length;
144
134
  const offsets = Buffer.alloc(4 * (n + 1));
@@ -166,11 +156,7 @@ function decodeBulkData(blob, rowCount) {
166
156
  }
167
157
  return values;
168
158
  }
169
- // Target logical (uncompressed) size of one bulk file. A rows array bigger than this is split across
170
- // multiple key-contiguous files, so files stay around this size (the merge policy's target) and no
171
- // single column blob / Buffer.concat ever approaches the ~2GB Buffer length limit. The estimate is
172
- // rough on purpose — it only needs to keep each chunk near the target, not be exact. A single row
173
- // bigger than the target still becomes its own (oversized) file, since we never split within a key.
159
+ // Target logical (uncompressed) size of one bulk file. A rows array bigger than this is split across multiple key-contiguous files, so files stay around this size (the merge policy's target) and no single column blob / Buffer.concat ever approaches the ~2GB Buffer length limit. The estimate is rough on purpose — it only needs to keep each chunk near the target, not be exact. A single row bigger than the target still becomes its own (oversized) file, since we never split within a key.
174
160
  exports.TARGET_FILE_BYTES = 256 * 1024 * 1024;
175
161
  // Per-value on-disk overhead: a 4-byte offset entry plus a 1-byte type tag.
176
162
  const PER_VALUE_OVERHEAD = 5;
@@ -196,9 +182,7 @@ function estimateRowBytes(row) {
196
182
  }
197
183
  return total;
198
184
  }
199
- // Concatenates already-encoded column blobs into a complete file (4-byte header length + header JSON +
200
- // blobs), computing the header's time + key bounds from the per-row times and keys. Shared by the
201
- // object-based builder (buildOneFile) and the raw-splice builder (buildOneFileRaw).
185
+ // Concatenates already-encoded column blobs into a complete file (4-byte header length + header JSON + blobs), computing the header's time + key bounds from the per-row times and keys. Shared by the object-based builder (buildOneFile) and the raw-splice builder (buildOneFileRaw).
202
186
  function assembleFile(columnNames, blobs, rowCount, times, keys) {
203
187
  let offset = 0;
204
188
  const columns = columnNames.map((name, i) => {
@@ -246,16 +230,12 @@ function buildOneFile(rows, times) {
246
230
  blobs.push(encodeBulkData(times));
247
231
  return assembleFile(columnNames, blobs, rows.length, times, rows.map(r => r[exports.KEY_COLUMN]));
248
232
  }
249
- // Size of a column blob's INDEX section (offsets array + types array) for a column of N rows. The data
250
- // section follows immediately after. The planned merge uses this to size output buffers exactly.
233
+ // Size of a column blob's INDEX section (offsets array + types array) for a column of N rows. The data section follows immediately after. The planned merge uses this to size output buffers exactly.
251
234
  function columnIndexByteLength(rowCount) {
252
235
  return 4 * (rowCount + 1) + rowCount;
253
236
  }
254
237
  exports.columnIndexByteLength = columnIndexByteLength;
255
- // Assembles a complete bulk file from a set of pre-built value column blobs plus the keys + times. Auto-
256
- // adds the KEY_COLUMN (keys) and hidden TIME_COLUMN (times) — they're small enough to encode in one shot
257
- // here. Used by the planned merge: it builds each value column's blob by-hand (offsets/types + raw bytes
258
- // copied directly from inputs, no value materialization) and hands the result here for header + bounds.
238
+ // Assembles a complete bulk file from a set of pre-built value column blobs plus the keys + times. Auto- adds the KEY_COLUMN (keys) and hidden TIME_COLUMN (times) — they're small enough to encode in one shot here. Used by the planned merge: it builds each value column's blob by-hand (offsets/types + raw bytes copied directly from inputs, no value materialization) and hands the result here for header + bounds.
259
239
  function assemblePlannedFile(config) {
260
240
  const columnNames = [exports.KEY_COLUMN, ...config.valueColumns.map(c => c.name), TIME_COLUMN];
261
241
  const blobs = [
@@ -268,8 +248,7 @@ function assemblePlannedFile(config) {
268
248
  exports.assemblePlannedFile = assemblePlannedFile;
269
249
  const ABSENT_CELL = { type: TYPE_ABSENT, bytes: exports.EMPTY_BUFFER };
270
250
  function buildOneFileRaw(rows) {
271
- // Columns present in this chunk, in first-seen order (matches buildOneFile, which only emits columns
272
- // some row actually has).
251
+ // Columns present in this chunk, in first-seen order (matches buildOneFile, which only emits columns some row actually has).
273
252
  const valueColumns = [];
274
253
  const seen = new Set();
275
254
  for (const row of rows)
@@ -294,12 +273,7 @@ function estimateRawRowBytes(row) {
294
273
  total += cell.bytes.length + PER_VALUE_OVERHEAD;
295
274
  return total;
296
275
  }
297
- // Returns one complete, independent file per chunk of rows. Rows are first sorted by key, then
298
- // partitioned into key-contiguous chunks of ~targetBytes each — so every returned file is key-sorted
299
- // (tight minKey/maxKey for the read-skip + merge planner) and stays near the target size, and no
300
- // single column blob / Buffer.concat approaches the ~2GB limit. The chunks have disjoint key ranges,
301
- // so the caller just writes each as its own file. A normal-sized write returns a single file.
302
- // `times[i]` is row i's write-time, stored per row so reads resolve a key to its latest value by time.
276
+ // Returns one complete, independent file per chunk of rows. Rows are first sorted by key, then partitioned into key-contiguous chunks of ~targetBytes each — so every returned file is key-sorted (tight minKey/maxKey for the read-skip + merge planner) and stays near the target size, and no single column blob / Buffer.concat approaches the ~2GB limit. The chunks have disjoint key ranges, so the caller just writes each as its own file. A normal-sized write returns a single file. `times[i]` is row i's write-time, stored per row so reads resolve a key to its latest value by time.
303
277
  function buildFileBuffer(rows, times, targetBytes = exports.TARGET_FILE_BYTES) {
304
278
  // A chunk is already key-sorted, so its first/last row are its min/max key.
305
279
  const make = (rs, ts) => ({
@@ -334,9 +308,7 @@ function buildFileBuffer(rows, times, targetBytes = exports.TARGET_FILE_BYTES) {
334
308
  return result;
335
309
  }
336
310
  exports.buildFileBuffer = buildFileBuffer;
337
- // The raw-splice counterpart of buildFileBuffer, used by merges: the rows already carry their winning
338
- // cells as raw on-disk bytes (no JS values), so this just sorts by key, chunks to ~targetBytes, and
339
- // concatenates the bytes. Same output guarantees: key-contiguous, disjoint, ascending files.
311
+ // The raw-splice counterpart of buildFileBuffer, used by merges: the rows already carry their winning cells as raw on-disk bytes (no JS values), so this just sorts by key, chunks to ~targetBytes, and concatenates the bytes. Same output guarantees: key-contiguous, disjoint, ascending files.
340
312
  function buildFileBufferRaw(rows, targetBytes = exports.TARGET_FILE_BYTES) {
341
313
  const make = (rs) => ({
342
314
  buffer: buildOneFileRaw(rs),
@@ -404,8 +376,7 @@ async function loadBulkDatabase(config) {
404
376
  return v;
405
377
  });
406
378
  const keyIndex = new Map(keys.map((key, i) => [key, i]));
407
- // Per-row write-times. Old files (written before this column existed) fall back to the file's header
408
- // time (or 0) for every row — fine, since such files predate concurrent-time resolution.
379
+ // Per-row write-times. Old files (written before this column existed) fall back to the file's header time (or 0) for every row — fine, since such files predate concurrent-time resolution.
409
380
  const times = colByName.has(TIME_COLUMN)
410
381
  ? (await readWholeColumn(TIME_COLUMN)).map(v => typeof v === "number" ? v : 0)
411
382
  : keys.map(() => header.maxTime || 0);
@@ -444,8 +415,7 @@ async function loadBulkDatabase(config) {
444
415
  async getColumnIndex(column) {
445
416
  const col = colByName.get(column);
446
417
  if (!col) {
447
- // File lacks this column — present an all-ABSENT index so the planner can treat it
448
- // uniformly with files that have the column.
418
+ // File lacks this column — present an all-ABSENT index so the planner can treat it uniformly with files that have the column.
449
419
  const offsets = new Uint32Array(rowCount + 1);
450
420
  const types = new Uint8Array(rowCount).fill(TYPE_ABSENT);
451
421
  return {
@@ -456,8 +426,7 @@ async function loadBulkDatabase(config) {
456
426
  }
457
427
  const colBase = dataBase + col.offset;
458
428
  const indexSize = 4 * (rowCount + 1) + rowCount;
459
- // One read pulls offsets + types (small — ~5 B/row). Block cache makes subsequent value reads
460
- // of nearby rows cheap. Decoded into aligned typed arrays so the executor can do O(1) lookups.
429
+ // One read pulls offsets + types (small — ~5 B/row). Block cache makes subsequent value reads of nearby rows cheap. Decoded into aligned typed arrays so the executor can do O(1) lookups.
461
430
  const indexBuf = await config.getRange(colBase, colBase + indexSize);
462
431
  const offsets = new Uint32Array(rowCount + 1);
463
432
  for (let i = 0; i <= rowCount; i++)
@@ -509,5 +478,5 @@ async function loadBulkDatabase(config) {
509
478
  };
510
479
  }
511
480
  exports.loadBulkDatabase = loadBulkDatabase;
512
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVsa0RhdGFiYXNlRm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQnVsa0RhdGFiYXNlRm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw0Q0FBNEM7QUFDNUMsNkpBQTZKO0FBQzdKLGdMQUFnTDtBQUNoTCxnSUFBZ0k7OztBQUVuSCxRQUFBLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFFaEMsNEtBQTRLO0FBQzVLLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDdEIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN2QixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDdEIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBQzdCLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBQzlCLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBQzlCLHFHQUFxRztBQUNyRyxzR0FBc0c7QUFDdEcsK0RBQStEO0FBQy9ELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUV2QixNQUFNLGlCQUFpQixHQUFxSDtJQUN4SSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtJQUMxQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO0lBQzVDLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLElB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LENBQUMsT0FBTyxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1RCxNQUFNLFNBQVMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUMxRCxJQUFJLEtBQUssR0FBRyxvQkFBWSxDQUFDO1lBQ3pCLElBQUksR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDO2dCQUNkLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEtBQUssRUFBRSxTQUFTLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDdEUsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0MsSUFBSSxLQUFLLEtBQUssY0FBTTtnQkFBRSxPQUFPLGNBQU0sQ0FBQztZQUNwQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxDQUFDO0tBQ0osQ0FBQztBQUNOLENBQUM7QUE5SEQsNENBOEhDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZSBmb3JtYXQgKGFsbCBpbnRlZ2VycyBsaXR0bGUtZW5kaWFuKTpcbi8vICAgdTMyIGhlYWRlckxlbmd0aCwgdGhlbiBoZWFkZXJMZW5ndGggYnl0ZXMgb2YgSlNPTjogeyByb3dDb3VudCwgY29sdW1uczogW3sgbmFtZSwgb2Zmc2V0LCBsZW5ndGggfV0gfSwgd2hlcmUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGhlYWRlci5cbi8vICAgRWFjaCBjb2x1bW4gYmxvYiBpczogdTMyIG9mZnNldHNbcm93Q291bnQgKyAxXSAoYnl0ZSBvZmZzZXRzIGludG8gdGhlIGNvbHVtbidzIGRhdGEgc2VjdGlvbiksIHU4IHR5cGVzW3Jvd0NvdW50XSwgdGhlbiB0aGUgZGF0YSBzZWN0aW9uIChlYWNoIHZhbHVlJ3MgYnl0ZXMsIGNvbmNhdGVuYXRlZCkuXG4vLyBWYWx1ZXMgYXJlIGVuY29kZWQgd2l0aCBhbiBleHBsaWNpdCB0eXBlIHRhZyBwZXIgdmFsdWUgKHNlZSB0aGUgVFlQRV8gY29uc3RhbnRzKS4gUmVhZHMgb25seSBmZXRjaCB0aGUgYnl0ZSByYW5nZXMgdGhleSBuZWVkLlxuXG5leHBvcnQgY29uc3QgS0VZX0NPTFVNTiA9IFwia2V5XCI7XG5cbi8vIEV2ZXJ5IHRhZyBpcyBhbiBleHBsaWNpdCBjb25zdGFudCBiYWtlZCBpbnRvIGZpbGVzIG9uIGRpc2suIE5FVkVSIHJlbnVtYmVyIGFuIGV4aXN0aW5nIHRhZyDigJQgb25seSBhZGQgbmV3IG9uZXMg4oCUIG9yIGV2ZXJ5IHByZXZpb3VzbHkgd3JpdHRlbiBmaWxlIHNpbGVudGx5IGRlY29kZXMgd3JvbmcuXG5jb25zdCBUWVBFX1VOREVGSU5FRCA9IDA7XG5jb25zdCBUWVBFX1NUUklORyA9IDE7XG5jb25zdCBUWVBFX05VTUJFUiA9IDI7XG5jb25zdCBUWVBFX0JPT0xFQU4gPSAzO1xuY29uc3QgVFlQRV9PQkpFQ1QgPSA0O1xuY29uc3QgVFlQRV9JTlQ4X0FSUkFZID0gNTtcbmNvbnN0IFRZUEVfVUlOVDhfQVJSQVkgPSA2O1xuY29uc3QgVFlQRV9VSU5UOF9DTEFNUEVEX0FSUkFZID0gNztcbmNvbnN0IFRZUEVfSU5UMTZfQVJSQVkgPSA4O1xuY29uc3QgVFlQRV9VSU5UMTZfQVJSQVkgPSA5O1xuY29uc3QgVFlQRV9JTlQzMl9BUlJBWSA9IDEwO1xuY29uc3QgVFlQRV9VSU5UMzJfQVJSQVkgPSAxMTtcbmNvbnN0IFRZUEVfRkxPQVQzMl9BUlJBWSA9IDEyO1xuY29uc3QgVFlQRV9GTE9BVDY0X0FSUkFZID0gMTM7XG4vLyBBIGNlbGwgd2hvc2Ugcm93IG5ldmVyIHNldCB0aGlzIGNvbHVtbiBhdCBhbGwg4oCUIGFzIG9wcG9zZWQgdG8gVFlQRV9VTkRFRklORUQsIGFuIGV4cGxpY2l0bHkgc3RvcmVkXG4vLyB1bmRlZmluZWQuIE9uIHJlYWQsIEFCU0VOVCBmYWxscyB0aHJvdWdoIHRvIG9sZGVyIHJlYWRlcnMgZm9yIHRoYXQgY29sdW1uOyBhIHN0b3JlZCB1bmRlZmluZWQgc3RvcHNcbi8vIHRoZSBmYWxsLXRocm91Z2ggKGl0J3MgYSByZWFsIHZhbHVlIHRoYXQgY2xlYXJzIHRoZSBjb2x1bW4pLlxuY29uc3QgVFlQRV9BQlNFTlQgPSAxNDtcblxuY29uc3QgVFlQRURfQVJSQVlfVFlQRVM6IHsgdHlwZTogbnVtYmVyOyBjdG9yOiB7IG5ldyhidWZmZXI6IEFycmF5QnVmZmVyKTogQXJyYXlCdWZmZXJWaWV3OyBCWVRFU19QRVJfRUxFTUVOVDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfSB9W10gPSBbXG4gICAgeyB0eXBlOiBUWVBFX0lOVDhfQVJSQVksIGN0b3I6IEludDhBcnJheSB9LFxuICAgIHsgdHlwZTogVFlQRV9VSU5UOF9BUlJBWSwgY3RvcjogVWludDhBcnJheSB9LFxuICAgIHsgdHlwZTogVFlQRV9VSU5UOF9DTEFNUEVEX0FSUkFZLCBjdG9yOiBVaW50OENsYW1wZWRBcnJheSB9LFxuICAgIHsgdHlwZTogVFlQRV9JTlQxNl9BUlJBWSwgY3RvcjogSW50MTZBcnJheSB9LFxuICAgIHsgdHlwZTogVFlQRV9VSU5UMTZfQVJSQVksIGN0b3I6IFVpbnQxNkFycmF5IH0sXG4gICAgeyB0eXBlOiBUWVBFX0lOVDMyX0FSUkFZLCBjdG9yOiBJbnQzMkFycmF5IH0sXG4gICAgeyB0eXBlOiBUWVBFX1VJTlQzMl9BUlJBWSwgY3RvcjogVWludDMyQXJyYXkgfSxcbiAgICB7IHR5cGU6IFRZUEVfRkxPQVQzMl9BUlJBWSwgY3RvcjogRmxvYXQzMkFycmF5IH0sXG4gICAgeyB0eXBlOiBUWVBFX0ZMT0FUNjRfQVJSQVksIGN0b3I6IEZsb2F0NjRBcnJheSB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IEVNUFRZX0JVRkZFUiA9IEJ1ZmZlci5hbGxvYygwKSBhcyBCdWZmZXI7XG5cbi8vIFNlbnRpbmVsIGEgcmVhZGVyIHJldHVybnMgZm9yIGEgY2VsbCB3aG9zZSByb3cgbmV2ZXIgc2V0IHRoaXMgY29sdW1uLCBzbyB0aGUgam9pbiBjYW4gZmFsbCB0aHJvdWdoXG4vLyB0byBhbiBvbGRlciByZWFkZXIgZm9yIHRoYXQgY29sdW1uLiBEaXN0aW5jdCBmcm9tIGEgc3RvcmVkIHVuZGVmaW5lZCwgd2hpY2ggaXMgYSByZWFsIGNsZWFyaW5nIHZhbHVlLlxuZXhwb3J0IGNvbnN0IEFCU0VOVCA9IFN5bWJvbChcImFic2VudFwiKTtcblxuLy8gT25lIHZhbHVlIGV4YWN0bHkgYXMgaXQgc2l0cyBvbiBkaXNrOiBpdHMgdHlwZSB0YWcgKyByYXcgYnl0ZXMuIEEgY2VsbCdzIGVuY29kaW5nIGlzIHBvc2l0aW9uLVxuLy8gaW5kZXBlbmRlbnQgKG5vdGhpbmcgYWJvdXQgaXQgZGVwZW5kcyBvbiB3aGljaCByb3cvZmlsZSBpdCBsaXZlcyBpbiksIHNvIGEgbWVyZ2UgY29waWVzIHRoZSB3aW5uaW5nXG4vLyBSYXdDZWxsIHN0cmFpZ2h0IGZyb20gYW4gaW5wdXQgY29sdW1uIGludG8gdGhlIG91dHB1dCDigJQgbmV2ZXIgZGVjb2RpbmcgaXQgdG8gYSBKUyB2YWx1ZSBhbmRcbi8vIHJlLWVuY29kaW5nLiBUaGF0J3MgZmFyIGxlc3MgbWVtb3J5IChubyBvYmplY3QgbWF0ZXJpYWxpemF0aW9uKSBhbmQgbXVjaCBmYXN0ZXIgKGEgYnl0ZSBjb3B5LCBub3QgYVxuLy8gSlBFRy90eXBlZC1hcnJheSBkZWNvZGUgKyByZS1lbmNvZGUpLlxuZXhwb3J0IHR5cGUgUmF3Q2VsbCA9IHsgdHlwZTogbnVtYmVyOyBieXRlczogQnVmZmVyIH07XG5cbi8vIFRoZSB0eXBlIHRhZyBhIGNlbGwgY2FycmllcyB3aGVuIGl0cyByb3cgbmV2ZXIgc2V0IHRoaXMgY29sdW1uIOKAlCByZWFkIGl0IGZyb20gdGhlIGNvbHVtbidzIGB0eXBlc2Bcbi8vIGFycmF5IHRvIGRldGVjdCBBQlNFTlQgd2l0aG91dCBkZWNvZGluZy4gUmUtZXhwb3J0ZWQgc28gdGhlIG1lcmdlIHBsYW5uZXIgKHdoaWNoIHdvcmtzIGF0IHRoZVxuLy8gY29sdW1uLWluZGV4IGxldmVsLCBubyB2YWx1ZSBtYXRlcmlhbGl6YXRpb24pIGNhbiBjaGVjayBpdC5cbmV4cG9ydCBjb25zdCBUWVBFX0FCU0VOVF9UQUcgPSBUWVBFX0FCU0VOVDtcblxuLy8gQSBjb2x1bW4ncyBpbmRleCBhbG9uZSAob2Zmc2V0cyArIHR5cGVzIOKAlCBzbWFsbCwgfjUgYnl0ZXMvcm93KSBwbHVzIGEgcHJpbWl0aXZlIHRvIHJlYWQgYSBDT05USUdVT1VTXG4vLyByb3cgcmFuZ2UncyByYXcgdmFsdWUgYnl0ZXMuIFVzZWQgYnkgdGhlIHBsYW5uZWQgbWVyZ2U6IGl0IGxvYWRzIHRoZSBpbmRleCBhY3Jvc3MgZXZlcnkgKHNvdXJjZSxcbi8vIGNvbHVtbikgb25jZSAoY2hlYXApLCB1c2VzIHR5cGVzIHRvIGRldGVjdCBBQlNFTlQgYW5kIG9mZnNldHMgdG8gc2l6ZSBlYWNoIGNlbGwsIHBsYW5zIHRoZSBieXRlXG4vLyBsYXlvdXQgb2YgZXZlcnkgb3V0cHV0IGZpbGUgZnJvbSB0aG9zZSDigJQgdGhlbiBpbiB0aGUgZXhlY3V0ZSBwaGFzZSByZWFkcyBvbmx5IHRoZSBydW5zIG9mIGJ5dGVzIGl0XG4vLyBhY3R1YWxseSBuZWVkcywgY29weWluZyB0aGVtIHN0cmFpZ2h0IGludG8gcHJlLWxhaWQtb3V0IG91dHB1dCBidWZmZXJzLiBObyBjZWxsIHZhbHVlIGlzIGV2ZXJcbi8vIG1hdGVyaWFsaXplZCBhcyBhIEpTIG9iamVjdC5cbmV4cG9ydCB0eXBlIENvbHVtbkluZGV4ID0ge1xuICAgIC8vIG9mZnNldHNbaV0uLm9mZnNldHNbaSsxXSBpcyByb3cgaSdzIHZhbHVlIGJ5dGUgcmFuZ2Ugd2l0aGluIHRoZSBjb2x1bW4ncyBkYXRhIHNlY3Rpb24uXG4gICAgb2Zmc2V0czogVWludDMyQXJyYXk7XG4gICAgLy8gUGVyLXJvdyB0eXBlIHRhZzsgVFlQRV9BQlNFTlRfVEFHIG1hcmtzIFwidGhpcyByb3cgbmV2ZXIgc2V0IHRoaXMgY29sdW1uXCIgKGZhbGwtdGhyb3VnaCkuXG4gICAgdHlwZXM6IFVpbnQ4QXJyYXk7XG4gICAgLy8gUmVhZCB0aGUgY29udGlndW91cyBieXRlcyBvZiB2YWx1ZShzKSBmb3Igcm93cyBbc3RhcnRSb3csIGVuZFJvdykuIExlbmd0aCBpcyBleGFjdGx5XG4gICAgLy8gb2Zmc2V0c1tlbmRSb3ddIC0gb2Zmc2V0c1tzdGFydFJvd10g4oCUIHRoZSBjZWxscyBpbiB0aGF0IHJhbmdlIGNvbmNhdGVuYXRlZC4gVGhlIGNhbGxlciBjb21wb3Nlc1xuICAgIC8vIGxhcmdlciByZWFkcyBmcm9tIGNvbnNlY3V0aXZlIHJvd3MgKG9uZSBzb3VyY2Utc2lkZSBnZXRSYW5nZSBwZXIgcnVuKS5cbiAgICByZWFkVmFsdWVCeXRlczogKHN0YXJ0Um93OiBudW1iZXIsIGVuZFJvdzogbnVtYmVyKSA9PiBQcm9taXNlPEJ1ZmZlcj47XG59O1xuXG4vLyBIaWRkZW4gcGVyLXJvdyBjb2x1bW4gaG9sZGluZyBlYWNoIHJvdydzIHdyaXRlLXRpbWUgKHNvIHJlYWRzIGNhbiByZXNvbHZlIGEga2V5IHRvIGl0cyBsYXRlc3QgdmFsdWVcbi8vIGJ5IGFjdHVhbCB0aW1lKS4gTlVMLXByZWZpeGVkIHNvIGl0IGNhbid0IGNvbGxpZGUgd2l0aCBhIHVzZXIgY29sdW1uOyBleGNsdWRlZCBmcm9tIGBjb2x1bW5zYC5cbmNvbnN0IFRJTUVfQ09MVU1OID0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKSArIFwidFwiO1xuXG50eXBlIEZpbGVIZWFkZXIgPSB7XG4gICAgcm93Q291bnQ6IG51bWJlcjtcbiAgICBjb2x1bW5zOiB7IG5hbWU6IHN0cmluZzsgb2Zmc2V0OiBudW1iZXI7IGxlbmd0aDogbnVtYmVyIH1bXTtcbiAgICAvLyBPbGRlc3QvbmV3ZXN0IHdyaXRlLXRpbWUgb2YgdGhlIGRhdGEgaW4gdGhpcyBmaWxlIChmcm9tIHRoZSBzdHJlYW0gZW50cmllcyBpdCB3YXMgZm9sZGVkIGZyb20sXG4gICAgLy8gY2FycmllZCB0aHJvdWdoIG1lcmdlcykuIExldHMgdGhlIG1lcmdlIHBsYW5uZXIgcGljayBmaWxlcyBvdmVybGFwcGluZyBhIHRpbWUgcmFuZ2UuIEFic2VudCAoMClcbiAgICAvLyBpbiBmaWxlcyB3cml0dGVuIGJlZm9yZSB0aGlzIGV4aXN0ZWQuXG4gICAgbWluVGltZT86IG51bWJlcjtcbiAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgIC8vIExleGljb2dyYXBoaWNhbGx5IHNtYWxsZXN0L2xhcmdlc3Qga2V5IGluIHRoaXMgZmlsZSAocm93cyBhcmUgc3RvcmVkIGtleS1zb3J0ZWQpLiBMZXRzIHRoZSBtZXJnZVxuICAgIC8vIHBsYW5uZXIgZ3JvdXAvZGVkdXAgYnkga2V5IHJhbmdlIGFuZCBsZXRzIGEgc2luZ2xlLWtleSByZWFkIHNraXAgZmlsZXMgd2hvc2UgcmFuZ2UgZXhjbHVkZXMgdGhlXG4gICAgLy8ga2V5LiBBYnNlbnQgKHVuZGVmaW5lZCkgaW4gZmlsZXMgd3JpdHRlbiBiZWZvcmUgdGhpcyBleGlzdGVkIOKAlCB0cmVhdGVkIGFzIFwic3BhbnMgYWxsIGtleXNcIi5cbiAgICBtaW5LZXk/OiBzdHJpbmc7XG4gICAgbWF4S2V5Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVZhbHVlKHZhbHVlOiB1bmtub3duKTogeyB0eXBlOiBudW1iZXI7IGJ5dGVzOiBCdWZmZXIgfSB7XG4gICAgaWYgKHZhbHVlID09PSBBQlNFTlQpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogVFlQRV9BQlNFTlQsIGJ5dGVzOiBFTVBUWV9CVUZGRVIgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogVFlQRV9VTkRFRklORUQsIGJ5dGVzOiBFTVBUWV9CVUZGRVIgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBUWVBFX1NUUklORywgYnl0ZXM6IEJ1ZmZlci5mcm9tKHZhbHVlLCBcInV0ZjhcIikgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICAgICAgYnl0ZXMud3JpdGVEb3VibGVMRSh2YWx1ZSwgMCk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFRZUEVfTlVNQkVSLCBieXRlcyB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBUWVBFX0JPT0xFQU4sIGJ5dGVzOiBCdWZmZXIuZnJvbShbdmFsdWUgJiYgMSB8fCAwXSkgfTtcbiAgICB9XG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0YVZpZXcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YVZpZXcgdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkLCBzdG9yZSBhIHR5cGVkIGFycmF5IGluc3RlYWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyeSA9IFRZUEVEX0FSUkFZX1RZUEVTLmZpbmQodCA9PiB2YWx1ZSBpbnN0YW5jZW9mIHQuY3Rvcik7XG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZWQgYXJyYXkgdHlwZSAke3ZhbHVlLmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IGVudHJ5LnR5cGUsXG4gICAgICAgICAgICBieXRlczogQnVmZmVyLmZyb20odmFsdWUuYnVmZmVyLCB2YWx1ZS5ieXRlT2Zmc2V0LCB2YWx1ZS5ieXRlTGVuZ3RoKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHZhbHVlIHR5cGUgJHt0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHR5cGU6IFRZUEVfT0JKRUNULCBieXRlczogQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWUpLCBcInV0ZjhcIikgfTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlVmFsdWUodHlwZTogbnVtYmVyLCBieXRlczogQnVmZmVyKTogdW5rbm93biB7XG4gICAgaWYgKHR5cGUgPT09IFRZUEVfVU5ERUZJTkVEKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlID09PSBUWVBFX1NUUklORykgcmV0dXJuIGJ5dGVzLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICBpZiAodHlwZSA9PT0gVFlQRV9OVU1CRVIpIHtcbiAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCAhPT0gOCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCA4IGJ5dGVzIGZvciBhIG51bWJlciwgd2FzICR7Ynl0ZXMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBieXRlcy5yZWFkRG91YmxlTEUoMCk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBUWVBFX0JPT0xFQU4pIHtcbiAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAxIGJ5dGUgZm9yIGEgYm9vbGVhbiwgd2FzICR7Ynl0ZXMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBieXRlc1swXSA9PT0gMTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFRZUEVfT0JKRUNUKSByZXR1cm4gSlNPTi5wYXJzZShieXRlcy50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgIGlmICh0eXBlID09PSBUWVBFX0FCU0VOVCkgcmV0dXJuIEFCU0VOVDtcbiAgICBjb25zdCBlbnRyeSA9IFRZUEVEX0FSUkFZX1RZUEVTLmZpbmQodCA9PiB0LnR5cGUgPT09IHR5cGUpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHZhbGlkIHR5cGUgdGFnLCB3YXMgJHt0eXBlfWApO1xuICAgIH1cbiAgICBjb25zdCBjdG9yID0gZW50cnkuY3RvcjtcbiAgICBpZiAodHlwZSA9PT0gVFlQRV9VSU5UOF9BUlJBWSkgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ5dGVzKTtcbiAgICBpZiAoYnl0ZXMubGVuZ3RoICUgY3Rvci5CWVRFU19QRVJfRUxFTUVOVCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGJ5dGUgbGVuZ3RoIGRpdmlzaWJsZSBieSAke2N0b3IuQllURVNfUEVSX0VMRU1FTlR9IGZvciAke2N0b3IubmFtZX0sIHdhcyAke2J5dGVzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgLy8gQ29weSB0byBhIGZyZXNoIEFycmF5QnVmZmVyIHNvIHRoZSB0eXBlZCBhcnJheSB2aWV3IGlzIGFsaWduZWQgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGUgYnl0ZXMgbGFuZGVkIGluIHRoZSBzb3VyY2UgYnVmZmVyLlxuICAgIGNvbnN0IGFsaWduZWQgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZXMubGVuZ3RoKTtcbiAgICBuZXcgVWludDhBcnJheShhbGlnbmVkKS5zZXQoYnl0ZXMpO1xuICAgIHJldHVybiBuZXcgY3RvcihhbGlnbmVkKTtcbn1cblxuZnVuY3Rpb24gZW5jb2RlQnVsa0RhdGEoZGF0YTogdW5rbm93bltdKTogQnVmZmVyIHtcbiAgICBjb25zdCBuID0gZGF0YS5sZW5ndGg7XG4gICAgY29uc3Qgb2Zmc2V0cyA9IEJ1ZmZlci5hbGxvYyg0ICogKG4gKyAxKSk7XG4gICAgY29uc3QgdHlwZXMgPSBCdWZmZXIuYWxsb2Mobik7XG4gICAgY29uc3QgcGFydHM6IEJ1ZmZlcltdID0gW107XG4gICAgbGV0IHBvcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgY29uc3QgeyB0eXBlLCBieXRlcyB9ID0gZW5jb2RlVmFsdWUoZGF0YVtpXSk7XG4gICAgICAgIG9mZnNldHMud3JpdGVVSW50MzJMRShwb3MsIDQgKiBpKTtcbiAgICAgICAgdHlwZXNbaV0gPSB0eXBlO1xuICAgICAgICBwYXJ0cy5wdXNoKGJ5dGVzKTtcbiAgICAgICAgcG9zICs9IGJ5dGVzLmxlbmd0aDtcbiAgICB9XG4gICAgb2Zmc2V0cy53cml0ZVVJbnQzMkxFKHBvcywgNCAqIG4pO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtvZmZzZXRzLCB0eXBlcywgLi4ucGFydHNdKTtcbn1cblxuLy8gTGlrZSBlbmNvZGVCdWxrRGF0YSBidXQgdGhlIHZhbHVlcyBhcmUgYWxyZWFkeSBlbmNvZGVkIChhIG1lcmdlIHN1cHBsaWVzIHRoZSB3aW5uaW5nIGNlbGxzJyByYXcgYnl0ZXNcbi8vIHN0cmFpZ2h0IGZyb20gdGhlIGlucHV0IGZpbGVzKS4gTGF5cyBvdXQgdGhlIHNhbWUgb2Zmc2V0cyAvIHR5cGVzIC8gZGF0YSBzZWN0aW9uIHdpdGhvdXQgdG91Y2hpbmcgdGhlXG4vLyB2YWx1ZXMgdGhlbXNlbHZlcy5cbmZ1bmN0aW9uIGVuY29kZUJ1bGtEYXRhUmF3KGNlbGxzOiBSYXdDZWxsW10pOiBCdWZmZXIge1xuICAgIGNvbnN0IG4gPSBjZWxscy5sZW5ndGg7XG4gICAgY29uc3Qgb2Zmc2V0cyA9IEJ1ZmZlci5hbGxvYyg0ICogKG4gKyAxKSk7XG4gICAgY29uc3QgdHlwZXMgPSBCdWZmZXIuYWxsb2Mobik7XG4gICAgY29uc3QgcGFydHM6IEJ1ZmZlcltdID0gW107XG4gICAgbGV0IHBvcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgY29uc3QgeyB0eXBlLCBieXRlcyB9ID0gY2VsbHNbaV07XG4gICAgICAgIG9mZnNldHMud3JpdGVVSW50MzJMRShwb3MsIDQgKiBpKTtcbiAgICAgICAgdHlwZXNbaV0gPSB0eXBlO1xuICAgICAgICBwYXJ0cy5wdXNoKGJ5dGVzKTtcbiAgICAgICAgcG9zICs9IGJ5dGVzLmxlbmd0aDtcbiAgICB9XG4gICAgb2Zmc2V0cy53cml0ZVVJbnQzMkxFKHBvcywgNCAqIG4pO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtvZmZzZXRzLCB0eXBlcywgLi4ucGFydHNdKTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlQnVsa0RhdGEoYmxvYjogQnVmZmVyLCByb3dDb3VudDogbnVtYmVyKTogdW5rbm93bltdIHtcbiAgICBjb25zdCBpbmRleFNpemUgPSA0ICogKHJvd0NvdW50ICsgMSkgKyByb3dDb3VudDtcbiAgICBjb25zdCB2YWx1ZXM6IHVua25vd25bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykge1xuICAgICAgICBjb25zdCBzdGFydCA9IGJsb2IucmVhZFVJbnQzMkxFKDQgKiBpKTtcbiAgICAgICAgY29uc3QgZW5kID0gYmxvYi5yZWFkVUludDMyTEUoNCAqIChpICsgMSkpO1xuICAgICAgICBjb25zdCB0eXBlID0gYmxvYls0ICogKHJvd0NvdW50ICsgMSkgKyBpXTtcbiAgICAgICAgdmFsdWVzLnB1c2goZGVjb2RlVmFsdWUodHlwZSwgYmxvYi5zdWJhcnJheShpbmRleFNpemUgKyBzdGFydCwgaW5kZXhTaXplICsgZW5kKSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xufVxuXG4vLyBUYXJnZXQgbG9naWNhbCAodW5jb21wcmVzc2VkKSBzaXplIG9mIG9uZSBidWxrIGZpbGUuIEEgcm93cyBhcnJheSBiaWdnZXIgdGhhbiB0aGlzIGlzIHNwbGl0IGFjcm9zc1xuLy8gbXVsdGlwbGUga2V5LWNvbnRpZ3VvdXMgZmlsZXMsIHNvIGZpbGVzIHN0YXkgYXJvdW5kIHRoaXMgc2l6ZSAodGhlIG1lcmdlIHBvbGljeSdzIHRhcmdldCkgYW5kIG5vXG4vLyBzaW5nbGUgY29sdW1uIGJsb2IgLyBCdWZmZXIuY29uY2F0IGV2ZXIgYXBwcm9hY2hlcyB0aGUgfjJHQiBCdWZmZXIgbGVuZ3RoIGxpbWl0LiBUaGUgZXN0aW1hdGUgaXNcbi8vIHJvdWdoIG9uIHB1cnBvc2Ug4oCUIGl0IG9ubHkgbmVlZHMgdG8ga2VlcCBlYWNoIGNodW5rIG5lYXIgdGhlIHRhcmdldCwgbm90IGJlIGV4YWN0LiBBIHNpbmdsZSByb3dcbi8vIGJpZ2dlciB0aGFuIHRoZSB0YXJnZXQgc3RpbGwgYmVjb21lcyBpdHMgb3duIChvdmVyc2l6ZWQpIGZpbGUsIHNpbmNlIHdlIG5ldmVyIHNwbGl0IHdpdGhpbiBhIGtleS5cbmV4cG9ydCBjb25zdCBUQVJHRVRfRklMRV9CWVRFUyA9IDI1NiAqIDEwMjQgKiAxMDI0O1xuXG4vLyBQZXItdmFsdWUgb24tZGlzayBvdmVyaGVhZDogYSA0LWJ5dGUgb2Zmc2V0IGVudHJ5IHBsdXMgYSAxLWJ5dGUgdHlwZSB0YWcuXG5jb25zdCBQRVJfVkFMVUVfT1ZFUkhFQUQgPSA1O1xuXG5mdW5jdGlvbiBlc3RpbWF0ZVZhbHVlQnl0ZXModmFsdWU6IHVua25vd24pOiBudW1iZXIge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gMDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWUubGVuZ3RoICogMjtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gODtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIDE7XG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkpIHJldHVybiB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkubGVuZ3RoO1xuICAgIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBlc3RpbWF0ZVJvd0J5dGVzKHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBudW1iZXIge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKHJvdykpIHtcbiAgICAgICAgdG90YWwgKz0gZXN0aW1hdGVWYWx1ZUJ5dGVzKHZhbHVlKSArIFBFUl9WQUxVRV9PVkVSSEVBRDtcbiAgICB9XG4gICAgcmV0dXJuIHRvdGFsO1xufVxuXG4vLyBDb25jYXRlbmF0ZXMgYWxyZWFkeS1lbmNvZGVkIGNvbHVtbiBibG9icyBpbnRvIGEgY29tcGxldGUgZmlsZSAoNC1ieXRlIGhlYWRlciBsZW5ndGggKyBoZWFkZXIgSlNPTiArXG4vLyBibG9icyksIGNvbXB1dGluZyB0aGUgaGVhZGVyJ3MgdGltZSArIGtleSBib3VuZHMgZnJvbSB0aGUgcGVyLXJvdyB0aW1lcyBhbmQga2V5cy4gU2hhcmVkIGJ5IHRoZVxuLy8gb2JqZWN0LWJhc2VkIGJ1aWxkZXIgKGJ1aWxkT25lRmlsZSkgYW5kIHRoZSByYXctc3BsaWNlIGJ1aWxkZXIgKGJ1aWxkT25lRmlsZVJhdykuXG5mdW5jdGlvbiBhc3NlbWJsZUZpbGUoY29sdW1uTmFtZXM6IHN0cmluZ1tdLCBibG9iczogQnVmZmVyW10sIHJvd0NvdW50OiBudW1iZXIsIHRpbWVzOiBudW1iZXJbXSwga2V5czogc3RyaW5nW10pOiBCdWZmZXIge1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBjb2x1bW5OYW1lcy5tYXAoKG5hbWUsIGkpID0+IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB7IG5hbWUsIG9mZnNldCwgbGVuZ3RoOiBibG9ic1tpXS5sZW5ndGggfTtcbiAgICAgICAgb2Zmc2V0ICs9IGJsb2JzW2ldLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xuICAgIGxldCBtaW5UaW1lID0gdGltZXMubGVuZ3RoID8gdGltZXNbMF0gOiAwO1xuICAgIGxldCBtYXhUaW1lID0gbWluVGltZTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGltZXMpIHsgaWYgKHQgPCBtaW5UaW1lKSBtaW5UaW1lID0gdDsgaWYgKHQgPiBtYXhUaW1lKSBtYXhUaW1lID0gdDsgfVxuICAgIGxldCBtaW5LZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbWF4S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAobWluS2V5ID09PSB1bmRlZmluZWQgfHwga2V5IDwgbWluS2V5KSBtaW5LZXkgPSBrZXk7XG4gICAgICAgIGlmIChtYXhLZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPiBtYXhLZXkpIG1heEtleSA9IGtleTtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVyOiBGaWxlSGVhZGVyID0geyByb3dDb3VudCwgY29sdW1ucywgbWluVGltZSwgbWF4VGltZSwgbWluS2V5LCBtYXhLZXkgfTtcbiAgICBjb25zdCBoZWFkZXJCdWYgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShoZWFkZXIpLCBcInV0ZjhcIik7XG4gICAgY29uc3QgbGVuZ3RoUHJlZml4ID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIGxlbmd0aFByZWZpeC53cml0ZVVJbnQzMkxFKGhlYWRlckJ1Zi5sZW5ndGgsIDApO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtsZW5ndGhQcmVmaXgsIGhlYWRlckJ1ZiwgLi4uYmxvYnNdKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRPbmVGaWxlKHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sIHRpbWVzOiBudW1iZXJbXSk6IEJ1ZmZlciB7XG4gICAgY29uc3QgY29sdW1uTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY29sdW1uU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIE9iamVjdC5rZXlzKHJvdykpIHtcbiAgICAgICAgICAgIGlmIChjb2x1bW5TZXQuaGFzKGZpZWxkKSkgY29udGludWU7XG4gICAgICAgICAgICBjb2x1bW5TZXQuYWRkKGZpZWxkKTtcbiAgICAgICAgICAgIGNvbHVtbk5hbWVzLnB1c2goZmllbGQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEEgcm93IHRoYXQgZG9lc24ndCBpbmNsdWRlIGEgY29sdW1uIHN0b3JlcyBBQlNFTlQgKGZhbGwtdGhyb3VnaCksIG5vdCB1bmRlZmluZWQgKGEgcmVhbCB2YWx1ZSkuXG4gICAgY29uc3QgYmxvYnMgPSBjb2x1bW5OYW1lcy5tYXAoY29sID0+IGVuY29kZUJ1bGtEYXRhKHJvd3MubWFwKHJvdyA9PiBjb2wgaW4gcm93ID8gcm93W2NvbF0gOiBBQlNFTlQpKSk7XG4gICAgLy8gVGhlIGhpZGRlbiBwZXItcm93IHRpbWUgY29sdW1uLlxuICAgIGNvbHVtbk5hbWVzLnB1c2goVElNRV9DT0xVTU4pO1xuICAgIGJsb2JzLnB1c2goZW5jb2RlQnVsa0RhdGEodGltZXMpKTtcbiAgICByZXR1cm4gYXNzZW1ibGVGaWxlKGNvbHVtbk5hbWVzLCBibG9icywgcm93cy5sZW5ndGgsIHRpbWVzLCByb3dzLm1hcChyID0+IHJbS0VZX0NPTFVNTl0gYXMgc3RyaW5nKSk7XG59XG5cbi8vIEEgcmVzb2x2ZWQgb3V0cHV0IHJvdyBmb3IgdGhlIHJhdy1zcGxpY2UgbWVyZ2U6IGl0cyBrZXksIHdyaXRlLXRpbWUsIGFuZCB0aGUgd2lubmluZyByYXcgY2VsbCBmb3IgZWFjaFxuLy8gY29sdW1uIGl0IGhhcyAoYSBjb2x1bW4gaXQgbGFja3MgaXMgd3JpdHRlbiBBQlNFTlQg4oCUIGZhbGwtdGhyb3VnaCkuIFRoZSBjZWxsIGJ5dGVzIGFyZSBjb3BpZWQgc3RyYWlnaHRcbi8vIGZyb20gdGhlIGlucHV0IGZpbGVzOyBubyB2YWx1ZSBpcyBldmVyIGRlY29kZWQuXG5leHBvcnQgdHlwZSBSYXdSb3cgPSB7IGtleTogc3RyaW5nOyB0aW1lOiBudW1iZXI7IGNlbGxzOiBNYXA8c3RyaW5nLCBSYXdDZWxsPiB9O1xuXG4vLyBTaXplIG9mIGEgY29sdW1uIGJsb2IncyBJTkRFWCBzZWN0aW9uIChvZmZzZXRzIGFycmF5ICsgdHlwZXMgYXJyYXkpIGZvciBhIGNvbHVtbiBvZiBOIHJvd3MuIFRoZSBkYXRhXG4vLyBzZWN0aW9uIGZvbGxvd3MgaW1tZWRpYXRlbHkgYWZ0ZXIuIFRoZSBwbGFubmVkIG1lcmdlIHVzZXMgdGhpcyB0byBzaXplIG91dHB1dCBidWZmZXJzIGV4YWN0bHkuXG5leHBvcnQgZnVuY3Rpb24gY29sdW1uSW5kZXhCeXRlTGVuZ3RoKHJvd0NvdW50OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiA0ICogKHJvd0NvdW50ICsgMSkgKyByb3dDb3VudDtcbn1cblxuLy8gQXNzZW1ibGVzIGEgY29tcGxldGUgYnVsayBmaWxlIGZyb20gYSBzZXQgb2YgcHJlLWJ1aWx0IHZhbHVlIGNvbHVtbiBibG9icyBwbHVzIHRoZSBrZXlzICsgdGltZXMuIEF1dG8tXG4vLyBhZGRzIHRoZSBLRVlfQ09MVU1OIChrZXlzKSBhbmQgaGlkZGVuIFRJTUVfQ09MVU1OICh0aW1lcykg4oCUIHRoZXkncmUgc21hbGwgZW5vdWdoIHRvIGVuY29kZSBpbiBvbmUgc2hvdFxuLy8gaGVyZS4gVXNlZCBieSB0aGUgcGxhbm5lZCBtZXJnZTogaXQgYnVpbGRzIGVhY2ggdmFsdWUgY29sdW1uJ3MgYmxvYiBieS1oYW5kIChvZmZzZXRzL3R5cGVzICsgcmF3IGJ5dGVzXG4vLyBjb3BpZWQgZGlyZWN0bHkgZnJvbSBpbnB1dHMsIG5vIHZhbHVlIG1hdGVyaWFsaXphdGlvbikgYW5kIGhhbmRzIHRoZSByZXN1bHQgaGVyZSBmb3IgaGVhZGVyICsgYm91bmRzLlxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlUGxhbm5lZEZpbGUoY29uZmlnOiB7XG4gICAgdmFsdWVDb2x1bW5zOiB7IG5hbWU6IHN0cmluZzsgYmxvYjogQnVmZmVyIH1bXTtcbiAgICBrZXlzOiBzdHJpbmdbXTtcbiAgICB0aW1lczogbnVtYmVyW107XG59KTogQnVmZmVyIHtcbiAgICBjb25zdCBjb2x1bW5OYW1lcyA9IFtLRVlfQ09MVU1OLCAuLi5jb25maWcudmFsdWVDb2x1bW5zLm1hcChjID0+IGMubmFtZSksIFRJTUVfQ09MVU1OXTtcbiAgICBjb25zdCBibG9icyA9IFtcbiAgICAgICAgZW5jb2RlQnVsa0RhdGEoY29uZmlnLmtleXMpLFxuICAgICAgICAuLi5jb25maWcudmFsdWVDb2x1bW5zLm1hcChjID0+IGMuYmxvYiksXG4gICAgICAgIGVuY29kZUJ1bGtEYXRhKGNvbmZpZy50aW1lcyksXG4gICAgXTtcbiAgICByZXR1cm4gYXNzZW1ibGVGaWxlKGNvbHVtbk5hbWVzLCBibG9icywgY29uZmlnLmtleXMubGVuZ3RoLCBjb25maWcudGltZXMsIGNvbmZpZy5rZXlzKTtcbn1cblxuY29uc3QgQUJTRU5UX0NFTEw6IFJhd0NlbGwgPSB7IHR5cGU6IFRZUEVfQUJTRU5ULCBieXRlczogRU1QVFlfQlVGRkVSIH07XG5cbmZ1bmN0aW9uIGJ1aWxkT25lRmlsZVJhdyhyb3dzOiBSYXdSb3dbXSk6IEJ1ZmZlciB7XG4gICAgLy8gQ29sdW1ucyBwcmVzZW50IGluIHRoaXMgY2h1bmssIGluIGZpcnN0LXNlZW4gb3JkZXIgKG1hdGNoZXMgYnVpbGRPbmVGaWxlLCB3aGljaCBvbmx5IGVtaXRzIGNvbHVtbnNcbiAgICAvLyBzb21lIHJvdyBhY3R1YWxseSBoYXMpLlxuICAgIGNvbnN0IHZhbHVlQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykgZm9yIChjb25zdCBjb2wgb2Ygcm93LmNlbGxzLmtleXMoKSkge1xuICAgICAgICBpZiAoc2Vlbi5oYXMoY29sKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKGNvbCk7XG4gICAgICAgIHZhbHVlQ29sdW1ucy5wdXNoKGNvbCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gW0tFWV9DT0xVTU4sIC4uLnZhbHVlQ29sdW1ucywgVElNRV9DT0xVTU5dO1xuICAgIGNvbnN0IHRpbWVzID0gcm93cy5tYXAociA9PiByLnRpbWUpO1xuICAgIGNvbnN0IGJsb2JzID0gW1xuICAgICAgICBlbmNvZGVCdWxrRGF0YShyb3dzLm1hcChyID0+IHIua2V5KSksXG4gICAgICAgIC4uLnZhbHVlQ29sdW1ucy5tYXAoY29sID0+IGVuY29kZUJ1bGtEYXRhUmF3KHJvd3MubWFwKHIgPT4gci5jZWxscy5nZXQoY29sKSA/PyBBQlNFTlRfQ0VMTCkpKSxcbiAgICAgICAgZW5jb2RlQnVsa0RhdGEodGltZXMpLFxuICAgIF07XG4gICAgcmV0dXJuIGFzc2VtYmxlRmlsZShjb2x1bW5OYW1lcywgYmxvYnMsIHJvd3MubGVuZ3RoLCB0aW1lcywgcm93cy5tYXAociA9PiByLmtleSkpO1xufVxuXG5mdW5jdGlvbiBlc3RpbWF0ZVJhd1Jvd0J5dGVzKHJvdzogUmF3Um93KTogbnVtYmVyIHtcbiAgICBsZXQgdG90YWwgPSByb3cua2V5Lmxlbmd0aCAqIDIgKyBQRVJfVkFMVUVfT1ZFUkhFQUQ7XG4gICAgZm9yIChjb25zdCBjZWxsIG9mIHJvdy5jZWxscy52YWx1ZXMoKSkgdG90YWwgKz0gY2VsbC5ieXRlcy5sZW5ndGggKyBQRVJfVkFMVUVfT1ZFUkhFQUQ7XG4gICAgcmV0dXJuIHRvdGFsO1xufVxuXG4vLyBPbmUgY29tcGxldGUsIGluZGVwZW5kZW50IGZpbGU6IHRoZSBlbmNvZGVkIGJ1ZmZlciBwbHVzIGl0cyBrZXkgcmFuZ2UgKyByb3cgY291bnQgKHRoZSBjYWxsZXIgbG9ncyB0aGVcbi8vIHJhbmdlIHdoZW4gYSBtZXJnZSBzcGxpdHMgYWNyb3NzIHNldmVyYWwgZmlsZXMpLlxuZXhwb3J0IGludGVyZmFjZSBCdWlsdEZpbGUgeyBidWZmZXI6IEJ1ZmZlcjsgbWluS2V5OiBzdHJpbmc7IG1heEtleTogc3RyaW5nOyByb3dDb3VudDogbnVtYmVyOyB9XG5cbi8vIFJldHVybnMgb25lIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBmaWxlIHBlciBjaHVuayBvZiByb3dzLiBSb3dzIGFyZSBmaXJzdCBzb3J0ZWQgYnkga2V5LCB0aGVuXG4vLyBwYXJ0aXRpb25lZCBpbnRvIGtleS1jb250aWd1b3VzIGNodW5rcyBvZiB+dGFyZ2V0Qnl0ZXMgZWFjaCDigJQgc28gZXZlcnkgcmV0dXJuZWQgZmlsZSBpcyBrZXktc29ydGVkXG4vLyAodGlnaHQgbWluS2V5L21heEtleSBmb3IgdGhlIHJlYWQtc2tpcCArIG1lcmdlIHBsYW5uZXIpIGFuZCBzdGF5cyBuZWFyIHRoZSB0YXJnZXQgc2l6ZSwgYW5kIG5vXG4vLyBzaW5nbGUgY29sdW1uIGJsb2IgLyBCdWZmZXIuY29uY2F0IGFwcHJvYWNoZXMgdGhlIH4yR0IgbGltaXQuIFRoZSBjaHVua3MgaGF2ZSBkaXNqb2ludCBrZXkgcmFuZ2VzLFxuLy8gc28gdGhlIGNhbGxlciBqdXN0IHdyaXRlcyBlYWNoIGFzIGl0cyBvd24gZmlsZS4gQSBub3JtYWwtc2l6ZWQgd3JpdGUgcmV0dXJucyBhIHNpbmdsZSBmaWxlLlxuLy8gYHRpbWVzW2ldYCBpcyByb3cgaSdzIHdyaXRlLXRpbWUsIHN0b3JlZCBwZXIgcm93IHNvIHJlYWRzIHJlc29sdmUgYSBrZXkgdG8gaXRzIGxhdGVzdCB2YWx1ZSBieSB0aW1lLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmlsZUJ1ZmZlcihyb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLCB0aW1lczogbnVtYmVyW10sIHRhcmdldEJ5dGVzID0gVEFSR0VUX0ZJTEVfQllURVMpOiBCdWlsdEZpbGVbXSB7XG4gICAgLy8gQSBjaHVuayBpcyBhbHJlYWR5IGtleS1zb3J0ZWQsIHNvIGl0cyBmaXJzdC9sYXN0IHJvdyBhcmUgaXRzIG1pbi9tYXgga2V5LlxuICAgIGNvbnN0IG1ha2UgPSAocnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sIHRzOiBudW1iZXJbXSk6IEJ1aWx0RmlsZSA9PiAoe1xuICAgICAgICBidWZmZXI6IGJ1aWxkT25lRmlsZShycywgdHMpLFxuICAgICAgICBtaW5LZXk6IHJzLmxlbmd0aCA/IChyc1swXVtLRVlfQ09MVU1OXSBhcyBzdHJpbmcpIDogXCJcIixcbiAgICAgICAgbWF4S2V5OiBycy5sZW5ndGggPyAocnNbcnMubGVuZ3RoIC0gMV1bS0VZX0NPTFVNTl0gYXMgc3RyaW5nKSA6IFwiXCIsXG4gICAgICAgIHJvd0NvdW50OiBycy5sZW5ndGgsXG4gICAgfSk7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW21ha2UoW10sIFtdKV07XG4gICAgLy8gU29ydCByb3dzICsgdGhlaXIgdGltZXMgdG9nZXRoZXIgYnkga2V5IHNvIGVhY2ggb3V0cHV0IGZpbGUgaXMga2V5LWNvbnRpZ3VvdXMuXG4gICAgY29uc3Qgb3JkZXIgPSByb3dzLm1hcCgoXywgaSkgPT4gaSkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBrYSA9IHJvd3NbYV1bS0VZX0NPTFVNTl0gYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCBrYiA9IHJvd3NbYl1bS0VZX0NPTFVNTl0gYXMgc3RyaW5nO1xuICAgICAgICByZXR1cm4ga2EgPCBrYiA/IC0xIDoga2EgPiBrYiA/IDEgOiAwO1xuICAgIH0pO1xuICAgIGNvbnN0IHNvcnRlZFJvd3MgPSBvcmRlci5tYXAoaSA9PiByb3dzW2ldKTtcbiAgICBjb25zdCBzb3J0ZWRUaW1lcyA9IG9yZGVyLm1hcChpID0+IHRpbWVzW2ldKTtcbiAgICBjb25zdCByZXN1bHQ6IEJ1aWx0RmlsZVtdID0gW107XG4gICAgbGV0IGNodW5rU3RhcnQgPSAwO1xuICAgIGxldCBjaHVua0J5dGVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZFJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm93Qnl0ZXMgPSBlc3RpbWF0ZVJvd0J5dGVzKHNvcnRlZFJvd3NbaV0pO1xuICAgICAgICBpZiAoaSA+IGNodW5rU3RhcnQgJiYgY2h1bmtCeXRlcyArIHJvd0J5dGVzID4gdGFyZ2V0Qnl0ZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG1ha2Uoc29ydGVkUm93cy5zbGljZShjaHVua1N0YXJ0LCBpKSwgc29ydGVkVGltZXMuc2xpY2UoY2h1bmtTdGFydCwgaSkpKTtcbiAgICAgICAgICAgIGNodW5rU3RhcnQgPSBpO1xuICAgICAgICAgICAgY2h1bmtCeXRlcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgY2h1bmtCeXRlcyArPSByb3dCeXRlcztcbiAgICB9XG4gICAgcmVzdWx0LnB1c2gobWFrZShzb3J0ZWRSb3dzLnNsaWNlKGNodW5rU3RhcnQpLCBzb3J0ZWRUaW1lcy5zbGljZShjaHVua1N0YXJ0KSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIFRoZSByYXctc3BsaWNlIGNvdW50ZXJwYXJ0IG9mIGJ1aWxkRmlsZUJ1ZmZlciwgdXNlZCBieSBtZXJnZXM6IHRoZSByb3dzIGFscmVhZHkgY2FycnkgdGhlaXIgd2lubmluZ1xuLy8gY2VsbHMgYXMgcmF3IG9uLWRpc2sgYnl0ZXMgKG5vIEpTIHZhbHVlcyksIHNvIHRoaXMganVzdCBzb3J0cyBieSBrZXksIGNodW5rcyB0byB+dGFyZ2V0Qnl0ZXMsIGFuZFxuLy8gY29uY2F0ZW5hdGVzIHRoZSBieXRlcy4gU2FtZSBvdXRwdXQgZ3VhcmFudGVlczoga2V5LWNvbnRpZ3VvdXMsIGRpc2pvaW50LCBhc2NlbmRpbmcgZmlsZXMuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGaWxlQnVmZmVyUmF3KHJvd3M6IFJhd1Jvd1tdLCB0YXJnZXRCeXRlcyA9IFRBUkdFVF9GSUxFX0JZVEVTKTogQnVpbHRGaWxlW10ge1xuICAgIGNvbnN0IG1ha2UgPSAocnM6IFJhd1Jvd1tdKTogQnVpbHRGaWxlID0+ICh7XG4gICAgICAgIGJ1ZmZlcjogYnVpbGRPbmVGaWxlUmF3KHJzKSxcbiAgICAgICAgbWluS2V5OiBycy5sZW5ndGggPyByc1swXS5rZXkgOiBcIlwiLFxuICAgICAgICBtYXhLZXk6IHJzLmxlbmd0aCA/IHJzW3JzLmxlbmd0aCAtIDFdLmtleSA6IFwiXCIsXG4gICAgICAgIHJvd0NvdW50OiBycy5sZW5ndGgsXG4gICAgfSk7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW21ha2UoW10pXTtcbiAgICBjb25zdCBzb3J0ZWQgPSByb3dzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS5rZXkgPCBiLmtleSA/IC0xIDogYS5rZXkgPiBiLmtleSA/IDEgOiAwKTtcbiAgICBjb25zdCByZXN1bHQ6IEJ1aWx0RmlsZVtdID0gW107XG4gICAgbGV0IGNodW5rU3RhcnQgPSAwO1xuICAgIGxldCBjaHVua0J5dGVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByb3dCeXRlcyA9IGVzdGltYXRlUmF3Um93Qnl0ZXMoc29ydGVkW2ldKTtcbiAgICAgICAgaWYgKGkgPiBjaHVua1N0YXJ0ICYmIGNodW5rQnl0ZXMgKyByb3dCeXRlcyA+IHRhcmdldEJ5dGVzKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChtYWtlKHNvcnRlZC5zbGljZShjaHVua1N0YXJ0LCBpKSkpO1xuICAgICAgICAgICAgY2h1bmtTdGFydCA9IGk7XG4gICAgICAgICAgICBjaHVua0J5dGVzID0gMDtcbiAgICAgICAgfVxuICAgICAgICBjaHVua0J5dGVzICs9IHJvd0J5dGVzO1xuICAgIH1cbiAgICByZXN1bHQucHVzaChtYWtlKHNvcnRlZC5zbGljZShjaHVua1N0YXJ0KSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCB0eXBlIEJhc2VCdWxrRGF0YWJhc2VSZWFkZXIgPSB7XG4gICAgLy8gSWRlbnRpZmllcyB0aGUgc291cmNlIHRoaXMgcmVhZGVyIGNhbWUgZnJvbSAodGhlIGJ1bGsgZmlsZSBuYW1lLCBvciBcIihzdHJlYW1zKVwiKSBzbyB0aGUgam9pbiBjYW5cbiAgICAvLyBuYW1lIHRoZSBvZmZlbmRpbmcgZmlsZSB3aGVuIG9uZSBvZiBpdHMgcmVhZHMgZmFpbHMuIFVuZGVmaW5lZCBmb3IgcmVhZGVycyBidWlsdCB3aXRob3V0IG9uZS5cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIHJvd0NvdW50OiBudW1iZXI7XG4gICAgdG90YWxCeXRlczogbnVtYmVyO1xuICAgIC8vIFdyaXRlLXRpbWUgYm91bmRzIG9mIHRoaXMgcmVhZGVyJ3MgZGF0YSAoMCBpZiB1bmtub3duIOKAlCBvbGQgYnVsayBmaWxlcykuXG4gICAgbWluVGltZTogbnVtYmVyO1xuICAgIG1heFRpbWU6IG51bWJlcjtcbiAgICAvLyBLZXktcmFuZ2UgYm91bmRzICh1bmRlZmluZWQgZm9yIG9sZCBmaWxlcyAvIHRoZSBzdHJlYW0gcmVhZGVyIOKAlCB0cmVhdCBhcyBcInNwYW5zIGFsbCBrZXlzXCIpLlxuICAgIG1pbktleT86IHN0cmluZztcbiAgICBtYXhLZXk/OiBzdHJpbmc7XG4gICAgLy8gS2V5cyBpcyBzcGVjaWFsLCBpdCdzIGFsd2F5cyBhdXRvbWF0aWNhbGx5IGRlY29kZWQsIGV2ZW4gdGhvdWdoIGl0IGlzIHN0b3JlZCBhcyBhIG5vcm1hbCBjb2x1bW5cbiAgICBrZXlzOiBzdHJpbmdbXTtcbiAgICBjb2x1bW5zOiB7IGNvbHVtbjogc3RyaW5nOyBieXRlU2l6ZTogbnVtYmVyIH1bXTtcbiAgICAvLyBFYWNoIGtleSdzIHJvdyB3cml0ZS10aW1lICh0aGUgdGltZSBvZiBpdHMgbmV3ZXN0IHdyaXRlIGluIHRoaXMgcmVhZGVyKS4gVGhlIGpvaW4gY29tcGFyZXMgdGhlc2VcbiAgICAvLyBhY3Jvc3MgcmVhZGVycyB0byByZXNvbHZlIGEga2V5IHRvIGl0cyBsYXRlc3QgdmFsdWUuXG4gICAga2V5VGltZXM6IE1hcDxzdHJpbmcsIG51bWJlcj47XG4gICAgLy8gUGVyLWtleSB0b21ic3RvbmUgdGltZTogdGhlIGtleSB3YXMgZGVsZXRlZCBhdCB0aGlzIHRpbWUuIFRoZSBqb2luIHRyZWF0cyBhIGRlbGV0ZSBsaWtlIGFueSBvdGhlclxuICAgIC8vIGV2ZW50IOKAlCBhIGRlbGV0ZSBvbmx5IHdpbnMgaWYgaXQncyBuZXdlciB0aGFuIGV2ZXJ5IHNldCBmb3IgdGhlIGtleS4gT25seSB0aGUgc3RyZWFtIHJlYWRlciBzZXRzIGl0LlxuICAgIGRlbGV0ZVRpbWVzPzogTWFwPHN0cmluZywgbnVtYmVyPjtcbiAgICAvLyBFYWNoIGtleSdzIHZhbHVlIGZvciB0aGUgY29sdW1uIHBsdXMgdGhlIHJvdydzIHdyaXRlLXRpbWUuIHZhbHVlIG1heSBiZSBBQlNFTlQgKHRoZSByb3cgbmV2ZXIgc2V0XG4gICAgLy8gdGhpcyBjb2x1bW4g4oCUIHRoZSBqb2luIHRoZW4gZmFsbHMgdGhyb3VnaCB0byBhbiBvbGRlciByZWFkZXIgZm9yIHRoYXQga2V5L2NvbHVtbikuXG4gICAgZ2V0Q29sdW1uOiAoY29sdW1uOiBzdHJpbmcpID0+IFByb21pc2U8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd247IHRpbWU6IG51bWJlciB9W10+O1xuICAgIC8vIExpa2UgZ2V0Q29sdW1uIGJ1dCByZXR1cm5zIGVhY2ggY2VsbCdzIHJhdyBvbi1kaXNrIGVuY29kaW5nICh0eXBlIHRhZyArIGJ5dGVzKSBrZXllZCBieSBrZXksIFdJVEhPVVRcbiAgICAvLyBkZWNvZGluZyB0aGUgdmFsdWUg4oCUIGZvciBtZXJnZXMsIHdoaWNoIHNwbGljZSB0aGUgd2lubmluZyBieXRlcyBzdHJhaWdodCBpbnRvIHRoZSBvdXRwdXQuIEFCU0VOVFxuICAgIC8vIGNlbGxzIGFyZSBvbWl0dGVkIChhIG1pc3Npbmcga2V5IG1lYW5zIHRoaXMgcmVhZGVyIGRpZG4ndCBzZXQgdGhpcyBjb2x1bW4sIHNvIHRoZSBtZXJnZSBmYWxsc1xuICAgIC8vIHRocm91Z2ggdG8gYW4gb2xkZXIgcmVhZGVyKS4gRWFjaCBjZWxsJ3Mgd3JpdGUtdGltZSBpcyB0aGUgcmVhZGVyJ3Mga2V5VGltZXMgdmFsdWUgZm9yIHRoYXQga2V5LlxuICAgIGdldFJhd0NvbHVtbjogKGNvbHVtbjogc3RyaW5nKSA9PiBQcm9taXNlPE1hcDxzdHJpbmcsIFJhd0NlbGw+PjtcbiAgICAvLyBSZXR1cm5zIHRoZSBjb2x1bW4ncyBJTkRFWCAob2Zmc2V0cyArIHR5cGVzKSBwbHVzIGEgY29udGlndW91cyByb3ctcmFuZ2UgYnl0ZSByZWFkZXIuIFRoZSBwbGFubmVkXG4gICAgLy8gbWVyZ2UgbG9hZHMgdGhpcyBmb3IgZXZlcnkgKHNvdXJjZSwgY29sdW1uKSBvbmNlIOKAlCBzbWFsbCAofjVCL3JvdyksIG5vIHZhbHVlIGJ5dGVzIHB1bGxlZCDigJQgYW5kXG4gICAgLy8gdXNlcyB0eXBlcy9vZmZzZXRzIHRvIHBsYW4gdGhlIG91dHB1dCdzIGJ5dGUgbGF5b3V0LiBFeGVjdXRlIHRoZW4gcmVhZHMgb25seSB0aGUgbmVlZGVkIHJ1bnMuXG4gICAgZ2V0Q29sdW1uSW5kZXg6IChjb2x1bW46IHN0cmluZykgPT4gUHJvbWlzZTxDb2x1bW5JbmRleD47XG4gICAgLy8gTWFwcyBhIGtleSB0byBpdHMgcm93IGluZGV4IGluIHRoaXMgcmVhZGVyIChhbmQgdW5kZWZpbmVkIGlmIGFic2VudCkuIFRoZSBwbGFubmVkIG1lcmdlIHVzZXMgdGhpc1xuICAgIC8vIHRvIGxvb2sgdXAgYSB3aW5uaW5nIGNlbGwncyBzb3VyY2Ugcm93IHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBhIGNvbHVtbiByZWFkLlxuICAgIHJvd09mS2V5OiAoa2V5OiBzdHJpbmcpID0+IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAvLyBUaGUgdmFsdWUgKyB3cml0ZS10aW1lIGZvciAoa2V5LCBjb2x1bW4pLCBvciBBQlNFTlQgaWYgdGhpcyByZWFkZXIgaGFzIG5vIHN1Y2ggY2VsbC5cbiAgICBnZXRTaW5nbGVGaWVsZDogKGtleTogc3RyaW5nLCBjb2x1bW46IHN0cmluZykgPT4gUHJvbWlzZTx7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfSB8IHR5cGVvZiBBQlNFTlQ+O1xufTtcblxuLy8gUmVhZHMganVzdCB0aGUgZmlsZSBoZWFkZXIgKHRoZSA0LWJ5dGUgbGVuZ3RoICsgaGVhZGVyIEpTT04pIOKAlCBubyBjb2x1bW4gZGF0YS4gVXNlZCBieSB0aGUgbWVyZ2Vcbi8vIHBsYW5uZXIgdG8gZ2V0IGVhY2ggZmlsZSdzIHJvdyBjb3VudCwgdGltZSByYW5nZSwgYW5kIGtleSByYW5nZSBjaGVhcGx5IGFjcm9zcyBtYW55IGZpbGVzLlxuZXhwb3J0IHR5cGUgQnVsa0hlYWRlckluZm8gPSB7IHJvd0NvdW50OiBudW1iZXI7IG1pblRpbWU6IG51bWJlcjsgbWF4VGltZTogbnVtYmVyOyBtaW5LZXk/OiBzdHJpbmc7IG1heEtleT86IHN0cmluZzsgY29sdW1uczogeyBjb2x1bW46IHN0cmluZzsgYnl0ZVNpemU6IG51bWJlciB9W10gfTtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkQnVsa0hlYWRlcihnZXRSYW5nZTogKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSA9PiBQcm9taXNlPEJ1ZmZlcj4sIHRvdGFsQnl0ZXM6IG51bWJlcik6IFByb21pc2U8QnVsa0hlYWRlckluZm8+IHtcbiAgICBjb25zdCBoZWFkZXJMZW5ndGggPSAoYXdhaXQgZ2V0UmFuZ2UoMCwgNCkpLnJlYWRVSW50MzJMRSgwKTtcbiAgICBpZiAoaGVhZGVyTGVuZ3RoIDw9IDAgfHwgaGVhZGVyTGVuZ3RoID4gdG90YWxCeXRlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGhlYWRlciBsZW5ndGggaW4gKDAsICR7dG90YWxCeXRlc31dLCB3YXMgJHtoZWFkZXJMZW5ndGh9YCk7XG4gICAgfVxuICAgIGNvbnN0IGhlYWRlciA9IEpTT04ucGFyc2UoKGF3YWl0IGdldFJhbmdlKDQsIDQgKyBoZWFkZXJMZW5ndGgpKS50b1N0cmluZyhcInV0ZjhcIikpIGFzIEZpbGVIZWFkZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcm93Q291bnQ6IGhlYWRlci5yb3dDb3VudCxcbiAgICAgICAgbWluVGltZTogaGVhZGVyLm1pblRpbWUgfHwgMCxcbiAgICAgICAgbWF4VGltZTogaGVhZGVyLm1heFRpbWUgfHwgMCxcbiAgICAgICAgbWluS2V5OiBoZWFkZXIubWluS2V5LFxuICAgICAgICBtYXhLZXk6IGhlYWRlci5tYXhLZXksXG4gICAgICAgIGNvbHVtbnM6IGhlYWRlci5jb2x1bW5zLmZpbHRlcihjID0+IGMubmFtZSAhPT0gVElNRV9DT0xVTU4pLm1hcChjID0+ICh7IGNvbHVtbjogYy5uYW1lLCBieXRlU2l6ZTogYy5sZW5ndGggfSkpLFxuICAgIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkQnVsa0RhdGFiYXNlKGNvbmZpZzoge1xuICAgIHRvdGFsQnl0ZXM6IG51bWJlcjtcbiAgICBnZXRSYW5nZTogKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSA9PiBQcm9taXNlPEJ1ZmZlcj47XG4gICAgbmFtZT86IHN0cmluZztcbn0pOiBQcm9taXNlPEJhc2VCdWxrRGF0YWJhc2VSZWFkZXI+IHtcbiAgICBjb25zdCBoZWFkZXJMZW5ndGggPSAoYXdhaXQgY29uZmlnLmdldFJhbmdlKDAsIDQpKS5yZWFkVUludDMyTEUoMCk7XG4gICAgaWYgKGhlYWRlckxlbmd0aCA8PSAwIHx8IGhlYWRlckxlbmd0aCA+IGNvbmZpZy50b3RhbEJ5dGVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgaGVhZGVyIGxlbmd0aCBpbiAoMCwgJHtjb25maWcudG90YWxCeXRlc31dLCB3YXMgJHtoZWFkZXJMZW5ndGh9YCk7XG4gICAgfVxuICAgIGNvbnN0IGhlYWRlciA9IEpTT04ucGFyc2UoKGF3YWl0IGNvbmZpZy5nZXRSYW5nZSg0LCA0ICsgaGVhZGVyTGVuZ3RoKSkudG9TdHJpbmcoXCJ1dGY4XCIpKSBhcyBGaWxlSGVhZGVyO1xuICAgIGNvbnN0IGRhdGFCYXNlID0gNCArIGhlYWRlckxlbmd0aDtcbiAgICBjb25zdCByb3dDb3VudCA9IGhlYWRlci5yb3dDb3VudDtcbiAgICBjb25zdCBjb2xCeU5hbWUgPSBuZXcgTWFwKGhlYWRlci5jb2x1bW5zLm1hcChjID0+IFtjLm5hbWUsIGNdKSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiByZWFkV2hvbGVDb2x1bW4oY29sdW1uOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd25bXT4ge1xuICAgICAgICBjb25zdCBjb2wgPSBjb2xCeU5hbWUuZ2V0KGNvbHVtbik7XG4gICAgICAgIGlmICghY29sKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGNvbHVtbiAke2NvbHVtbn0sIGZpbGUgb25seSBoYXM6ICR7aGVhZGVyLmNvbHVtbnMubWFwKGMgPT4gYy5uYW1lKS5qb2luKFwiLCBcIil9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IGNvbmZpZy5nZXRSYW5nZShkYXRhQmFzZSArIGNvbC5vZmZzZXQsIGRhdGFCYXNlICsgY29sLm9mZnNldCArIGNvbC5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gZGVjb2RlQnVsa0RhdGEoYmxvYiwgcm93Q291bnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSAoYXdhaXQgcmVhZFdob2xlQ29sdW1uKEtFWV9DT0xVTU4pKS5tYXAodiA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBzdHJpbmcga2V5LCB3YXMgJHt0eXBlb2Ygdn06ICR7SlNPTi5zdHJpbmdpZnkodik/LnNsaWNlKDAsIDUwMCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfSk7XG4gICAgY29uc3Qga2V5SW5kZXggPSBuZXcgTWFwKGtleXMubWFwKChrZXksIGkpID0+IFtrZXksIGldKSk7XG5cbiAgICAvLyBQZXItcm93IHdyaXRlLXRpbWVzLiBPbGQgZmlsZXMgKHdyaXR0ZW4gYmVmb3JlIHRoaXMgY29sdW1uIGV4aXN0ZWQpIGZhbGwgYmFjayB0byB0aGUgZmlsZSdzIGhlYWRlclxuICAgIC8vIHRpbWUgKG9yIDApIGZvciBldmVyeSByb3cg4oCUIGZpbmUsIHNpbmNlIHN1Y2ggZmlsZXMgcHJlZGF0ZSBjb25jdXJyZW50LXRpbWUgcmVzb2x1dGlvbi5cbiAgICBjb25zdCB0aW1lczogbnVtYmVyW10gPSBjb2xCeU5hbWUuaGFzKFRJTUVfQ09MVU1OKVxuICAgICAgICA/IChhd2FpdCByZWFkV2hvbGVDb2x1bW4oVElNRV9DT0xVTU4pKS5tYXAodiA9PiB0eXBlb2YgdiA9PT0gXCJudW1iZXJcIiA/IHYgOiAwKVxuICAgICAgICA6IGtleXMubWFwKCgpID0+IGhlYWRlci5tYXhUaW1lIHx8IDApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgIHJvd0NvdW50LFxuICAgICAgICB0b3RhbEJ5dGVzOiBjb25maWcudG90YWxCeXRlcyxcbiAgICAgICAgbWluVGltZTogaGVhZGVyLm1pblRpbWUgfHwgMCxcbiAgICAgICAgbWF4VGltZTogaGVhZGVyLm1heFRpbWUgfHwgMCxcbiAgICAgICAgbWluS2V5OiBoZWFkZXIubWluS2V5LFxuICAgICAgICBtYXhLZXk6IGhlYWRlci5tYXhLZXksXG4gICAgICAgIGtleXMsXG4gICAgICAgIGtleVRpbWVzOiBuZXcgTWFwKGtleXMubWFwKChrZXksIGkpID0+IFtrZXksIHRpbWVzW2ldXSkpLFxuICAgICAgICBjb2x1bW5zOiBoZWFkZXIuY29sdW1ucy5maWx0ZXIoYyA9PiBjLm5hbWUgIT09IFRJTUVfQ09MVU1OKS5tYXAoYyA9PiAoeyBjb2x1bW46IGMubmFtZSwgYnl0ZVNpemU6IGMubGVuZ3RoIH0pKSxcbiAgICAgICAgYXN5bmMgZ2V0Q29sdW1uKGNvbHVtbikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gYXdhaXQgcmVhZFdob2xlQ29sdW1uKGNvbHVtbik7XG4gICAgICAgICAgICByZXR1cm4ga2V5cy5tYXAoKGtleSwgaSkgPT4gKHsga2V5LCB2YWx1ZTogdmFsdWVzW2ldLCB0aW1lOiB0aW1lc1tpXSB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldFJhd0NvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBSYXdDZWxsPigpO1xuICAgICAgICAgICAgY29uc3QgY29sID0gY29sQnlOYW1lLmdldChjb2x1bW4pO1xuICAgICAgICAgICAgaWYgKCFjb2wpIHJldHVybiBtYXA7IC8vIGZpbGUgbGFja3MgdGhpcyBjb2x1bW4g4oaSIGV2ZXJ5IGNlbGwgQUJTRU5UIChmYWxsIHRocm91Z2gpXG4gICAgICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgY29uZmlnLmdldFJhbmdlKGRhdGFCYXNlICsgY29sLm9mZnNldCwgZGF0YUJhc2UgKyBjb2wub2Zmc2V0ICsgY29sLmxlbmd0aCk7XG4gICAgICAgICAgICBjb25zdCBpbmRleFNpemUgPSA0ICogKHJvd0NvdW50ICsgMSkgKyByb3dDb3VudDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBibG9iWzQgKiAocm93Q291bnQgKyAxKSArIGldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBUWVBFX0FCU0VOVCkgY29udGludWU7IC8vIG9taXQgQUJTRU5UIHNvIHRoZSBqb2luIGZhbGxzIHRocm91Z2hcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGJsb2IucmVhZFVJbnQzMkxFKDQgKiBpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBibG9iLnJlYWRVSW50MzJMRSg0ICogKGkgKyAxKSk7XG4gICAgICAgICAgICAgICAgbWFwLnNldChrZXlzW2ldLCB7IHR5cGUsIGJ5dGVzOiBibG9iLnN1YmFycmF5KGluZGV4U2l6ZSArIHN0YXJ0LCBpbmRleFNpemUgKyBlbmQpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0Q29sdW1uSW5kZXgoY29sdW1uKSB7XG4gICAgICAgICAgICBjb25zdCBjb2wgPSBjb2xCeU5hbWUuZ2V0KGNvbHVtbik7XG4gICAgICAgICAgICBpZiAoIWNvbCkge1xuICAgICAgICAgICAgICAgIC8vIEZpbGUgbGFja3MgdGhpcyBjb2x1bW4g4oCUIHByZXNlbnQgYW4gYWxsLUFCU0VOVCBpbmRleCBzbyB0aGUgcGxhbm5lciBjYW4gdHJlYXQgaXRcbiAgICAgICAgICAgICAgICAvLyB1bmlmb3JtbHkgd2l0aCBmaWxlcyB0aGF0IGhhdmUgdGhlIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KHJvd0NvdW50ICsgMSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZXMgPSBuZXcgVWludDhBcnJheShyb3dDb3VudCkuZmlsbChUWVBFX0FCU0VOVCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0cyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZXMsXG4gICAgICAgICAgICAgICAgICAgIGFzeW5jIHJlYWRWYWx1ZUJ5dGVzKCkgeyByZXR1cm4gRU1QVFlfQlVGRkVSOyB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb2xCYXNlID0gZGF0YUJhc2UgKyBjb2wub2Zmc2V0O1xuICAgICAgICAgICAgY29uc3QgaW5kZXhTaXplID0gNCAqIChyb3dDb3VudCArIDEpICsgcm93Q291bnQ7XG4gICAgICAgICAgICAvLyBPbmUgcmVhZCBwdWxscyBvZmZzZXRzICsgdHlwZXMgKHNtYWxsIOKAlCB+NSBCL3JvdykuIEJsb2NrIGNhY2hlIG1ha2VzIHN1YnNlcXVlbnQgdmFsdWUgcmVhZHNcbiAgICAgICAgICAgIC8vIG9mIG5lYXJieSByb3dzIGNoZWFwLiBEZWNvZGVkIGludG8gYWxpZ25lZCB0eXBlZCBhcnJheXMgc28gdGhlIGV4ZWN1dG9yIGNhbiBkbyBPKDEpIGxvb2t1cHMuXG4gICAgICAgICAgICBjb25zdCBpbmRleEJ1ZiA9IGF3YWl0IGNvbmZpZy5nZXRSYW5nZShjb2xCYXNlLCBjb2xCYXNlICsgaW5kZXhTaXplKTtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkocm93Q291bnQgKyAxKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHJvd0NvdW50OyBpKyspIG9mZnNldHNbaV0gPSBpbmRleEJ1Zi5yZWFkVUludDMyTEUoNCAqIGkpO1xuICAgICAgICAgICAgY29uc3QgdHlwZXMgPSBuZXcgVWludDhBcnJheShyb3dDb3VudCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHR5cGVzW2ldID0gaW5kZXhCdWZbNCAqIChyb3dDb3VudCArIDEpICsgaV07XG4gICAgICAgICAgICBjb25zdCBkYXRhU3RhcnQgPSBjb2xCYXNlICsgaW5kZXhTaXplO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvZmZzZXRzLFxuICAgICAgICAgICAgICAgIHR5cGVzLFxuICAgICAgICAgICAgICAgIGFzeW5jIHJlYWRWYWx1ZUJ5dGVzKHN0YXJ0Um93LCBlbmRSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZFJvdyA8PSBzdGFydFJvdykgcmV0dXJuIEVNUFRZX0JVRkZFUjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBvZmZzZXRzW3N0YXJ0Um93XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gb2Zmc2V0c1tlbmRSb3ddO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW5kIDw9IHN0YXJ0KSByZXR1cm4gRU1QVFlfQlVGRkVSO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLmdldFJhbmdlKGRhdGFTdGFydCArIHN0YXJ0LCBkYXRhU3RhcnQgKyBlbmQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICByb3dPZktleShrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXlJbmRleC5nZXQoa2V5KTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0U2luZ2xlRmllbGQoa2V5LCBjb2x1bW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGtleUluZGV4LmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gQUJTRU5UO1xuICAgICAgICAgICAgY29uc3QgY29sID0gY29sQnlOYW1lLmdldChjb2x1bW4pO1xuICAgICAgICAgICAgaWYgKCFjb2wpIHJldHVybiBBQlNFTlQ7XG4gICAgICAgICAgICBjb25zdCBjb2xCYXNlID0gZGF0YUJhc2UgKyBjb2wub2Zmc2V0O1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0c0J1ZiA9IGF3YWl0IGNvbmZpZy5nZXRSYW5nZShjb2xCYXNlICsgNCAqIHJvdywgY29sQmFzZSArIDQgKiByb3cgKyA4KTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gb2Zmc2V0c0J1Zi5yZWFkVUludDMyTEUoMCk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBvZmZzZXRzQnVmLnJlYWRVSW50MzJMRSg0KTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVQb3MgPSBjb2xCYXNlICsgNCAqIChyb3dDb3VudCArIDEpICsgcm93O1xuICAgICAgICAgICAgY29uc3QgdHlwZUJ1ZiA9IGF3YWl0IGNvbmZpZy5nZXRSYW5nZSh0eXBlUG9zLCB0eXBlUG9zICsgMSk7XG4gICAgICAgICAgICBjb25zdCBkYXRhU3RhcnQgPSBjb2xCYXNlICsgNCAqIChyb3dDb3VudCArIDEpICsgcm93Q291bnQ7XG4gICAgICAgICAgICBsZXQgYnl0ZXMgPSBFTVBUWV9CVUZGRVI7XG4gICAgICAgICAgICBpZiAoZW5kID4gc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBieXRlcyA9IGF3YWl0IGNvbmZpZy5nZXRSYW5nZShkYXRhU3RhcnQgKyBzdGFydCwgZGF0YVN0YXJ0ICsgZW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGVjb2RlVmFsdWUodHlwZUJ1ZlswXSwgYnl0ZXMpO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBBQlNFTlQpIHJldHVybiBBQlNFTlQ7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZSwgdGltZTogdGltZXNbcm93XSB9O1xuICAgICAgICB9LFxuICAgIH07XG59XG4iXX0=
513
- /* _JS_SOURCE_HASH = "9a6ef16155eeef797edef47467ace2aa8a3c9b5493e6be9fbb76a7c57b83b8b5"; */
481
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVsa0RhdGFiYXNlRm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQnVsa0RhdGFiYXNlRm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw0Q0FBNEM7QUFDNUMsdWNBQXVjOzs7QUFFMWIsUUFBQSxVQUFVLEdBQUcsS0FBSyxDQUFDO0FBRWhDLDRLQUE0SztBQUM1SyxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDekIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztBQUN0QixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDdkIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUMxQixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUMzQixNQUFNLHdCQUF3QixHQUFHLENBQUMsQ0FBQztBQUNuQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUMzQixNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUM1QixNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUM1QixNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUM3QixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixzUUFBc1E7QUFDdFEsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBRXZCLE1BQU0saUJBQWlCLEdBQXFIO0lBQ3hJLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO0lBQzFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7SUFDNUMsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFO0lBQzNELEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFF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O1lBQ3BDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7S0FDSixDQUFDO0FBQ04sQ0FBQztBQTNIRCw0Q0EySEMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlIGZvcm1hdCAoYWxsIGludGVnZXJzIGxpdHRsZS1lbmRpYW4pOlxuLy8gICB1MzIgaGVhZGVyTGVuZ3RoLCB0aGVuIGhlYWRlckxlbmd0aCBieXRlcyBvZiBKU09OOiB7IHJvd0NvdW50LCBjb2x1bW5zOiBbeyBuYW1lLCBvZmZzZXQsIGxlbmd0aCB9XSB9LCB3aGVyZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgaGVhZGVyLiBFYWNoIGNvbHVtbiBibG9iIGlzOiB1MzIgb2Zmc2V0c1tyb3dDb3VudCArIDFdIChieXRlIG9mZnNldHMgaW50byB0aGUgY29sdW1uJ3MgZGF0YSBzZWN0aW9uKSwgdTggdHlwZXNbcm93Q291bnRdLCB0aGVuIHRoZSBkYXRhIHNlY3Rpb24gKGVhY2ggdmFsdWUncyBieXRlcywgY29uY2F0ZW5hdGVkKS4gVmFsdWVzIGFyZSBlbmNvZGVkIHdpdGggYW4gZXhwbGljaXQgdHlwZSB0YWcgcGVyIHZhbHVlIChzZWUgdGhlIFRZUEVfIGNvbnN0YW50cykuIFJlYWRzIG9ubHkgZmV0Y2ggdGhlIGJ5dGUgcmFuZ2VzIHRoZXkgbmVlZC5cblxuZXhwb3J0IGNvbnN0IEtFWV9DT0xVTU4gPSBcImtleVwiO1xuXG4vLyBFdmVyeSB0YWcgaXMgYW4gZXhwbGljaXQgY29uc3RhbnQgYmFrZWQgaW50byBmaWxlcyBvbiBkaXNrLiBORVZFUiByZW51bWJlciBhbiBleGlzdGluZyB0YWcg4oCUIG9ubHkgYWRkIG5ldyBvbmVzIOKAlCBvciBldmVyeSBwcmV2aW91c2x5IHdyaXR0ZW4gZmlsZSBzaWxlbnRseSBkZWNvZGVzIHdyb25nLlxuY29uc3QgVFlQRV9VTkRFRklORUQgPSAwO1xuY29uc3QgVFlQRV9TVFJJTkcgPSAxO1xuY29uc3QgVFlQRV9OVU1CRVIgPSAyO1xuY29uc3QgVFlQRV9CT09MRUFOID0gMztcbmNvbnN0IFRZUEVfT0JKRUNUID0gNDtcbmNvbnN0IFRZUEVfSU5UOF9BUlJBWSA9IDU7XG5jb25zdCBUWVBFX1VJTlQ4X0FSUkFZID0gNjtcbmNvbnN0IFRZUEVfVUlOVDhfQ0xBTVBFRF9BUlJBWSA9IDc7XG5jb25zdCBUWVBFX0lOVDE2X0FSUkFZID0gODtcbmNvbnN0IFRZUEVfVUlOVDE2X0FSUkFZID0gOTtcbmNvbnN0IFRZUEVfSU5UMzJfQVJSQVkgPSAxMDtcbmNvbnN0IFRZUEVfVUlOVDMyX0FSUkFZID0gMTE7XG5jb25zdCBUWVBFX0ZMT0FUMzJfQVJSQVkgPSAxMjtcbmNvbnN0IFRZUEVfRkxPQVQ2NF9BUlJBWSA9IDEzO1xuLy8gQSBjZWxsIHdob3NlIHJvdyBuZXZlciBzZXQgdGhpcyBjb2x1bW4gYXQgYWxsIOKAlCBhcyBvcHBvc2VkIHRvIFRZUEVfVU5ERUZJTkVELCBhbiBleHBsaWNpdGx5IHN0b3JlZCB1bmRlZmluZWQuIE9uIHJlYWQsIEFCU0VOVCBmYWxscyB0aHJvdWdoIHRvIG9sZGVyIHJlYWRlcnMgZm9yIHRoYXQgY29sdW1uOyBhIHN0b3JlZCB1bmRlZmluZWQgc3RvcHMgdGhlIGZhbGwtdGhyb3VnaCAoaXQncyBhIHJlYWwgdmFsdWUgdGhhdCBjbGVhcnMgdGhlIGNvbHVtbikuXG5jb25zdCBUWVBFX0FCU0VOVCA9IDE0O1xuXG5jb25zdCBUWVBFRF9BUlJBWV9UWVBFUzogeyB0eXBlOiBudW1iZXI7IGN0b3I6IHsgbmV3KGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBBcnJheUJ1ZmZlclZpZXc7IEJZVEVTX1BFUl9FTEVNRU5UOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9IH1bXSA9IFtcbiAgICB7IHR5cGU6IFRZUEVfSU5UOF9BUlJBWSwgY3RvcjogSW50OEFycmF5IH0sXG4gICAgeyB0eXBlOiBUWVBFX1VJTlQ4X0FSUkFZLCBjdG9yOiBVaW50OEFycmF5IH0sXG4gICAgeyB0eXBlOiBUWVBFX1VJTlQ4X0NMQU1QRURfQVJSQVksIGN0b3I6IFVpbnQ4Q2xhbXBlZEFycmF5IH0sXG4gICAgeyB0eXBlOiBUWVBFX0lOVDE2X0FSUkFZLCBjdG9yOiBJbnQxNkFycmF5IH0sXG4gICAgeyB0eXBlOiBUWVBFX1VJTlQxNl9BUlJBWSwgY3RvcjogVWludDE2QXJyYXkgfSxcbiAgICB7IHR5cGU6IFRZUEVfSU5UMzJfQVJSQVksIGN0b3I6IEludDMyQXJyYXkgfSxcbiAgICB7IHR5cGU6IFRZUEVfVUlOVDMyX0FSUkFZLCBjdG9yOiBVaW50MzJBcnJheSB9LFxuICAgIHsgdHlwZTogVFlQRV9GTE9BVDMyX0FSUkFZLCBjdG9yOiBGbG9hdDMyQXJyYXkgfSxcbiAgICB7IHR5cGU6IFRZUEVfRkxPQVQ2NF9BUlJBWSwgY3RvcjogRmxvYXQ2NEFycmF5IH0sXG5dO1xuXG5leHBvcnQgY29uc3QgRU1QVFlfQlVGRkVSID0gQnVmZmVyLmFsbG9jKDApIGFzIEJ1ZmZlcjtcblxuLy8gU2VudGluZWwgYSByZWFkZXIgcmV0dXJucyBmb3IgYSBjZWxsIHdob3NlIHJvdyBuZXZlciBzZXQgdGhpcyBjb2x1bW4sIHNvIHRoZSBqb2luIGNhbiBmYWxsIHRocm91Z2ggdG8gYW4gb2xkZXIgcmVhZGVyIGZvciB0aGF0IGNvbHVtbi4gRGlzdGluY3QgZnJvbSBhIHN0b3JlZCB1bmRlZmluZWQsIHdoaWNoIGlzIGEgcmVhbCBjbGVhcmluZyB2YWx1ZS5cbmV4cG9ydCBjb25zdCBBQlNFTlQgPSBTeW1ib2woXCJhYnNlbnRcIik7XG5cbi8vIE9uZSB2YWx1ZSBleGFjdGx5IGFzIGl0IHNpdHMgb24gZGlzazogaXRzIHR5cGUgdGFnICsgcmF3IGJ5dGVzLiBBIGNlbGwncyBlbmNvZGluZyBpcyBwb3NpdGlvbi0gaW5kZXBlbmRlbnQgKG5vdGhpbmcgYWJvdXQgaXQgZGVwZW5kcyBvbiB3aGljaCByb3cvZmlsZSBpdCBsaXZlcyBpbiksIHNvIGEgbWVyZ2UgY29waWVzIHRoZSB3aW5uaW5nIFJhd0NlbGwgc3RyYWlnaHQgZnJvbSBhbiBpbnB1dCBjb2x1bW4gaW50byB0aGUgb3V0cHV0IOKAlCBuZXZlciBkZWNvZGluZyBpdCB0byBhIEpTIHZhbHVlIGFuZCByZS1lbmNvZGluZy4gVGhhdCdzIGZhciBsZXNzIG1lbW9yeSAobm8gb2JqZWN0IG1hdGVyaWFsaXphdGlvbikgYW5kIG11Y2ggZmFzdGVyIChhIGJ5dGUgY29weSwgbm90IGEgSlBFRy90eXBlZC1hcnJheSBkZWNvZGUgKyByZS1lbmNvZGUpLlxuZXhwb3J0IHR5cGUgUmF3Q2VsbCA9IHsgdHlwZTogbnVtYmVyOyBieXRlczogQnVmZmVyIH07XG5cbi8vIFRoZSB0eXBlIHRhZyBhIGNlbGwgY2FycmllcyB3aGVuIGl0cyByb3cgbmV2ZXIgc2V0IHRoaXMgY29sdW1uIOKAlCByZWFkIGl0IGZyb20gdGhlIGNvbHVtbidzIGB0eXBlc2AgYXJyYXkgdG8gZGV0ZWN0IEFCU0VOVCB3aXRob3V0IGRlY29kaW5nLiBSZS1leHBvcnRlZCBzbyB0aGUgbWVyZ2UgcGxhbm5lciAod2hpY2ggd29ya3MgYXQgdGhlIGNvbHVtbi1pbmRleCBsZXZlbCwgbm8gdmFsdWUgbWF0ZXJpYWxpemF0aW9uKSBjYW4gY2hlY2sgaXQuXG5leHBvcnQgY29uc3QgVFlQRV9BQlNFTlRfVEFHID0gVFlQRV9BQlNFTlQ7XG5cbi8vIEEgY29sdW1uJ3MgaW5kZXggYWxvbmUgKG9mZnNldHMgKyB0eXBlcyDigJQgc21hbGwsIH41IGJ5dGVzL3JvdykgcGx1cyBhIHByaW1pdGl2ZSB0byByZWFkIGEgQ09OVElHVU9VUyByb3cgcmFuZ2UncyByYXcgdmFsdWUgYnl0ZXMuIFVzZWQgYnkgdGhlIHBsYW5uZWQgbWVyZ2U6IGl0IGxvYWRzIHRoZSBpbmRleCBhY3Jvc3MgZXZlcnkgKHNvdXJjZSwgY29sdW1uKSBvbmNlIChjaGVhcCksIHVzZXMgdHlwZXMgdG8gZGV0ZWN0IEFCU0VOVCBhbmQgb2Zmc2V0cyB0byBzaXplIGVhY2ggY2VsbCwgcGxhbnMgdGhlIGJ5dGUgbGF5b3V0IG9mIGV2ZXJ5IG91dHB1dCBmaWxlIGZyb20gdGhvc2Ug4oCUIHRoZW4gaW4gdGhlIGV4ZWN1dGUgcGhhc2UgcmVhZHMgb25seSB0aGUgcnVucyBvZiBieXRlcyBpdCBhY3R1YWxseSBuZWVkcywgY29weWluZyB0aGVtIHN0cmFpZ2h0IGludG8gcHJlLWxhaWQtb3V0IG91dHB1dCBidWZmZXJzLiBObyBjZWxsIHZhbHVlIGlzIGV2ZXIgbWF0ZXJpYWxpemVkIGFzIGEgSlMgb2JqZWN0LlxuZXhwb3J0IHR5cGUgQ29sdW1uSW5kZXggPSB7XG4gICAgLy8gb2Zmc2V0c1tpXS4ub2Zmc2V0c1tpKzFdIGlzIHJvdyBpJ3MgdmFsdWUgYnl0ZSByYW5nZSB3aXRoaW4gdGhlIGNvbHVtbidzIGRhdGEgc2VjdGlvbi5cbiAgICBvZmZzZXRzOiBVaW50MzJBcnJheTtcbiAgICAvLyBQZXItcm93IHR5cGUgdGFnOyBUWVBFX0FCU0VOVF9UQUcgbWFya3MgXCJ0aGlzIHJvdyBuZXZlciBzZXQgdGhpcyBjb2x1bW5cIiAoZmFsbC10aHJvdWdoKS5cbiAgICB0eXBlczogVWludDhBcnJheTtcbiAgICAvLyBSZWFkIHRoZSBjb250aWd1b3VzIGJ5dGVzIG9mIHZhbHVlKHMpIGZvciByb3dzIFtzdGFydFJvdywgZW5kUm93KS4gTGVuZ3RoIGlzIGV4YWN0bHkgb2Zmc2V0c1tlbmRSb3ddIC0gb2Zmc2V0c1tzdGFydFJvd10g4oCUIHRoZSBjZWxscyBpbiB0aGF0IHJhbmdlIGNvbmNhdGVuYXRlZC4gVGhlIGNhbGxlciBjb21wb3NlcyBsYXJnZXIgcmVhZHMgZnJvbSBjb25zZWN1dGl2ZSByb3dzIChvbmUgc291cmNlLXNpZGUgZ2V0UmFuZ2UgcGVyIHJ1bikuXG4gICAgcmVhZFZhbHVlQnl0ZXM6IChzdGFydFJvdzogbnVtYmVyLCBlbmRSb3c6IG51bWJlcikgPT4gUHJvbWlzZTxCdWZmZXI+O1xufTtcblxuLy8gSGlkZGVuIHBlci1yb3cgY29sdW1uIGhvbGRpbmcgZWFjaCByb3cncyB3cml0ZS10aW1lIChzbyByZWFkcyBjYW4gcmVzb2x2ZSBhIGtleSB0byBpdHMgbGF0ZXN0IHZhbHVlIGJ5IGFjdHVhbCB0aW1lKS4gTlVMLXByZWZpeGVkIHNvIGl0IGNhbid0IGNvbGxpZGUgd2l0aCBhIHVzZXIgY29sdW1uOyBleGNsdWRlZCBmcm9tIGBjb2x1bW5zYC5cbmNvbnN0IFRJTUVfQ09MVU1OID0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKSArIFwidFwiO1xuXG50eXBlIEZpbGVIZWFkZXIgPSB7XG4gICAgcm93Q291bnQ6IG51bWJlcjtcbiAgICBjb2x1bW5zOiB7IG5hbWU6IHN0cmluZzsgb2Zmc2V0OiBudW1iZXI7IGxlbmd0aDogbnVtYmVyIH1bXTtcbiAgICAvLyBPbGRlc3QvbmV3ZXN0IHdyaXRlLXRpbWUgb2YgdGhlIGRhdGEgaW4gdGhpcyBmaWxlIChmcm9tIHRoZSBzdHJlYW0gZW50cmllcyBpdCB3YXMgZm9sZGVkIGZyb20sIGNhcnJpZWQgdGhyb3VnaCBtZXJnZXMpLiBMZXRzIHRoZSBtZXJnZSBwbGFubmVyIHBpY2sgZmlsZXMgb3ZlcmxhcHBpbmcgYSB0aW1lIHJhbmdlLiBBYnNlbnQgKDApIGluIGZpbGVzIHdyaXR0ZW4gYmVmb3JlIHRoaXMgZXhpc3RlZC5cbiAgICBtaW5UaW1lPzogbnVtYmVyO1xuICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgLy8gTGV4aWNvZ3JhcGhpY2FsbHkgc21hbGxlc3QvbGFyZ2VzdCBrZXkgaW4gdGhpcyBmaWxlIChyb3dzIGFyZSBzdG9yZWQga2V5LXNvcnRlZCkuIExldHMgdGhlIG1lcmdlIHBsYW5uZXIgZ3JvdXAvZGVkdXAgYnkga2V5IHJhbmdlIGFuZCBsZXRzIGEgc2luZ2xlLWtleSByZWFkIHNraXAgZmlsZXMgd2hvc2UgcmFuZ2UgZXhjbHVkZXMgdGhlIGtleS4gQWJzZW50ICh1bmRlZmluZWQpIGluIGZpbGVzIHdyaXR0ZW4gYmVmb3JlIHRoaXMgZXhpc3RlZCDigJQgdHJlYXRlZCBhcyBcInNwYW5zIGFsbCBrZXlzXCIuXG4gICAgbWluS2V5Pzogc3RyaW5nO1xuICAgIG1heEtleT86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHsgdHlwZTogbnVtYmVyOyBieXRlczogQnVmZmVyIH0ge1xuICAgIGlmICh2YWx1ZSA9PT0gQUJTRU5UKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFRZUEVfQUJTRU5ULCBieXRlczogRU1QVFlfQlVGRkVSIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFRZUEVfVU5ERUZJTkVELCBieXRlczogRU1QVFlfQlVGRkVSIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogVFlQRV9TVFJJTkcsIGJ5dGVzOiBCdWZmZXIuZnJvbSh2YWx1ZSwgXCJ1dGY4XCIpIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgY29uc3QgYnl0ZXMgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgICAgIGJ5dGVzLndyaXRlRG91YmxlTEUodmFsdWUsIDApO1xuICAgICAgICByZXR1cm4geyB0eXBlOiBUWVBFX05VTUJFUiwgYnl0ZXMgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogVFlQRV9CT09MRUFOLCBieXRlczogQnVmZmVyLmZyb20oW3ZhbHVlICYmIDEgfHwgMF0pIH07XG4gICAgfVxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGFWaWV3KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFWaWV3IHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZCwgc3RvcmUgYSB0eXBlZCBhcnJheSBpbnN0ZWFkYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cnkgPSBUWVBFRF9BUlJBWV9UWVBFUy5maW5kKHQgPT4gdmFsdWUgaW5zdGFuY2VvZiB0LmN0b3IpO1xuICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGVkIGFycmF5IHR5cGUgJHt2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBlbnRyeS50eXBlLFxuICAgICAgICAgICAgYnl0ZXM6IEJ1ZmZlci5mcm9tKHZhbHVlLmJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB2YWx1ZSB0eXBlICR7dHlwZW9mIHZhbHVlfWApO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiBUWVBFX09CSkVDVCwgYnl0ZXM6IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlKSwgXCJ1dGY4XCIpIH07XG59XG5cbmZ1bmN0aW9uIGRlY29kZVZhbHVlKHR5cGU6IG51bWJlciwgYnl0ZXM6IEJ1ZmZlcik6IHVua25vd24ge1xuICAgIGlmICh0eXBlID09PSBUWVBFX1VOREVGSU5FRCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZSA9PT0gVFlQRV9TVFJJTkcpIHJldHVybiBieXRlcy50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgaWYgKHR5cGUgPT09IFRZUEVfTlVNQkVSKSB7XG4gICAgICAgIGlmIChieXRlcy5sZW5ndGggIT09IDgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgOCBieXRlcyBmb3IgYSBudW1iZXIsIHdhcyAke2J5dGVzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnl0ZXMucmVhZERvdWJsZUxFKDApO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gVFlQRV9CT09MRUFOKSB7XG4gICAgICAgIGlmIChieXRlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgMSBieXRlIGZvciBhIGJvb2xlYW4sIHdhcyAke2J5dGVzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnl0ZXNbMF0gPT09IDE7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBUWVBFX09CSkVDVCkgcmV0dXJuIEpTT04ucGFyc2UoYnl0ZXMudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICBpZiAodHlwZSA9PT0gVFlQRV9BQlNFTlQpIHJldHVybiBBQlNFTlQ7XG4gICAgY29uc3QgZW50cnkgPSBUWVBFRF9BUlJBWV9UWVBFUy5maW5kKHQgPT4gdC50eXBlID09PSB0eXBlKTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSB2YWxpZCB0eXBlIHRhZywgd2FzICR7dHlwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgY3RvciA9IGVudHJ5LmN0b3I7XG4gICAgaWYgKHR5cGUgPT09IFRZUEVfVUlOVDhfQVJSQVkpIHJldHVybiBCdWZmZXIuZnJvbShieXRlcyk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAlIGN0b3IuQllURVNfUEVSX0VMRU1FTlQgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBieXRlIGxlbmd0aCBkaXZpc2libGUgYnkgJHtjdG9yLkJZVEVTX1BFUl9FTEVNRU5UfSBmb3IgJHtjdG9yLm5hbWV9LCB3YXMgJHtieXRlcy5sZW5ndGh9YCk7XG4gICAgfVxuICAgIC8vIENvcHkgdG8gYSBmcmVzaCBBcnJheUJ1ZmZlciBzbyB0aGUgdHlwZWQgYXJyYXkgdmlldyBpcyBhbGlnbmVkIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhlIGJ5dGVzIGxhbmRlZCBpbiB0aGUgc291cmNlIGJ1ZmZlci5cbiAgICBjb25zdCBhbGlnbmVkID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVzLmxlbmd0aCk7XG4gICAgbmV3IFVpbnQ4QXJyYXkoYWxpZ25lZCkuc2V0KGJ5dGVzKTtcbiAgICByZXR1cm4gbmV3IGN0b3IoYWxpZ25lZCk7XG59XG5cbmZ1bmN0aW9uIGVuY29kZUJ1bGtEYXRhKGRhdGE6IHVua25vd25bXSk6IEJ1ZmZlciB7XG4gICAgY29uc3QgbiA9IGRhdGEubGVuZ3RoO1xuICAgIGNvbnN0IG9mZnNldHMgPSBCdWZmZXIuYWxsb2MoNCAqIChuICsgMSkpO1xuICAgIGNvbnN0IHR5cGVzID0gQnVmZmVyLmFsbG9jKG4pO1xuICAgIGNvbnN0IHBhcnRzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGxldCBwb3MgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSwgYnl0ZXMgfSA9IGVuY29kZVZhbHVlKGRhdGFbaV0pO1xuICAgICAgICBvZmZzZXRzLndyaXRlVUludDMyTEUocG9zLCA0ICogaSk7XG4gICAgICAgIHR5cGVzW2ldID0gdHlwZTtcbiAgICAgICAgcGFydHMucHVzaChieXRlcyk7XG4gICAgICAgIHBvcyArPSBieXRlcy5sZW5ndGg7XG4gICAgfVxuICAgIG9mZnNldHMud3JpdGVVSW50MzJMRShwb3MsIDQgKiBuKTtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbb2Zmc2V0cywgdHlwZXMsIC4uLnBhcnRzXSk7XG59XG5cbi8vIExpa2UgZW5jb2RlQnVsa0RhdGEgYnV0IHRoZSB2YWx1ZXMgYXJlIGFscmVhZHkgZW5jb2RlZCAoYSBtZXJnZSBzdXBwbGllcyB0aGUgd2lubmluZyBjZWxscycgcmF3IGJ5dGVzIHN0cmFpZ2h0IGZyb20gdGhlIGlucHV0IGZpbGVzKS4gTGF5cyBvdXQgdGhlIHNhbWUgb2Zmc2V0cyAvIHR5cGVzIC8gZGF0YSBzZWN0aW9uIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHZhbHVlcyB0aGVtc2VsdmVzLlxuZnVuY3Rpb24gZW5jb2RlQnVsa0RhdGFSYXcoY2VsbHM6IFJhd0NlbGxbXSk6IEJ1ZmZlciB7XG4gICAgY29uc3QgbiA9IGNlbGxzLmxlbmd0aDtcbiAgICBjb25zdCBvZmZzZXRzID0gQnVmZmVyLmFsbG9jKDQgKiAobiArIDEpKTtcbiAgICBjb25zdCB0eXBlcyA9IEJ1ZmZlci5hbGxvYyhuKTtcbiAgICBjb25zdCBwYXJ0czogQnVmZmVyW10gPSBbXTtcbiAgICBsZXQgcG9zID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCB7IHR5cGUsIGJ5dGVzIH0gPSBjZWxsc1tpXTtcbiAgICAgICAgb2Zmc2V0cy53cml0ZVVJbnQzMkxFKHBvcywgNCAqIGkpO1xuICAgICAgICB0eXBlc1tpXSA9IHR5cGU7XG4gICAgICAgIHBhcnRzLnB1c2goYnl0ZXMpO1xuICAgICAgICBwb3MgKz0gYnl0ZXMubGVuZ3RoO1xuICAgIH1cbiAgICBvZmZzZXRzLndyaXRlVUludDMyTEUocG9zLCA0ICogbik7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW29mZnNldHMsIHR5cGVzLCAuLi5wYXJ0c10pO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVCdWxrRGF0YShibG9iOiBCdWZmZXIsIHJvd0NvdW50OiBudW1iZXIpOiB1bmtub3duW10ge1xuICAgIGNvbnN0IGluZGV4U2l6ZSA9IDQgKiAocm93Q291bnQgKyAxKSArIHJvd0NvdW50O1xuICAgIGNvbnN0IHZhbHVlczogdW5rbm93bltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dDb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYmxvYi5yZWFkVUludDMyTEUoNCAqIGkpO1xuICAgICAgICBjb25zdCBlbmQgPSBibG9iLnJlYWRVSW50MzJMRSg0ICogKGkgKyAxKSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBibG9iWzQgKiAocm93Q291bnQgKyAxKSArIGldO1xuICAgICAgICB2YWx1ZXMucHVzaChkZWNvZGVWYWx1ZSh0eXBlLCBibG9iLnN1YmFycmF5KGluZGV4U2l6ZSArIHN0YXJ0LCBpbmRleFNpemUgKyBlbmQpKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG59XG5cbi8vIFRhcmdldCBsb2dpY2FsICh1bmNvbXByZXNzZWQpIHNpemUgb2Ygb25lIGJ1bGsgZmlsZS4gQSByb3dzIGFycmF5IGJpZ2dlciB0aGFuIHRoaXMgaXMgc3BsaXQgYWNyb3NzIG11bHRpcGxlIGtleS1jb250aWd1b3VzIGZpbGVzLCBzbyBmaWxlcyBzdGF5IGFyb3VuZCB0aGlzIHNpemUgKHRoZSBtZXJnZSBwb2xpY3kncyB0YXJnZXQpIGFuZCBubyBzaW5nbGUgY29sdW1uIGJsb2IgLyBCdWZmZXIuY29uY2F0IGV2ZXIgYXBwcm9hY2hlcyB0aGUgfjJHQiBCdWZmZXIgbGVuZ3RoIGxpbWl0LiBUaGUgZXN0aW1hdGUgaXMgcm91Z2ggb24gcHVycG9zZSDigJQgaXQgb25seSBuZWVkcyB0byBrZWVwIGVhY2ggY2h1bmsgbmVhciB0aGUgdGFyZ2V0LCBub3QgYmUgZXhhY3QuIEEgc2luZ2xlIHJvdyBiaWdnZXIgdGhhbiB0aGUgdGFyZ2V0IHN0aWxsIGJlY29tZXMgaXRzIG93biAob3ZlcnNpemVkKSBmaWxlLCBzaW5jZSB3ZSBuZXZlciBzcGxpdCB3aXRoaW4gYSBrZXkuXG5leHBvcnQgY29uc3QgVEFSR0VUX0ZJTEVfQllURVMgPSAyNTYgKiAxMDI0ICogMTAyNDtcblxuLy8gUGVyLXZhbHVlIG9uLWRpc2sgb3ZlcmhlYWQ6IGEgNC1ieXRlIG9mZnNldCBlbnRyeSBwbHVzIGEgMS1ieXRlIHR5cGUgdGFnLlxuY29uc3QgUEVSX1ZBTFVFX09WRVJIRUFEID0gNTtcblxuZnVuY3Rpb24gZXN0aW1hdGVWYWx1ZUJ5dGVzKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlLmxlbmd0aCAqIDI7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIDg7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiAxO1xuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSByZXR1cm4gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpLmxlbmd0aDtcbiAgICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZXN0aW1hdGVSb3dCeXRlcyhyb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogbnVtYmVyIHtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgT2JqZWN0LnZhbHVlcyhyb3cpKSB7XG4gICAgICAgIHRvdGFsICs9IGVzdGltYXRlVmFsdWVCeXRlcyh2YWx1ZSkgKyBQRVJfVkFMVUVfT1ZFUkhFQUQ7XG4gICAgfVxuICAgIHJldHVybiB0b3RhbDtcbn1cblxuLy8gQ29uY2F0ZW5hdGVzIGFscmVhZHktZW5jb2RlZCBjb2x1bW4gYmxvYnMgaW50byBhIGNvbXBsZXRlIGZpbGUgKDQtYnl0ZSBoZWFkZXIgbGVuZ3RoICsgaGVhZGVyIEpTT04gKyBibG9icyksIGNvbXB1dGluZyB0aGUgaGVhZGVyJ3MgdGltZSArIGtleSBib3VuZHMgZnJvbSB0aGUgcGVyLXJvdyB0aW1lcyBhbmQga2V5cy4gU2hhcmVkIGJ5IHRoZSBvYmplY3QtYmFzZWQgYnVpbGRlciAoYnVpbGRPbmVGaWxlKSBhbmQgdGhlIHJhdy1zcGxpY2UgYnVpbGRlciAoYnVpbGRPbmVGaWxlUmF3KS5cbmZ1bmN0aW9uIGFzc2VtYmxlRmlsZShjb2x1bW5OYW1lczogc3RyaW5nW10sIGJsb2JzOiBCdWZmZXJbXSwgcm93Q291bnQ6IG51bWJlciwgdGltZXM6IG51bWJlcltdLCBrZXlzOiBzdHJpbmdbXSk6IEJ1ZmZlciB7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgY29uc3QgY29sdW1ucyA9IGNvbHVtbk5hbWVzLm1hcCgobmFtZSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHsgbmFtZSwgb2Zmc2V0LCBsZW5ndGg6IGJsb2JzW2ldLmxlbmd0aCB9O1xuICAgICAgICBvZmZzZXQgKz0gYmxvYnNbaV0ubGVuZ3RoO1xuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG4gICAgbGV0IG1pblRpbWUgPSB0aW1lcy5sZW5ndGggPyB0aW1lc1swXSA6IDA7XG4gICAgbGV0IG1heFRpbWUgPSBtaW5UaW1lO1xuICAgIGZvciAoY29uc3QgdCBvZiB0aW1lcykgeyBpZiAodCA8IG1pblRpbWUpIG1pblRpbWUgPSB0OyBpZiAodCA+IG1heFRpbWUpIG1heFRpbWUgPSB0OyB9XG4gICAgbGV0IG1pbktleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBtYXhLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGlmIChtaW5LZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPCBtaW5LZXkpIG1pbktleSA9IGtleTtcbiAgICAgICAgaWYgKG1heEtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA+IG1heEtleSkgbWF4S2V5ID0ga2V5O1xuICAgIH1cbiAgICBjb25zdCBoZWFkZXI6IEZpbGVIZWFkZXIgPSB7IHJvd0NvdW50LCBjb2x1bW5zLCBtaW5UaW1lLCBtYXhUaW1lLCBtaW5LZXksIG1heEtleSB9O1xuICAgIGNvbnN0IGhlYWRlckJ1ZiA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGhlYWRlciksIFwidXRmOFwiKTtcbiAgICBjb25zdCBsZW5ndGhQcmVmaXggPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgbGVuZ3RoUHJlZml4LndyaXRlVUludDMyTEUoaGVhZGVyQnVmLmxlbmd0aCwgMCk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2xlbmd0aFByZWZpeCwgaGVhZGVyQnVmLCAuLi5ibG9ic10pO1xufVxuXG5mdW5jdGlvbiBidWlsZE9uZUZpbGUocm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSwgdGltZXM6IG51bWJlcltdKTogQnVmZmVyIHtcbiAgICBjb25zdCBjb2x1bW5OYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjb2x1bW5TZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgT2JqZWN0LmtleXMocm93KSkge1xuICAgICAgICAgICAgaWYgKGNvbHVtblNldC5oYXMoZmllbGQpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbHVtblNldC5hZGQoZmllbGQpO1xuICAgICAgICAgICAgY29sdW1uTmFtZXMucHVzaChmaWVsZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQSByb3cgdGhhdCBkb2Vzbid0IGluY2x1ZGUgYSBjb2x1bW4gc3RvcmVzIEFCU0VOVCAoZmFsbC10aHJvdWdoKSwgbm90IHVuZGVmaW5lZCAoYSByZWFsIHZhbHVlKS5cbiAgICBjb25zdCBibG9icyA9IGNvbHVtbk5hbWVzLm1hcChjb2wgPT4gZW5jb2RlQnVsa0RhdGEocm93cy5tYXAocm93ID0+IGNvbCBpbiByb3cgPyByb3dbY29sXSA6IEFCU0VOVCkpKTtcbiAgICAvLyBUaGUgaGlkZGVuIHBlci1yb3cgdGltZSBjb2x1bW4uXG4gICAgY29sdW1uTmFtZXMucHVzaChUSU1FX0NPTFVNTik7XG4gICAgYmxvYnMucHVzaChlbmNvZGVCdWxrRGF0YSh0aW1lcykpO1xuICAgIHJldHVybiBhc3NlbWJsZUZpbGUoY29sdW1uTmFtZXMsIGJsb2JzLCByb3dzLmxlbmd0aCwgdGltZXMsIHJvd3MubWFwKHIgPT4gcltLRVlfQ09MVU1OXSBhcyBzdHJpbmcpKTtcbn1cblxuLy8gQSByZXNvbHZlZCBvdXRwdXQgcm93IGZvciB0aGUgcmF3LXNwbGljZSBtZXJnZTogaXRzIGtleSwgd3JpdGUtdGltZSwgYW5kIHRoZSB3aW5uaW5nIHJhdyBjZWxsIGZvciBlYWNoIGNvbHVtbiBpdCBoYXMgKGEgY29sdW1uIGl0IGxhY2tzIGlzIHdyaXR0ZW4gQUJTRU5UIOKAlCBmYWxsLXRocm91Z2gpLiBUaGUgY2VsbCBieXRlcyBhcmUgY29waWVkIHN0cmFpZ2h0IGZyb20gdGhlIGlucHV0IGZpbGVzOyBubyB2YWx1ZSBpcyBldmVyIGRlY29kZWQuXG5leHBvcnQgdHlwZSBSYXdSb3cgPSB7IGtleTogc3RyaW5nOyB0aW1lOiBudW1iZXI7IGNlbGxzOiBNYXA8c3RyaW5nLCBSYXdDZWxsPiB9O1xuXG4vLyBTaXplIG9mIGEgY29sdW1uIGJsb2IncyBJTkRFWCBzZWN0aW9uIChvZmZzZXRzIGFycmF5ICsgdHlwZXMgYXJyYXkpIGZvciBhIGNvbHVtbiBvZiBOIHJvd3MuIFRoZSBkYXRhIHNlY3Rpb24gZm9sbG93cyBpbW1lZGlhdGVseSBhZnRlci4gVGhlIHBsYW5uZWQgbWVyZ2UgdXNlcyB0aGlzIHRvIHNpemUgb3V0cHV0IGJ1ZmZlcnMgZXhhY3RseS5cbmV4cG9ydCBmdW5jdGlvbiBjb2x1bW5JbmRleEJ5dGVMZW5ndGgocm93Q291bnQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIDQgKiAocm93Q291bnQgKyAxKSArIHJvd0NvdW50O1xufVxuXG4vLyBBc3NlbWJsZXMgYSBjb21wbGV0ZSBidWxrIGZpbGUgZnJvbSBhIHNldCBvZiBwcmUtYnVpbHQgdmFsdWUgY29sdW1uIGJsb2JzIHBsdXMgdGhlIGtleXMgKyB0aW1lcy4gQXV0by0gYWRkcyB0aGUgS0VZX0NPTFVNTiAoa2V5cykgYW5kIGhpZGRlbiBUSU1FX0NPTFVNTiAodGltZXMpIOKAlCB0aGV5J3JlIHNtYWxsIGVub3VnaCB0byBlbmNvZGUgaW4gb25lIHNob3QgaGVyZS4gVXNlZCBieSB0aGUgcGxhbm5lZCBtZXJnZTogaXQgYnVpbGRzIGVhY2ggdmFsdWUgY29sdW1uJ3MgYmxvYiBieS1oYW5kIChvZmZzZXRzL3R5cGVzICsgcmF3IGJ5dGVzIGNvcGllZCBkaXJlY3RseSBmcm9tIGlucHV0cywgbm8gdmFsdWUgbWF0ZXJpYWxpemF0aW9uKSBhbmQgaGFuZHMgdGhlIHJlc3VsdCBoZXJlIGZvciBoZWFkZXIgKyBib3VuZHMuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVQbGFubmVkRmlsZShjb25maWc6IHtcbiAgICB2YWx1ZUNvbHVtbnM6IHsgbmFtZTogc3RyaW5nOyBibG9iOiBCdWZmZXIgfVtdO1xuICAgIGtleXM6IHN0cmluZ1tdO1xuICAgIHRpbWVzOiBudW1iZXJbXTtcbn0pOiBCdWZmZXIge1xuICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gW0tFWV9DT0xVTU4sIC4uLmNvbmZpZy52YWx1ZUNvbHVtbnMubWFwKGMgPT4gYy5uYW1lKSwgVElNRV9DT0xVTU5dO1xuICAgIGNvbnN0IGJsb2JzID0gW1xuICAgICAgICBlbmNvZGVCdWxrRGF0YShjb25maWcua2V5cyksXG4gICAgICAgIC4uLmNvbmZpZy52YWx1ZUNvbHVtbnMubWFwKGMgPT4gYy5ibG9iKSxcbiAgICAgICAgZW5jb2RlQnVsa0RhdGEoY29uZmlnLnRpbWVzKSxcbiAgICBdO1xuICAgIHJldHVybiBhc3NlbWJsZUZpbGUoY29sdW1uTmFtZXMsIGJsb2JzLCBjb25maWcua2V5cy5sZW5ndGgsIGNvbmZpZy50aW1lcywgY29uZmlnLmtleXMpO1xufVxuXG5jb25zdCBBQlNFTlRfQ0VMTDogUmF3Q2VsbCA9IHsgdHlwZTogVFlQRV9BQlNFTlQsIGJ5dGVzOiBFTVBUWV9CVUZGRVIgfTtcblxuZnVuY3Rpb24gYnVpbGRPbmVGaWxlUmF3KHJvd3M6IFJhd1Jvd1tdKTogQnVmZmVyIHtcbiAgICAvLyBDb2x1bW5zIHByZXNlbnQgaW4gdGhpcyBjaHVuaywgaW4gZmlyc3Qtc2VlbiBvcmRlciAobWF0Y2hlcyBidWlsZE9uZUZpbGUsIHdoaWNoIG9ubHkgZW1pdHMgY29sdW1ucyBzb21lIHJvdyBhY3R1YWxseSBoYXMpLlxuICAgIGNvbnN0IHZhbHVlQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykgZm9yIChjb25zdCBjb2wgb2Ygcm93LmNlbGxzLmtleXMoKSkge1xuICAgICAgICBpZiAoc2Vlbi5oYXMoY29sKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKGNvbCk7XG4gICAgICAgIHZhbHVlQ29sdW1ucy5wdXNoKGNvbCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gW0tFWV9DT0xVTU4sIC4uLnZhbHVlQ29sdW1ucywgVElNRV9DT0xVTU5dO1xuICAgIGNvbnN0IHRpbWVzID0gcm93cy5tYXAociA9PiByLnRpbWUpO1xuICAgIGNvbnN0IGJsb2JzID0gW1xuICAgICAgICBlbmNvZGVCdWxrRGF0YShyb3dzLm1hcChyID0+IHIua2V5KSksXG4gICAgICAgIC4uLnZhbHVlQ29sdW1ucy5tYXAoY29sID0+IGVuY29kZUJ1bGtEYXRhUmF3KHJvd3MubWFwKHIgPT4gci5jZWxscy5nZXQoY29sKSA/PyBBQlNFTlRfQ0VMTCkpKSxcbiAgICAgICAgZW5jb2RlQnVsa0RhdGEodGltZXMpLFxuICAgIF07XG4gICAgcmV0dXJuIGFzc2VtYmxlRmlsZShjb2x1bW5OYW1lcywgYmxvYnMsIHJvd3MubGVuZ3RoLCB0aW1lcywgcm93cy5tYXAociA9PiByLmtleSkpO1xufVxuXG5mdW5jdGlvbiBlc3RpbWF0ZVJhd1Jvd0J5dGVzKHJvdzogUmF3Um93KTogbnVtYmVyIHtcbiAgICBsZXQgdG90YWwgPSByb3cua2V5Lmxlbmd0aCAqIDIgKyBQRVJfVkFMVUVfT1ZFUkhFQUQ7XG4gICAgZm9yIChjb25zdCBjZWxsIG9mIHJvdy5jZWxscy52YWx1ZXMoKSkgdG90YWwgKz0gY2VsbC5ieXRlcy5sZW5ndGggKyBQRVJfVkFMVUVfT1ZFUkhFQUQ7XG4gICAgcmV0dXJuIHRvdGFsO1xufVxuXG4vLyBPbmUgY29tcGxldGUsIGluZGVwZW5kZW50IGZpbGU6IHRoZSBlbmNvZGVkIGJ1ZmZlciBwbHVzIGl0cyBrZXkgcmFuZ2UgKyByb3cgY291bnQgKHRoZSBjYWxsZXIgbG9ncyB0aGUgcmFuZ2Ugd2hlbiBhIG1lcmdlIHNwbGl0cyBhY3Jvc3Mgc2V2ZXJhbCBmaWxlcykuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWx0RmlsZSB7IGJ1ZmZlcjogQnVmZmVyOyBtaW5LZXk6IHN0cmluZzsgbWF4S2V5OiBzdHJpbmc7IHJvd0NvdW50OiBudW1iZXI7IH1cblxuLy8gUmV0dXJucyBvbmUgY29tcGxldGUsIGluZGVwZW5kZW50IGZpbGUgcGVyIGNodW5rIG9mIHJvd3MuIFJvd3MgYXJlIGZpcnN0IHNvcnRlZCBieSBrZXksIHRoZW4gcGFydGl0aW9uZWQgaW50byBrZXktY29udGlndW91cyBjaHVua3Mgb2YgfnRhcmdldEJ5dGVzIGVhY2gg4oCUIHNvIGV2ZXJ5IHJldHVybmVkIGZpbGUgaXMga2V5LXNvcnRlZCAodGlnaHQgbWluS2V5L21heEtleSBmb3IgdGhlIHJlYWQtc2tpcCArIG1lcmdlIHBsYW5uZXIpIGFuZCBzdGF5cyBuZWFyIHRoZSB0YXJnZXQgc2l6ZSwgYW5kIG5vIHNpbmdsZSBjb2x1bW4gYmxvYiAvIEJ1ZmZlci5jb25jYXQgYXBwcm9hY2hlcyB0aGUgfjJHQiBsaW1pdC4gVGhlIGNodW5rcyBoYXZlIGRpc2pvaW50IGtleSByYW5nZXMsIHNvIHRoZSBjYWxsZXIganVzdCB3cml0ZXMgZWFjaCBhcyBpdHMgb3duIGZpbGUuIEEgbm9ybWFsLXNpemVkIHdyaXRlIHJldHVybnMgYSBzaW5nbGUgZmlsZS4gYHRpbWVzW2ldYCBpcyByb3cgaSdzIHdyaXRlLXRpbWUsIHN0b3JlZCBwZXIgcm93IHNvIHJlYWRzIHJlc29sdmUgYSBrZXkgdG8gaXRzIGxhdGVzdCB2YWx1ZSBieSB0aW1lLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmlsZUJ1ZmZlcihyb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLCB0aW1lczogbnVtYmVyW10sIHRhcmdldEJ5dGVzID0gVEFSR0VUX0ZJTEVfQllURVMpOiBCdWlsdEZpbGVbXSB7XG4gICAgLy8gQSBjaHVuayBpcyBhbHJlYWR5IGtleS1zb3J0ZWQsIHNvIGl0cyBmaXJzdC9sYXN0IHJvdyBhcmUgaXRzIG1pbi9tYXgga2V5LlxuICAgIGNvbnN0IG1ha2UgPSAocnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sIHRzOiBudW1iZXJbXSk6IEJ1aWx0RmlsZSA9PiAoe1xuICAgICAgICBidWZmZXI6IGJ1aWxkT25lRmlsZShycywgdHMpLFxuICAgICAgICBtaW5LZXk6IHJzLmxlbmd0aCA/IChyc1swXVtLRVlfQ09MVU1OXSBhcyBzdHJpbmcpIDogXCJcIixcbiAgICAgICAgbWF4S2V5OiBycy5sZW5ndGggPyAocnNbcnMubGVuZ3RoIC0gMV1bS0VZX0NPTFVNTl0gYXMgc3RyaW5nKSA6IFwiXCIsXG4gICAgICAgIHJvd0NvdW50OiBycy5sZW5ndGgsXG4gICAgfSk7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW21ha2UoW10sIFtdKV07XG4gICAgLy8gU29ydCByb3dzICsgdGhlaXIgdGltZXMgdG9nZXRoZXIgYnkga2V5IHNvIGVhY2ggb3V0cHV0IGZpbGUgaXMga2V5LWNvbnRpZ3VvdXMuXG4gICAgY29uc3Qgb3JkZXIgPSByb3dzLm1hcCgoXywgaSkgPT4gaSkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBrYSA9IHJvd3NbYV1bS0VZX0NPTFVNTl0gYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCBrYiA9IHJvd3NbYl1bS0VZX0NPTFVNTl0gYXMgc3RyaW5nO1xuICAgICAgICByZXR1cm4ga2EgPCBrYiA/IC0xIDoga2EgPiBrYiA/IDEgOiAwO1xuICAgIH0pO1xuICAgIGNvbnN0IHNvcnRlZFJvd3MgPSBvcmRlci5tYXAoaSA9PiByb3dzW2ldKTtcbiAgICBjb25zdCBzb3J0ZWRUaW1lcyA9IG9yZGVyLm1hcChpID0+IHRpbWVzW2ldKTtcbiAgICBjb25zdCByZXN1bHQ6IEJ1aWx0RmlsZVtdID0gW107XG4gICAgbGV0IGNodW5rU3RhcnQgPSAwO1xuICAgIGxldCBjaHVua0J5dGVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZFJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm93Qnl0ZXMgPSBlc3RpbWF0ZVJvd0J5dGVzKHNvcnRlZFJvd3NbaV0pO1xuICAgICAgICBpZiAoaSA+IGNodW5rU3RhcnQgJiYgY2h1bmtCeXRlcyArIHJvd0J5dGVzID4gdGFyZ2V0Qnl0ZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG1ha2Uoc29ydGVkUm93cy5zbGljZShjaHVua1N0YXJ0LCBpKSwgc29ydGVkVGltZXMuc2xpY2UoY2h1bmtTdGFydCwgaSkpKTtcbiAgICAgICAgICAgIGNodW5rU3RhcnQgPSBpO1xuICAgICAgICAgICAgY2h1bmtCeXRlcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgY2h1bmtCeXRlcyArPSByb3dCeXRlcztcbiAgICB9XG4gICAgcmVzdWx0LnB1c2gobWFrZShzb3J0ZWRSb3dzLnNsaWNlKGNodW5rU3RhcnQpLCBzb3J0ZWRUaW1lcy5zbGljZShjaHVua1N0YXJ0KSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIFRoZSByYXctc3BsaWNlIGNvdW50ZXJwYXJ0IG9mIGJ1aWxkRmlsZUJ1ZmZlciwgdXNlZCBieSBtZXJnZXM6IHRoZSByb3dzIGFscmVhZHkgY2FycnkgdGhlaXIgd2lubmluZyBjZWxscyBhcyByYXcgb24tZGlzayBieXRlcyAobm8gSlMgdmFsdWVzKSwgc28gdGhpcyBqdXN0IHNvcnRzIGJ5IGtleSwgY2h1bmtzIHRvIH50YXJnZXRCeXRlcywgYW5kIGNvbmNhdGVuYXRlcyB0aGUgYnl0ZXMuIFNhbWUgb3V0cHV0IGd1YXJhbnRlZXM6IGtleS1jb250aWd1b3VzLCBkaXNqb2ludCwgYXNjZW5kaW5nIGZpbGVzLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmlsZUJ1ZmZlclJhdyhyb3dzOiBSYXdSb3dbXSwgdGFyZ2V0Qnl0ZXMgPSBUQVJHRVRfRklMRV9CWVRFUyk6IEJ1aWx0RmlsZVtdIHtcbiAgICBjb25zdCBtYWtlID0gKHJzOiBSYXdSb3dbXSk6IEJ1aWx0RmlsZSA9PiAoe1xuICAgICAgICBidWZmZXI6IGJ1aWxkT25lRmlsZVJhdyhycyksXG4gICAgICAgIG1pbktleTogcnMubGVuZ3RoID8gcnNbMF0ua2V5IDogXCJcIixcbiAgICAgICAgbWF4S2V5OiBycy5sZW5ndGggPyByc1tycy5sZW5ndGggLSAxXS5rZXkgOiBcIlwiLFxuICAgICAgICByb3dDb3VudDogcnMubGVuZ3RoLFxuICAgIH0pO1xuICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFttYWtlKFtdKV07XG4gICAgY29uc3Qgc29ydGVkID0gcm93cy5zbGljZSgpLnNvcnQoKGEsIGIpID0+IGEua2V5IDwgYi5rZXkgPyAtMSA6IGEua2V5ID4gYi5rZXkgPyAxIDogMCk7XG4gICAgY29uc3QgcmVzdWx0OiBCdWlsdEZpbGVbXSA9IFtdO1xuICAgIGxldCBjaHVua1N0YXJ0ID0gMDtcbiAgICBsZXQgY2h1bmtCeXRlcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm93Qnl0ZXMgPSBlc3RpbWF0ZVJhd1Jvd0J5dGVzKHNvcnRlZFtpXSk7XG4gICAgICAgIGlmIChpID4gY2h1bmtTdGFydCAmJiBjaHVua0J5dGVzICsgcm93Qnl0ZXMgPiB0YXJnZXRCeXRlcykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobWFrZShzb3J0ZWQuc2xpY2UoY2h1bmtTdGFydCwgaSkpKTtcbiAgICAgICAgICAgIGNodW5rU3RhcnQgPSBpO1xuICAgICAgICAgICAgY2h1bmtCeXRlcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgY2h1bmtCeXRlcyArPSByb3dCeXRlcztcbiAgICB9XG4gICAgcmVzdWx0LnB1c2gobWFrZShzb3J0ZWQuc2xpY2UoY2h1bmtTdGFydCkpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgdHlwZSBCYXNlQnVsa0RhdGFiYXNlUmVhZGVyID0ge1xuICAgIC8vIElkZW50aWZpZXMgdGhlIHNvdXJjZSB0aGlzIHJlYWRlciBjYW1lIGZyb20gKHRoZSBidWxrIGZpbGUgbmFtZSwgb3IgXCIoc3RyZWFtcylcIikgc28gdGhlIGpvaW4gY2FuIG5hbWUgdGhlIG9mZmVuZGluZyBmaWxlIHdoZW4gb25lIG9mIGl0cyByZWFkcyBmYWlscy4gVW5kZWZpbmVkIGZvciByZWFkZXJzIGJ1aWx0IHdpdGhvdXQgb25lLlxuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgcm93Q291bnQ6IG51bWJlcjtcbiAgICB0b3RhbEJ5dGVzOiBudW1iZXI7XG4gICAgLy8gV3JpdGUtdGltZSBib3VuZHMgb2YgdGhpcyByZWFkZXIncyBkYXRhICgwIGlmIHVua25vd24g4oCUIG9sZCBidWxrIGZpbGVzKS5cbiAgICBtaW5UaW1lOiBudW1iZXI7XG4gICAgbWF4VGltZTogbnVtYmVyO1xuICAgIC8vIEtleS1yYW5nZSBib3VuZHMgKHVuZGVmaW5lZCBmb3Igb2xkIGZpbGVzIC8gdGhlIHN0cmVhbSByZWFkZXIg4oCUIHRyZWF0IGFzIFwic3BhbnMgYWxsIGtleXNcIikuXG4gICAgbWluS2V5Pzogc3RyaW5nO1xuICAgIG1heEtleT86IHN0cmluZztcbiAgICAvLyBLZXlzIGlzIHNwZWNpYWwsIGl0J3MgYWx3YXlzIGF1dG9tYXRpY2FsbHkgZGVjb2RlZCwgZXZlbiB0aG91Z2ggaXQgaXMgc3RvcmVkIGFzIGEgbm9ybWFsIGNvbHVtblxuICAgIGtleXM6IHN0cmluZ1tdO1xuICAgIGNvbHVtbnM6IHsgY29sdW1uOiBzdHJpbmc7IGJ5dGVTaXplOiBudW1iZXIgfVtdO1xuICAgIC8vIEVhY2gga2V5J3Mgcm93IHdyaXRlLXRpbWUgKHRoZSB0aW1lIG9mIGl0cyBuZXdlc3Qgd3JpdGUgaW4gdGhpcyByZWFkZXIpLiBUaGUgam9pbiBjb21wYXJlcyB0aGVzZSBhY3Jvc3MgcmVhZGVycyB0byByZXNvbHZlIGEga2V5IHRvIGl0cyBsYXRlc3QgdmFsdWUuXG4gICAga2V5VGltZXM6IE1hcDxzdHJpbmcsIG51bWJlcj47XG4gICAgLy8gUGVyLWtleSB0b21ic3RvbmUgdGltZTogdGhlIGtleSB3YXMgZGVsZXRlZCBhdCB0aGlzIHRpbWUuIFRoZSBqb2luIHRyZWF0cyBhIGRlbGV0ZSBsaWtlIGFueSBvdGhlciBldmVudCDigJQgYSBkZWxldGUgb25seSB3aW5zIGlmIGl0J3MgbmV3ZXIgdGhhbiBldmVyeSBzZXQgZm9yIHRoZSBrZXkuIE9ubHkgdGhlIHN0cmVhbSByZWFkZXIgc2V0cyBpdC5cbiAgICBkZWxldGVUaW1lcz86IE1hcDxzdHJpbmcsIG51bWJlcj47XG4gICAgLy8gRWFjaCBrZXkncyB2YWx1ZSBmb3IgdGhlIGNvbHVtbiBwbHVzIHRoZSByb3cncyB3cml0ZS10aW1lLiB2YWx1ZSBtYXkgYmUgQUJTRU5UICh0aGUgcm93IG5ldmVyIHNldCB0aGlzIGNvbHVtbiDigJQgdGhlIGpvaW4gdGhlbiBmYWxscyB0aHJvdWdoIHRvIGFuIG9sZGVyIHJlYWRlciBmb3IgdGhhdCBrZXkvY29sdW1uKS5cbiAgICBnZXRDb2x1bW46IChjb2x1bW46IHN0cmluZykgPT4gUHJvbWlzZTx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH1bXT47XG4gICAgLy8gTGlrZSBnZXRDb2x1bW4gYnV0IHJldHVybnMgZWFjaCBjZWxsJ3MgcmF3IG9uLWRpc2sgZW5jb2RpbmcgKHR5cGUgdGFnICsgYnl0ZXMpIGtleWVkIGJ5IGtleSwgV0lUSE9VVCBkZWNvZGluZyB0aGUgdmFsdWUg4oCUIGZvciBtZXJnZXMsIHdoaWNoIHNwbGljZSB0aGUgd2lubmluZyBieXRlcyBzdHJhaWdodCBpbnRvIHRoZSBvdXRwdXQuIEFCU0VOVCBjZWxscyBhcmUgb21pdHRlZCAoYSBtaXNzaW5nIGtleSBtZWFucyB0aGlzIHJlYWRlciBkaWRuJ3Qgc2V0IHRoaXMgY29sdW1uLCBzbyB0aGUgbWVyZ2UgZmFsbHMgdGhyb3VnaCB0byBhbiBvbGRlciByZWFkZXIpLiBFYWNoIGNlbGwncyB3cml0ZS10aW1lIGlzIHRoZSByZWFkZXIncyBrZXlUaW1lcyB2YWx1ZSBmb3IgdGhhdCBrZXkuXG4gICAgZ2V0UmF3Q29sdW1uOiAoY29sdW1uOiBzdHJpbmcpID0+IFByb21pc2U8TWFwPHN0cmluZywgUmF3Q2VsbD4+O1xuICAgIC8vIFJldHVybnMgdGhlIGNvbHVtbidzIElOREVYIChvZmZzZXRzICsgdHlwZXMpIHBsdXMgYSBjb250aWd1b3VzIHJvdy1yYW5nZSBieXRlIHJlYWRlci4gVGhlIHBsYW5uZWQgbWVyZ2UgbG9hZHMgdGhpcyBmb3IgZXZlcnkgKHNvdXJjZSwgY29sdW1uKSBvbmNlIOKAlCBzbWFsbCAofjVCL3JvdyksIG5vIHZhbHVlIGJ5dGVzIHB1bGxlZCDigJQgYW5kIHVzZXMgdHlwZXMvb2Zmc2V0cyB0byBwbGFuIHRoZSBvdXRwdXQncyBieXRlIGxheW91dC4gRXhlY3V0ZSB0aGVuIHJlYWRzIG9ubHkgdGhlIG5lZWRlZCBydW5zLlxuICAgIGdldENvbHVtbkluZGV4OiAoY29sdW1uOiBzdHJpbmcpID0+IFByb21pc2U8Q29sdW1uSW5kZXg+O1xuICAgIC8vIE1hcHMgYSBrZXkgdG8gaXRzIHJvdyBpbmRleCBpbiB0aGlzIHJlYWRlciAoYW5kIHVuZGVmaW5lZCBpZiBhYnNlbnQpLiBUaGUgcGxhbm5lZCBtZXJnZSB1c2VzIHRoaXMgdG8gbG9vayB1cCBhIHdpbm5pbmcgY2VsbCdzIHNvdXJjZSByb3cgd2l0aG91dCBnb2luZyB0aHJvdWdoIGEgY29sdW1uIHJlYWQuXG4gICAgcm93T2ZLZXk6IChrZXk6IHN0cmluZykgPT4gbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIC8vIFRoZSB2YWx1ZSArIHdyaXRlLXRpbWUgZm9yIChrZXksIGNvbHVtbiksIG9yIEFCU0VOVCBpZiB0aGlzIHJlYWRlciBoYXMgbm8gc3VjaCBjZWxsLlxuICAgIGdldFNpbmdsZUZpZWxkOiAoa2V5OiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKSA9PiBQcm9taXNlPHsgdmFsdWU6IHVua25vd247IHRpbWU6IG51bWJlciB9IHwgdHlwZW9mIEFCU0VOVD47XG59O1xuXG4vLyBSZWFkcyBqdXN0IHRoZSBmaWxlIGhlYWRlciAodGhlIDQtYnl0ZSBsZW5ndGggKyBoZWFkZXIgSlNPTikg4oCUIG5vIGNvbHVtbiBkYXRhLiBVc2VkIGJ5IHRoZSBtZXJnZSBwbGFubmVyIHRvIGdldCBlYWNoIGZpbGUncyByb3cgY291bnQsIHRpbWUgcmFuZ2UsIGFuZCBrZXkgcmFuZ2UgY2hlYXBseSBhY3Jvc3MgbWFueSBmaWxlcy5cbmV4cG9ydCB0eXBlIEJ1bGtIZWFkZXJJbmZvID0geyByb3dDb3VudDogbnVtYmVyOyBtaW5UaW1lOiBudW1iZXI7IG1heFRpbWU6IG51bWJlcjsgbWluS2V5Pzogc3RyaW5nOyBtYXhLZXk/OiBzdHJpbmc7IGNvbHVtbnM6IHsgY29sdW1uOiBzdHJpbmc7IGJ5dGVTaXplOiBudW1iZXIgfVtdIH07XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEJ1bGtIZWFkZXIoZ2V0UmFuZ2U6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4gUHJvbWlzZTxCdWZmZXI+LCB0b3RhbEJ5dGVzOiBudW1iZXIpOiBQcm9taXNlPEJ1bGtIZWFkZXJJbmZvPiB7XG4gICAgY29uc3QgaGVhZGVyTGVuZ3RoID0gKGF3YWl0IGdldFJhbmdlKDAsIDQpKS5yZWFkVUludDMyTEUoMCk7XG4gICAgaWYgKGhlYWRlckxlbmd0aCA8PSAwIHx8IGhlYWRlckxlbmd0aCA+IHRvdGFsQnl0ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBoZWFkZXIgbGVuZ3RoIGluICgwLCAke3RvdGFsQnl0ZXN9XSwgd2FzICR7aGVhZGVyTGVuZ3RofWApO1xuICAgIH1cbiAgICBjb25zdCBoZWFkZXIgPSBKU09OLnBhcnNlKChhd2FpdCBnZXRSYW5nZSg0LCA0ICsgaGVhZGVyTGVuZ3RoKSkudG9TdHJpbmcoXCJ1dGY4XCIpKSBhcyBGaWxlSGVhZGVyO1xuICAgIHJldHVybiB7XG4gICAgICAgIHJvd0NvdW50OiBoZWFkZXIucm93Q291bnQsXG4gICAgICAgIG1pblRpbWU6IGhlYWRlci5taW5UaW1lIHx8IDAsXG4gICAgICAgIG1heFRpbWU6IGhlYWRlci5tYXhUaW1lIHx8IDAsXG4gICAgICAgIG1pbktleTogaGVhZGVyLm1pbktleSxcbiAgICAgICAgbWF4S2V5OiBoZWFkZXIubWF4S2V5LFxuICAgICAgICBjb2x1bW5zOiBoZWFkZXIuY29sdW1ucy5maWx0ZXIoYyA9PiBjLm5hbWUgIT09IFRJTUVfQ09MVU1OKS5tYXAoYyA9PiAoeyBjb2x1bW46IGMubmFtZSwgYnl0ZVNpemU6IGMubGVuZ3RoIH0pKSxcbiAgICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEJ1bGtEYXRhYmFzZShjb25maWc6IHtcbiAgICB0b3RhbEJ5dGVzOiBudW1iZXI7XG4gICAgZ2V0UmFuZ2U6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4gUHJvbWlzZTxCdWZmZXI+O1xuICAgIG5hbWU/OiBzdHJpbmc7XG59KTogUHJvbWlzZTxCYXNlQnVsa0RhdGFiYXNlUmVhZGVyPiB7XG4gICAgY29uc3QgaGVhZGVyTGVuZ3RoID0gKGF3YWl0IGNvbmZpZy5nZXRSYW5nZSgwLCA0KSkucmVhZFVJbnQzMkxFKDApO1xuICAgIGlmIChoZWFkZXJMZW5ndGggPD0gMCB8fCBoZWFkZXJMZW5ndGggPiBjb25maWcudG90YWxCeXRlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGhlYWRlciBsZW5ndGggaW4gKDAsICR7Y29uZmlnLnRvdGFsQnl0ZXN9XSwgd2FzICR7aGVhZGVyTGVuZ3RofWApO1xuICAgIH1cbiAgICBjb25zdCBoZWFkZXIgPSBKU09OLnBhcnNlKChhd2FpdCBjb25maWcuZ2V0UmFuZ2UoNCwgNCArIGhlYWRlckxlbmd0aCkpLnRvU3RyaW5nKFwidXRmOFwiKSkgYXMgRmlsZUhlYWRlcjtcbiAgICBjb25zdCBkYXRhQmFzZSA9IDQgKyBoZWFkZXJMZW5ndGg7XG4gICAgY29uc3Qgcm93Q291bnQgPSBoZWFkZXIucm93Q291bnQ7XG4gICAgY29uc3QgY29sQnlOYW1lID0gbmV3IE1hcChoZWFkZXIuY29sdW1ucy5tYXAoYyA9PiBbYy5uYW1lLCBjXSkpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gcmVhZFdob2xlQ29sdW1uKGNvbHVtbjogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duW10+IHtcbiAgICAgICAgY29uc3QgY29sID0gY29sQnlOYW1lLmdldChjb2x1bW4pO1xuICAgICAgICBpZiAoIWNvbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBjb2x1bW4gJHtjb2x1bW59LCBmaWxlIG9ubHkgaGFzOiAke2hlYWRlci5jb2x1bW5zLm1hcChjID0+IGMubmFtZSkuam9pbihcIiwgXCIpfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBjb25maWcuZ2V0UmFuZ2UoZGF0YUJhc2UgKyBjb2wub2Zmc2V0LCBkYXRhQmFzZSArIGNvbC5vZmZzZXQgKyBjb2wubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGRlY29kZUJ1bGtEYXRhKGJsb2IsIHJvd0NvdW50KTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlzID0gKGF3YWl0IHJlYWRXaG9sZUNvbHVtbihLRVlfQ09MVU1OKSkubWFwKHYgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHYgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgc3RyaW5nIGtleSwgd2FzICR7dHlwZW9mIHZ9OiAke0pTT04uc3RyaW5naWZ5KHYpPy5zbGljZSgwLCA1MDApfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuICAgIGNvbnN0IGtleUluZGV4ID0gbmV3IE1hcChrZXlzLm1hcCgoa2V5LCBpKSA9PiBba2V5LCBpXSkpO1xuXG4gICAgLy8gUGVyLXJvdyB3cml0ZS10aW1lcy4gT2xkIGZpbGVzICh3cml0dGVuIGJlZm9yZSB0aGlzIGNvbHVtbiBleGlzdGVkKSBmYWxsIGJhY2sgdG8gdGhlIGZpbGUncyBoZWFkZXIgdGltZSAob3IgMCkgZm9yIGV2ZXJ5IHJvdyDigJQgZmluZSwgc2luY2Ugc3VjaCBmaWxlcyBwcmVkYXRlIGNvbmN1cnJlbnQtdGltZSByZXNvbHV0aW9uLlxuICAgIGNvbnN0IHRpbWVzOiBudW1iZXJbXSA9IGNvbEJ5TmFtZS5oYXMoVElNRV9DT0xVTU4pXG4gICAgICAgID8gKGF3YWl0IHJlYWRXaG9sZUNvbHVtbihUSU1FX0NPTFVNTikpLm1hcCh2ID0+IHR5cGVvZiB2ID09PSBcIm51bWJlclwiID8gdiA6IDApXG4gICAgICAgIDoga2V5cy5tYXAoKCkgPT4gaGVhZGVyLm1heFRpbWUgfHwgMCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBjb25maWcubmFtZSxcbiAgICAgICAgcm93Q291bnQsXG4gICAgICAgIHRvdGFsQnl0ZXM6IGNvbmZpZy50b3RhbEJ5dGVzLFxuICAgICAgICBtaW5UaW1lOiBoZWFkZXIubWluVGltZSB8fCAwLFxuICAgICAgICBtYXhUaW1lOiBoZWFkZXIubWF4VGltZSB8fCAwLFxuICAgICAgICBtaW5LZXk6IGhlYWRlci5taW5LZXksXG4gICAgICAgIG1heEtleTogaGVhZGVyLm1heEtleSxcbiAgICAgICAga2V5cyxcbiAgICAgICAga2V5VGltZXM6IG5ldyBNYXAoa2V5cy5tYXAoKGtleSwgaSkgPT4gW2tleSwgdGltZXNbaV1dKSksXG4gICAgICAgIGNvbHVtbnM6IGhlYWRlci5jb2x1bW5zLmZpbHRlcihjID0+IGMubmFtZSAhPT0gVElNRV9DT0xVTU4pLm1hcChjID0+ICh7IGNvbHVtbjogYy5uYW1lLCBieXRlU2l6ZTogYy5sZW5ndGggfSkpLFxuICAgICAgICBhc3luYyBnZXRDb2x1bW4oY29sdW1uKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCByZWFkV2hvbGVDb2x1bW4oY29sdW1uKTtcbiAgICAgICAgICAgIHJldHVybiBrZXlzLm1hcCgoa2V5LCBpKSA9PiAoeyBrZXksIHZhbHVlOiB2YWx1ZXNbaV0sIHRpbWU6IHRpbWVzW2ldIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0UmF3Q29sdW1uKGNvbHVtbikge1xuICAgICAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIFJhd0NlbGw+KCk7XG4gICAgICAgICAgICBjb25zdCBjb2wgPSBjb2xCeU5hbWUuZ2V0KGNvbHVtbik7XG4gICAgICAgICAgICBpZiAoIWNvbCkgcmV0dXJuIG1hcDsgLy8gZmlsZSBsYWNrcyB0aGlzIGNvbHVtbiDihpIgZXZlcnkgY2VsbCBBQlNFTlQgKGZhbGwgdGhyb3VnaClcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBjb25maWcuZ2V0UmFuZ2UoZGF0YUJhc2UgKyBjb2wub2Zmc2V0LCBkYXRhQmFzZSArIGNvbC5vZmZzZXQgKyBjb2wubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4U2l6ZSA9IDQgKiAocm93Q291bnQgKyAxKSArIHJvd0NvdW50O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGJsb2JbNCAqIChyb3dDb3VudCArIDEpICsgaV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFRZUEVfQUJTRU5UKSBjb250aW51ZTsgLy8gb21pdCBBQlNFTlQgc28gdGhlIGpvaW4gZmFsbHMgdGhyb3VnaFxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gYmxvYi5yZWFkVUludDMyTEUoNCAqIGkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IGJsb2IucmVhZFVJbnQzMkxFKDQgKiAoaSArIDEpKTtcbiAgICAgICAgICAgICAgICBtYXAuc2V0KGtleXNbaV0sIHsgdHlwZSwgYnl0ZXM6IGJsb2Iuc3ViYXJyYXkoaW5kZXhTaXplICsgc3RhcnQsIGluZGV4U2l6ZSArIGVuZCkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBnZXRDb2x1bW5JbmRleChjb2x1bW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IGNvbEJ5TmFtZS5nZXQoY29sdW1uKTtcbiAgICAgICAgICAgIGlmICghY29sKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlsZSBsYWNrcyB0aGlzIGNvbHVtbiDigJQgcHJlc2VudCBhbiBhbGwtQUJTRU5UIGluZGV4IHNvIHRoZSBwbGFubmVyIGNhbiB0cmVhdCBpdCB1bmlmb3JtbHkgd2l0aCBmaWxlcyB0aGF0IGhhdmUgdGhlIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KHJvd0NvdW50ICsgMSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZXMgPSBuZXcgVWludDhBcnJheShyb3dDb3VudCkuZmlsbChUWVBFX0FCU0VOVCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0cyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZXMsXG4gICAgICAgICAgICAgICAgICAgIGFzeW5jIHJlYWRWYWx1ZUJ5dGVzKCkgeyByZXR1cm4gRU1QVFlfQlVGRkVSOyB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb2xCYXNlID0gZGF0YUJhc2UgKyBjb2wub2Zmc2V0O1xuICAgICAgICAgICAgY29uc3QgaW5kZXhTaXplID0gNCAqIChyb3dDb3VudCArIDEpICsgcm93Q291bnQ7XG4gICAgICAgICAgICAvLyBPbmUgcmVhZCBwdWxscyBvZmZzZXRzICsgdHlwZXMgKHNtYWxsIOKAlCB+NSBCL3JvdykuIEJsb2NrIGNhY2hlIG1ha2VzIHN1YnNlcXVlbnQgdmFsdWUgcmVhZHMgb2YgbmVhcmJ5IHJvd3MgY2hlYXAuIERlY29kZWQgaW50byBhbGlnbmVkIHR5cGVkIGFycmF5cyBzbyB0aGUgZXhlY3V0b3IgY2FuIGRvIE8oMSkgbG9va3Vwcy5cbiAgICAgICAgICAgIGNvbnN0IGluZGV4QnVmID0gYXdhaXQgY29uZmlnLmdldFJhbmdlKGNvbEJhc2UsIGNvbEJhc2UgKyBpbmRleFNpemUpO1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShyb3dDb3VudCArIDEpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gcm93Q291bnQ7IGkrKykgb2Zmc2V0c1tpXSA9IGluZGV4QnVmLnJlYWRVSW50MzJMRSg0ICogaSk7XG4gICAgICAgICAgICBjb25zdCB0eXBlcyA9IG5ldyBVaW50OEFycmF5KHJvd0NvdW50KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykgdHlwZXNbaV0gPSBpbmRleEJ1Zls0ICogKHJvd0NvdW50ICsgMSkgKyBpXTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTdGFydCA9IGNvbEJhc2UgKyBpbmRleFNpemU7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9mZnNldHMsXG4gICAgICAgICAgICAgICAgdHlwZXMsXG4gICAgICAgICAgICAgICAgYXN5bmMgcmVhZFZhbHVlQnl0ZXMoc3RhcnRSb3csIGVuZFJvdykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW5kUm93IDw9IHN0YXJ0Um93KSByZXR1cm4gRU1QVFlfQlVGRkVSO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IG9mZnNldHNbc3RhcnRSb3ddO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBvZmZzZXRzW2VuZFJvd107XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiBFTVBUWV9CVUZGRVI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWcuZ2V0UmFuZ2UoZGF0YVN0YXJ0ICsgc3RhcnQsIGRhdGFTdGFydCArIGVuZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHJvd09mS2V5KGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGtleUluZGV4LmdldChrZXkpO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBnZXRTaW5nbGVGaWVsZChrZXksIGNvbHVtbikge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0ga2V5SW5kZXguZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocm93ID09PSB1bmRlZmluZWQpIHJldHVybiBBQlNFTlQ7XG4gICAgICAgICAgICBjb25zdCBjb2wgPSBjb2xCeU5hbWUuZ2V0KGNvbHVtbik7XG4gICAgICAgICAgICBpZiAoIWNvbCkgcmV0dXJuIEFCU0VOVDtcbiAgICAgICAgICAgIGNvbnN0IGNvbEJhc2UgPSBkYXRhQmFzZSArIGNvbC5vZmZzZXQ7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXRzQnVmID0gYXdhaXQgY29uZmlnLmdldFJhbmdlKGNvbEJhc2UgKyA0ICogcm93LCBjb2xCYXNlICsgNCAqIHJvdyArIDgpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBvZmZzZXRzQnVmLnJlYWRVSW50MzJMRSgwKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IG9mZnNldHNCdWYucmVhZFVJbnQzMkxFKDQpO1xuICAgICAgICAgICAgY29uc3QgdHlwZVBvcyA9IGNvbEJhc2UgKyA0ICogKHJvd0NvdW50ICsgMSkgKyByb3c7XG4gICAgICAgICAgICBjb25zdCB0eXBlQnVmID0gYXdhaXQgY29uZmlnLmdldFJhbmdlKHR5cGVQb3MsIHR5cGVQb3MgKyAxKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTdGFydCA9IGNvbEJhc2UgKyA0ICogKHJvd0NvdW50ICsgMSkgKyByb3dDb3VudDtcbiAgICAgICAgICAgIGxldCBieXRlcyA9IEVNUFRZX0JVRkZFUjtcbiAgICAgICAgICAgIGlmIChlbmQgPiBzdGFydCkge1xuICAgICAgICAgICAgICAgIGJ5dGVzID0gYXdhaXQgY29uZmlnLmdldFJhbmdlKGRhdGFTdGFydCArIHN0YXJ0LCBkYXRhU3RhcnQgKyBlbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkZWNvZGVWYWx1ZSh0eXBlQnVmWzBdLCBieXRlcyk7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IEFCU0VOVCkgcmV0dXJuIEFCU0VOVDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlLCB0aW1lOiB0aW1lc1tyb3ddIH07XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbiJdfQ==
482
+ /* _JS_SOURCE_HASH = "82d0251b3e9ac98a2fd4e094bc751484eaaa299661cd79409a35e50933b674e8"; */