footprintjs 9.48.2 → 9.48.4

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.
@@ -56,7 +56,7 @@
56
56
  * console.log(formatCausalChain(dag)); // human-readable
57
57
  * ```
58
58
  */
59
- import { findLastWriter } from './commitLogUtils.js';
59
+ import { buildCommitIndex, findLastWriter } from './commitLogUtils.js';
60
60
  import { queryWork, relation, writesOnlyInside } from './keyPaths.js';
61
61
  import { logModel } from './logModel.js';
62
62
  // ── Staged optimization: writer lookup strategies ──────────────────────
@@ -148,6 +148,17 @@ function incompleteSourcesFragment(commit) {
148
148
  * @returns Root CausalNode with .parents forming the DAG, or undefined if startId not found
149
149
  */
150
150
  export function causalChain(commitLog, startId, getKeysRead, options) {
151
+ return buildCausalChain(commitLog, startId, getKeysRead, options);
152
+ }
153
+ /**
154
+ * Internal slice composition: keep the actual bundle selected by the writer
155
+ * query (including a nonempty continuation). This is not a public entry point.
156
+ * The read position still belongs to the execution's first commit.
157
+ */
158
+ export function causalChainFromCommit(commitLog, writer, getKeysRead, options) {
159
+ return buildCausalChain(commitLog, writer.runtimeStageId, getKeysRead, options, writer);
160
+ }
161
+ function buildCausalChain(commitLog, startId, getKeysRead, options, selectedWriter) {
151
162
  const maxDepth = options?.maxDepth ?? 20;
152
163
  const maxNodes = options?.maxNodes ?? 100;
153
164
  const controlDeps = options?.controlDeps;
@@ -158,16 +169,15 @@ export function causalChain(commitLog, startId, getKeysRead, options) {
158
169
  // never mistake a truncated slice for a complete one.
159
170
  let truncatedByDepth = false;
160
171
  let truncatedByNodes = false;
161
- // Build position index: runtimeStageId → array position (O(n) once)
162
- const idxMap = new Map();
163
- for (let i = 0; i < commitLog.length; i++) {
164
- idxMap.set(commitLog[i].runtimeStageId, i);
165
- }
172
+ // A continuation may write more data, but it is not another execution of
173
+ // the stage's reads. Use the shared FIRST-commit rule for every read cutoff;
174
+ // keep writer bundles separately for their write metadata and read prefixes.
175
+ const idxMap = buildCommitIndex(commitLog);
166
176
  queryWork.units += commitLog.length;
167
177
  const startIdx = idxMap.get(startId);
168
178
  if (startIdx === undefined)
169
179
  return undefined;
170
- const startCommit = commitLog[startIdx];
180
+ const startCommit = selectedWriter ?? commitLog[startIdx];
171
181
  // Pick writer lookup strategy based on log size
172
182
  const findWriter = createWriterLookup(commitLog);
173
183
  // Node dedup map: runtimeStageId → CausalNode (ensures DAG, not tree)
@@ -454,4 +464,4 @@ export function formatCausalChain(root) {
454
464
  // ── Exported for testing (internal) ────────────────────────────────────
455
465
  /** @internal Exposed for testing the strategy selection. */
456
466
  export const _REVERSE_INDEX_THRESHOLD = REVERSE_INDEX_THRESHOLD;
457
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5REc7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWdNekMsMEVBQTBFO0FBRTFFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQVFwQyxrRUFBa0U7QUFDbEUsU0FBUyxnQkFBZ0IsQ0FBQyxTQUF5QjtJQUNqRCxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFNBQXlCO0lBQ25ELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxPQUFPLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQTRCLEVBQUU7UUFDbEUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUFvQixF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QztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVkLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksa0JBQWtCLENBQUM7YUFDeEcsTUFBTSxDQUFDLE9BQU8sQ0FBQzthQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsc0JBQXNCLE1BQU0sNENBQTRDLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCwwRUFBMEU7QUFFMUUsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBiYWNrdHJhY2sudHMg4oCUIEJhY2t3YXJkIGNhdXNhbCBjaGFpbiBhbmFseXNpcyBvbiB0aGUgY29tbWl0IGxvZy5cbiAqXG4gKiBJbXBsZW1lbnRzICoqYmFja3dhcmQgcHJvZ3JhbSBzbGljaW5nKiogKFdlaXNlciAxOTg0LCB0aGluLXNsaWNlIHZhcmlhbnQpOlxuICogZ2l2ZW4gYSBzdGFydGluZyBleGVjdXRpb24gc3RlcCwgd2FsayBiYWNrd2FyZHMgdGhyb3VnaCByZWFk4oaSd3JpdGVcbiAqIGRlcGVuZGVuY2llcyB0byBidWlsZCB0aGUgY2F1c2FsIERBRyB0aGF0IHByb2R1Y2VkIHRoZSBkYXRhIGF0IHRoYXQgc3RlcC5cbiAqXG4gKiAjIyBBbGdvcml0aG1cbiAqXG4gKiBCRlMgb24gdGhlIGltcGxpY2l0IGRlcGVuZGVuY3kgZ3JhcGggd2hlcmUgZWRnZXMgcnVuIGZyb20gcmVhZGVyIOKGkiB3cml0ZXIuXG4gKlxuICogMS4gTG9jYXRlIHN0YXJ0SWQgaW4gY29tbWl0TG9nIOKGkiByb290IG5vZGVcbiAqIDIuIEdldCBrZXlzUmVhZCBmb3Igcm9vdCB2aWEgYGdldEtleXNSZWFkYCBjYWxsYmFja1xuICogMy4gRm9yIGVhY2gga2V5IHJlYWQsIGZpbmQgd2hvIGxhc3Qgd3JvdGUgaXQgYmVmb3JlIHRoaXMgc3RlcCDihpIgcGFyZW50IGNvbW1pdFxuICogICAgKFwid3JvdGVcIiBpcyB0aGUgd3JpdGVyIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCwgOS4zMy4wOiBhIHJvdyBvbiB0aGUga2V5LCBpbnNpZGUgaXQsIG9yXG4gKiAgICBhcm91bmQgaXQgdGhhdCBjaGFuZ2VkIGl0IOKAlCBzbyBhIHN0YWdlIHRoYXQgcmVhZCBgY2ZnYCBsaW5rcyB0byB0aGUgc3ViZmxvdyBzZWVkIG9yXG4gKiAgICBtZXJnZS1iYWNrIHRoYXQgd3JvdGUgYGNmZ+KQn2JgKVxuICogNC4gQ3JlYXRlIHBhcmVudCBDYXVzYWxOb2RlLCBsaW5rIHRvIHJvb3QucGFyZW50c1xuICogNS4gRW5xdWV1ZSBwYXJlbnQuIFJlcGVhdCB1bnRpbCBxdWV1ZSBlbXB0eSBvciBsaW1pdHMgaGl0LlxuICpcbiAqIE91dHB1dCBpcyBhICoqREFHKiogKG5vdCBhIGxpbmtlZCBsaXN0KTogYSBzdGFnZSByZWFkaW5nIGBjcmVkaXRTY29yZWAgQU5EIGBkdGlgXG4gKiBmcm9tIGRpZmZlcmVudCB3cml0ZXJzIGhhcyB0d28gcGFyZW50cy5cbiAqXG4gKiAjIyBTdGFnZWQgT3B0aW1pemF0aW9uXG4gKlxuICogVHdvIHdyaXRlci1sb29rdXAgc3RyYXRlZ2llcywgY2hvc2VuIGF1dG9tYXRpY2FsbHkgYnkgY29tbWl0IGxvZyBzaXplOlxuICpcbiAqIHwgU3RyYXRlZ3kgfCBXaGVuIHwgQ29tcGxleGl0eSBwZXIgbG9va3VwIHxcbiAqIHwtLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCBMaW5lYXIgc2NhbiB8IE4g4omkIDI1NiB8IE8oTikg4oCUIHNpbXBsZSBiYWNrd2FyZCBzY2FuIHxcbiAqIHwgUmV2ZXJzZSBpbmRleCB8IE4gPiAyNTYgfCBPKEsgbG9nIE4pIOKAlCBwcmVidWlsdCBrZXnihpJbaW5kaWNlc10sIGJpbmFyeSBzZWFyY2ggfFxuICpcbiAqIFRoZSB0aHJlc2hvbGQgKDI1NikgaXMgY2hvc2VuIHNvIHRoZSBPKE4pIGJ1aWxkIGNvc3Qgb2YgdGhlIHJldmVyc2UgaW5kZXhcbiAqIGlzIGFtb3J0aXplZCBvdmVyIHRoZSBCRlMgdHJhdmVyc2FsLiBCZWxvdyAyNTYsIGxpbmVhciBzY2FuIHdpbnMgYmVjYXVzZVxuICogdGhlcmUncyBubyBpbmRleCBidWlsZCBvdmVyaGVhZC4gVGhlIGNvbnN1bWVyIG5ldmVyIHNlZXMgdGhpcyDigJQgYGNhdXNhbENoYWluKClgXG4gKiBwaWNrcyB0aGUgcmlnaHQgc3RyYXRlZ3kgaW50ZXJuYWxseSAobGlrZSBhIHF1ZXJ5IG9wdGltaXplciBjaG9vc2luZyBiZXR3ZWVuXG4gKiBzZXF1ZW50aWFsIHNjYW4gdnMgaW5kZXggc2NhbiBiYXNlZCBvbiB0YWJsZSBzaXplKS5cbiAqXG4gKiAjIyBDb21wbGV4aXR5XG4gKlxuICogLSAqKlNtYWxsIGxvZ3MgKE4g4omkIDI1Nik6KiogTyhWIMOXIEsgw5cgTikgdG90YWwuIFY9dmlzaXRlZCwgSz1hdmcga2V5cy9ub2RlLlxuICogLSAqKkxhcmdlIGxvZ3MgKE4gPiAyNTYpOioqIE8oTiDDlyBVKSBpbmRleCBidWlsZCArIE8oViDDlyBLIMOXIGxvZyBOKSBsb29rdXBzLlxuICogICBVID0gdW5pcXVlIGtleXMuIEFtb3J0aXplZCBvdmVyIGFsbCBCRlMgaG9wcy5cbiAqXG4gKiAjIyBSZWZlcmVuY2VzXG4gKlxuICogLSBXZWlzZXIsIE0uICgxOTg0KS4gXCJQcm9ncmFtIFNsaWNpbmcuXCIgSUVFRSBUU0UuXG4gKiAtIFNyaWRoYXJhbiwgTS4gZXQgYWwuICgyMDA3KS4gXCJUaGluIFNsaWNpbmcuXCIgUExESS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgY2F1c2FsQ2hhaW4sIGZsYXR0ZW5DYXVzYWxEQUcsIGZvcm1hdENhdXNhbENoYWluIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICpcbiAqIGNvbnN0IGRhZyA9IGNhdXNhbENoYWluKGNvbW1pdExvZywgJ2RlY2lkZSMyJywgKGlkKSA9PiByZWNvcmRlci5nZXRLZXlzUmVhZChpZCkpO1xuICogY29uc3QgZmxhdCA9IGZsYXR0ZW5DYXVzYWxEQUcoZGFnKTsgICAgIC8vIEJGUy1vcmRlcmVkIGZsYXQgbGlzdFxuICogY29uc29sZS5sb2coZm9ybWF0Q2F1c2FsQ2hhaW4oZGFnKSk7ICAgICAvLyBodW1hbi1yZWFkYWJsZVxuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgZmluZExhc3RXcml0ZXIgfSBmcm9tICcuL2NvbW1pdExvZ1V0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVnaXN0ZXJlZENvZGUgfSBmcm9tICcuL2hvbmVzdHkuanMnO1xuaW1wb3J0IHsgcXVlcnlXb3JrLCByZWxhdGlvbiwgd3JpdGVzT25seUluc2lkZSB9IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgbG9nTW9kZWwgfSBmcm9tICcuL2xvZ01vZGVsLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBUcmFjZUVudHJ5LCBVbnRyYWNrZWRTb3VyY2UgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQSBzaW5nbGUgbm9kZSBpbiB0aGUgY2F1c2FsIERBRy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2FsTm9kZSB7XG4gIC8qKiBVbmlxdWUgZXhlY3V0aW9uIHN0ZXAgaWRlbnRpZmllci4gKi9cbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyLiAqL1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBzdGFnZSBuYW1lLiAqL1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgLyoqIEtleXMgdGhpcyBzdGFnZSB3cm90ZSAoZnJvbSBpdHMgQ29tbWl0QnVuZGxlLnRyYWNlKS4gKi9cbiAga2V5c1dyaXR0ZW46IHN0cmluZ1tdO1xuICAvKiogVGhlIGtleSB3aG9zZSByZWFk4oaSd3JpdGUgZGVwZW5kZW5jeSBsaW5rZWQgdGhpcyBub2RlIHRvIGl0cyBjaGlsZC4gRW1wdHkgZm9yIHRoZSByb290LiAqL1xuICBsaW5rZWRCeTogc3RyaW5nO1xuICAvKiogQkZTIGRlcHRoIGZyb20gdGhlIHN0YXJ0aW5nIG5vZGUgKDAgPSBzdGFydCkuICovXG4gIGRlcHRoOiBudW1iZXI7XG4gIC8qKlxuICAgKiBQYXJlbnQgbm9kZXMg4oCUIHN0YWdlcyB0aGlzIG5vZGUgZGVwZW5kcyBvbi4gREFHOiBtdWx0aXBsZSBwYXJlbnRzXG4gICAqIHBvc3NpYmxlLiBLRVBUIGZvciBjb21wYXRpYmlsaXR5OyB3aXRoIHRoZSBgY29udHJvbERlcHNgIG9wdGlvblxuICAgKiAoUkZDLTAwMyBEMykgZ292ZXJuaW5nIGRlY2lkZXJzIGFwcGVhciBoZXJlIHRvby4gRm9yIHR5cGVkL2tleWVkL1xuICAgKiB3ZWlnaHRlZCBkZXRhaWwgdXNlIHtAbGluayBwYXJlbnRFZGdlc30uXG4gICAqL1xuICBwYXJlbnRzOiBDYXVzYWxOb2RlW107XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQzIOKAlCBvbmUgZWRnZSBwZXIgZGVwZW5kZW5jeSBMSU5LIChub3QgcGVyIHBhcmVudCk6IGEgbm9kZVxuICAgKiByZWFkaW5nIHR3byBrZXlzIGZyb20gdGhlIHNhbWUgd3JpdGVyIGhhcyBPTkUgZW50cnkgaW4ge0BsaW5rIHBhcmVudHN9XG4gICAqIGJ1dCBUV08gYCdkYXRhJ2AgZWRnZXMgaGVyZS4gQ29udHJvbCBkZXBlbmRlbmNpZXMgKHZpYSB0aGVcbiAgICogYGNvbnRyb2xEZXBzYCBvcHRpb24pIGFkZCBhIGAnY29udHJvbCdgIGVkZ2UgdG8gdGhlIGdvdmVybmluZyBkZWNpZGVyLlxuICAgKi9cbiAgcGFyZW50RWRnZXM6IENhdXNhbEVkZ2VbXTtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDIgaG9uZXN0eSBtYXJrZXIg4oCUIHN0YW1wZWQgZnJvbSB0aGUgc3RhZ2Unc1xuICAgKiBgQ29tbWl0QnVuZGxlLnVudHJhY2tlZFNvdXJjZXNgLiBQcmVzZW50IHdoZW4gdGhpcyBzdGFnZSBBTFNPIGNvbnN1bWVkXG4gICAqIHVudHJhY2tlZCByZWFkIHBhdGhzIChgYXJnc2AgLyBgZW52YCAvIHVuc2hhZG93ZWQgYHNpbGVudGAgcmVhZHMpOiB0aGVcbiAgICogYmFja3dhcmQgc2xpY2UgdGhyb3VnaCB0aGlzIG5vZGUgbWF5IGJlIGluY29tcGxldGUsIGJlY2F1c2UgdGhvc2UgcmVhZHNcbiAgICogcHJvZHVjZSBubyByZWFk4oaSd3JpdGUgZWRnZSB0byBmb2xsb3cuIGBmb3JtYXRDYXVzYWxDaGFpbmAgcmVuZGVycyB0aGlzXG4gICAqIGFzIGEgYOKaoCDigKYgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAgbGluZS4gQWJzZW50IHdoZW4gdGhlIHN0YWdlJ3NcbiAgICogcmVhZHMgd2VyZSBmdWxseSB0cmFja2VkLlxuICAgKlxuICAgKiBSZWdpc3RyeSBjb2RlOiBgJ2luY29tcGxldGUtc291cmNlcydgIChgbWVtb3J5L2hvbmVzdHkudHMgwrdcbiAgICogSE9ORVNUWV9DT0RFU2AsIHNlcnZlZCBvbiBgZm9vdHByaW50anMvdHJhY2VgKSBzYXlzIHdoYXQgdGhpcyBmaWVsZFxuICAgKiBtZWFucy4gVGhlIGZpZWxkIGNhcnJpZXMgbm8gYGNvZGVgIOKAlCBpdHMgdmFsdWVzIGFyZSB0aGVcbiAgICoge0BsaW5rIFVudHJhY2tlZFNvdXJjZX1zLlxuICAgKi9cbiAgaW5jb21wbGV0ZVNvdXJjZXM/OiBSZWFkb25seUFycmF5PFVudHJhY2tlZFNvdXJjZT47XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQ0IHRydW5jYXRpb24gdmlzaWJpbGl0eSDigJQgc2V0IG9uIHRoZSBST09UIG5vZGUgb25seSwgYW5kIG9ubHlcbiAgICogd2hlbiBhIGxpbWl0IGFjdHVhbGx5IGN1dCB0aGUgc2xpY2U6IGBieURlcHRoYCB3aGVuIGEgbm9kZSBhdCB0aGVcbiAgICogYG1heERlcHRoYCBob3Jpem9uIHN0aWxsIGhhZCBlZGdlcyB0byBleHBhbmQsIGBieU5vZGVzYCB3aGVuIHRoZVxuICAgKiBgbWF4Tm9kZXNgIGJ1ZGdldCBibG9ja2VkIGNyZWF0aW5nIGEgZGlzY292ZXJlZCBwYXJlbnQuIEFic2VudCB3aGVuIHRoZVxuICAgKiBzbGljZSBpcyBjb21wbGV0ZS4gYGZvcm1hdENhdXNhbENoYWluYCBhcHBlbmRzIGEgYOKaoCBzbGljZSB0cnVuY2F0ZWQg4oCmYFxuICAgKiBsaW5lIOKAlCBhIGNvbnN1bWVyIG11c3QgbmV2ZXIgbWlzdGFrZSBhIHRydW5jYXRlZCBzbGljZSBmb3IgYSBmdWxsIG9uZS5cbiAgICogKFVudGlsIDkuNDguMCBkZXYgbW9kZSBhbHNvIHdhcm5lZCBvbiB0aGUgY29uc29sZTsgdGhlIGZpZWxkIGlzIHRoZVxuICAgKiBzaWduYWwsIHJlYWQgaXQuKVxuICAgKlxuICAgKiBSZWdpc3RyeSBjb2RlOiBgJ3RydW5jYXRlZCdgIChgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AsIHNlcnZlZFxuICAgKiBvbiBgZm9vdHByaW50anMvdHJhY2VgKSBzYXlzIHdoYXQgdGhpcyBmaWVsZCBtZWFuczsgdGhlIGZpZWxkIGNhcnJpZXMgbm9cbiAgICogYGNvZGVgLlxuICAgKi9cbiAgdHJ1bmNhdGVkPzogeyBieURlcHRoOiBib29sZWFuOyBieU5vZGVzOiBib29sZWFuIH07XG4gIC8qKlxuICAgKiBGNGIgKDkuMzMuMCkg4oCUIHRoZSBrZXlzIHRoaXMgbm9kZSByZWFkIHRoYXQgTk8gY29tbWl0IGJlZm9yZSBpdCB3cm90ZSAodW5kZXIgdGhlIHdyaXRlciBydWxlKSwgc28gdGhlXG4gICAqIHdhbGsgaGFzIG5vIGVkZ2UgdG8gZm9sbG93IGZvciB0aGVtOiB0aGVpciB2YWx1ZSBjYW1lIGZyb20gdGhlIGluaXRpYWwgc3RhdGUsIGZyb3plbiBydW4gaW5wdXQgb3IgYVxuICAgKiBjbG9zdXJlIOKAlCBvdXRzaWRlIHRoZSBjb21taXQgbG9nLiBUaGUgY29kZSBzYXlzIHNvIChgJ3ByZS1ydW4tb3JpZ2luJ2AsIHJlZ2lzdGVyZWQgaW5cbiAgICogYG1lbW9yeS9ob25lc3R5LnRzIMK3IEhPTkVTVFlfQ09ERVNgKTsgYGtleXNgIGFyZSBpbiB0aGUgb3JkZXIgdGhlIHdhbGsgbWV0IHRoZW0uIEFCU0VOVCB3aGVuIGV2ZXJ5IGtleVxuICAgKiB0aGUgbm9kZSBleHBhbmRlZCBoYWQgYSB3cml0ZXIsIHNvIHN1Y2ggYSBub2RlIGtlZXBzIGl0cyA5LjMyLjAgc2hhcGUuIEJlZm9yZSA5LjMzLjAgdGhlc2UgcmVhZHMgd2VyZVxuICAgKiBkcm9wcGVkIHdpdGhvdXQgYSB3b3JkLlxuICAgKi9cbiAgcHJlUnVuUmVhZHM/OiB7IGNvZGU6IFJlZ2lzdGVyZWRDb2RlPCdwcmUtcnVuLW9yaWdpbic+OyBrZXlzOiBzdHJpbmdbXSB9O1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgdHlwZWQgZGVwZW5kZW5jeSBlZGdlIGZyb20gYSBjaGlsZCBub2RlIHRvIG9uZSBwYXJlbnQuXG4gKlxuICogLSBga2luZDogJ2RhdGEnYCAgICDigJQgcmVhZOKGkndyaXRlIGRlcGVuZGVuY3k7IGBrZXlgIGlzIHRoZSBzdGF0ZSBrZXkuXG4gKiAtIGBraW5kOiAnY29udHJvbCdgIOKAlCB0aGUgcGFyZW50IGlzIHRoZSBkZWNpZGVyL3NlbGVjdG9yIHdob3NlIGRlY2lzaW9uXG4gKiAgIGFsbG93ZWQgdGhlIGNoaWxkIHRvIHJ1bjsgYGtleWAgaXMgdGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgd2hlbiBwcmVzZW50LlxuICpcbiAqIGB3ZWlnaHRgIGRlZmF1bHRzIHRvIDEuMDsgdGhlIGB3ZWlnaGAgaG9vayAoUkZDLTAwMyBENCkgY2FuIG92ZXJyaWRlIGl0LlxuICogVGhlIGVuZ2luZSBpdHNlbGYgTkVWRVIgY29tcHV0ZXMgd2VpZ2h0cyDigJQgc2VtYW50aWNzIGJlbG9uZyB0byB0aGVcbiAqIGNvbnN1bWVyLWluamVjdGVkIHdlaWdoZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2FsRWRnZSB7XG4gIHBhcmVudDogQ2F1c2FsTm9kZTtcbiAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnO1xuICBrZXk/OiBzdHJpbmc7XG4gIHdlaWdodDogbnVtYmVyO1xuICAvKipcbiAgICogRjRiICg5LjMzLjApIOKAlCBwcmVzZW50IG9ubHkgb24gYSBgJ2RhdGEnYCBlZGdlIHdob3NlIHBhcmVudCB3cm90ZSBga2V5YCBPTkxZIHRocm91Z2ggcm93cyBpbnNpZGUgaXRcbiAgICogKGEgc3ViZmxvdydzIGlucHV0IHNlZWQsIGFuIG91dHB1dE1hcHBlciBtZXJnZS1iYWNrLCBhIGZvcmsgY2hpbGQncyBuYW1lc3BhY2UpOiB0aGF0IHdyaXRlIG1hZGUgcGFydFxuICAgKiBvZiB0aGUgdmFsdWUsIGFuZCBlYXJsaWVyIHdyaXRlcnMgbWF5IGFjY291bnQgZm9yIHRoZSByZXN0LiBSZWdpc3RlcmVkIGFzIGAnbmVzdGVkLXJvd3MnYCBpblxuICAgKiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AuIEFic2VudCBmb3IgYSB3cml0ZSBvbiBvciBhcm91bmQgdGhlIGtleSwgc28gYW4gZXhhY3QgZWRnZSBrZWVwc1xuICAgKiBpdHMgOS4zMi4wIHNoYXBlLlxuICAgKi9cbiAgYmFzaXM/OiBSZWdpc3RlcmVkQ29kZTwnbmVzdGVkLXJvd3MnPjtcbn1cblxuLyoqXG4gKiBSRkMtMDAzIEQzIOKAlCBhIGNvbnRyb2wgZGVwZW5kZW5jeSByZXNvbHZlZCBmb3Igb25lIGV4ZWN1dGlvbiBzdGVwOlxuICogd2hpY2ggZGVjaWRlci9zZWxlY3RvciBleGVjdXRpb24gYWxsb3dlZCB0aGlzIHN0YWdlIHRvIHJ1bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVwZW5kZW5jeSB7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCBvZiB0aGUgZ292ZXJuaW5nIGRlY2lkZXIvc2VsZWN0b3IgZXhlY3V0aW9uIHN0ZXAuICovXG4gIGRlY2lkZXJJZDogc3RyaW5nO1xuICAvKiogVGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgZm9yIHRoZSBjaG9zZW4gYnJhbmNoLCB3aGVuIHByZXNlbnQuICovXG4gIGxhYmVsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGNhbGxiYWNrIHJlc29sdmluZyB0aGUgZ292ZXJuaW5nIGRlY2lkZXIgZm9yIGFuIGV4ZWN1dGlvblxuICogc3RlcC4gUmV0dXJuIGB1bmRlZmluZWRgIHdoZW4gdGhlIHN0ZXAgaXMgbm90IGNvbnRyb2wtZGVwZW5kZW50IG9uIGFueVxuICogcmVjb3JkZWQgZGVjaXNpb24uIEJ1aWxkIG9uZSB3aXRoIGBjb250cm9sRGVwUmVjb3JkZXIoKWAgZnJvbVxuICogYGZvb3RwcmludGpzL3RyYWNlYCwgb3Igc3VwcGx5IHlvdXIgb3duLlxuICovXG5leHBvcnQgdHlwZSBDb250cm9sRGVwTG9va3VwID0gKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpID0+IENvbnRyb2xEZXBlbmRlbmN5IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJGQy0wMDMgRDQg4oCUIGNvbnN1bWVyLWluamVjdGVkIGVkZ2Ugd2VpZ2hlci4gQ2FsbGVkIG9uY2UgcGVyIGNyZWF0ZWRcbiAqIGVkZ2U7IHJldHVybiBhIHdlaWdodCwgb3IgYHVuZGVmaW5lZGAgdG8ga2VlcCB0aGUgZGVmYXVsdCAxLjAuIFRoZVxuICogRU5HSU5FIG5ldmVyIGNvbXB1dGVzIHdlaWdodHMgKHplcm8gbmV3IGRlcGVuZGVuY2llcyDigJQgc2VtYW50aWNzIGxpa2VcbiAqIGVtYmVkZGluZyBzaW1pbGFyaXR5IG9yIEZETCBpbmZsdWVuY2UgYmVsb25nIHRvIGRvd25zdHJlYW0gbGlicmFyaWVzLFxuICogdGhlIHNhbWUgcGx1Zy1pbiBwYXR0ZXJuIGFzIGBOYXJyYXRpdmVGb3JtYXR0ZXJgKS4gV2VpZ2h0cyByZW5kZXIgaW5cbiAqIGBmb3JtYXRDYXVzYWxDaGFpbmAgYXMgYOKGkCB2aWEgc3lzdGVtUHJvbXB0ICgwLjE4KWAuXG4gKi9cbmV4cG9ydCB0eXBlIEVkZ2VXZWlnaGVyID0gKFxuICBjaGlsZDogQ2F1c2FsTm9kZSxcbiAgcGFyZW50OiBDYXVzYWxOb2RlLFxuICBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnLFxuKSA9PiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbi8qKiBPcHRpb25zIGZvciBjYXVzYWxDaGFpbigpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxDaGFpbk9wdGlvbnMge1xuICAvKiogTWF4aW11bSBCRlMgZGVwdGggKGRlZmF1bHQ6IDIwKS4gUHJldmVudHMgcnVuYXdheSB0cmF2ZXJzYWwuICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSB0b3RhbCBub2RlcyB0byB2aXNpdCAoZGVmYXVsdDogMTAwKS4gSGFyZCBjYXAgZm9yIHNhZmV0eS4gKi9cbiAgbWF4Tm9kZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQzIOKAlCBjb250cm9sLWRlcGVuZGVuY2UgbG9va3VwLiBXaGVuIHByb3ZpZGVkLCBleHBhbmRpbmcgYSBub2RlXG4gICAqIEFMU08gbGlua3MgYSBgJ2NvbnRyb2wnYCBlZGdlIHRvIGl0cyBnb3Zlcm5pbmcgZGVjaWRlciAobGFiZWxlZCBieSB0aGVcbiAgICogZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQpOyB0aGUgZGVjaWRlciBub2RlIHRoZW4gZXhwYW5kc1xuICAgKiBub3JtYWxseSB0aHJvdWdoIGl0cyBvd24gZGF0YSByZWFkcywgc28gY2hhaW5zIGxpa2VcbiAgICogYHN0YXR1cyDihpAgW2NvbnRyb2xdIENsYXNzaWZ5UmlzayDihpAgW2RhdGE6IGNyZWRpdFNjb3JlXSBQdWxsQnVyZWF1YFxuICAgKiByZXNvbHZlIGVuZC10by1lbmQuIFdpdGhvdXQgdGhpcyBvcHRpb24gYmVoYXZpb3IgaXMgdW5jaGFuZ2VkLlxuICAgKi9cbiAgY29udHJvbERlcHM/OiBDb250cm9sRGVwTG9va3VwO1xuICAvKipcbiAgICogUkZDLTAwMyBENCDigJQgZWRnZSB3ZWlnaGVyLiBTdGFtcHMgYENhdXNhbEVkZ2Uud2VpZ2h0YCBhdCBlZGdlIGNyZWF0aW9uO1xuICAgKiBgdW5kZWZpbmVkYCAob3Igbm8gd2VpZ2hlcikg4oaSIDEuMC4gU2VlIHtAbGluayBFZGdlV2VpZ2hlcn0uXG4gICAqL1xuICB3ZWlnaD86IEVkZ2VXZWlnaGVyO1xuICAvKipcbiAgICogI1AxIOKAlCBob3cgYSBub2RlJ3MgZXhwYW5zaW9uIHJlYWQtc2V0IGlzIGRlcml2ZWQ6XG4gICAqXG4gICAqIC0gYCdzdGFnZSdgIChkZWZhdWx0LCBoaXN0b3JpY2FsKSDigJQgZXZlcnkgdmlzaXRlZCBub2RlIGV4cGFuZHMgdGhyb3VnaFxuICAgKiAgIEFMTCBvZiBpdHMgc3RhZ2UncyByZWFkcyAoYGdldEtleXNSZWFkYCkuIEEgc3RhZ2UgcmVhZGluZyBgYSxiYCBhbmRcbiAgICogICB3cml0aW5nIGB4LHlgIGxpbmtzIGJvdGggcmVhZHMgYXMgY2F1c2VzIG9mIGJvdGggd3JpdGVzIOKAlCBhIHNvdW5kIGJ1dFxuICAgKiAgIGNvYXJzZSBvdmVyLWFwcHJveGltYXRpb24uXG4gICAqIC0gYCdwZXItd3JpdGUnYCDigJQgd2hlbiB0aGUgY29tbWl0IGxvZyBjYXJyaWVzIHBlci13cml0ZSByZWFkIHByb3ZlbmFuY2VcbiAgICogICAoYFRyYWNlRW50cnkucmVhZEtleXNgLCByZWNvcmRlZCB1bmRlciB0aGUgZXhlY3V0b3Inc1xuICAgKiAgIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsKSwgYSBub2RlIHJlYWNoZWQgdmlhIGtleSBga2BcbiAgICogICBleHBhbmRzIHRocm91Z2ggT05MWSB0aGUgcmVhZHMgdGhhdCBwcmVjZWRlZCBpdHMgd3JpdGUgb2YgYGtgXG4gICAqICAgKHRlbXBvcmFsIHByZWZpeCkuIE5vZGVzIGxpbmtlZCBsYXRlciB2aWEgYWRkaXRpb25hbCBrZXlzIGFyZVxuICAgKiAgIGluY3JlbWVudGFsbHkgcmUtZXhwYW5kZWQgd2l0aCBqdXN0IHRoZSBuZXcgcmVhZHMgKHdvcmtsaXN0IOKAlCB0aGVcbiAgICogICBzbGljZSBvbmx5IGV2ZXIgR1JPV1MgdG93YXJkIHRoZSBzdGFnZS1sZXZlbCBjZWlsaW5nKS4gSE9ORVNUXG4gICAqICAgRkFMTEJBQ0s6IGFueSBsaW5rIHdob3NlIHRyYWNlIGVudHJ5IGxhY2tzIGByZWFkS2V5c2AgZXhwYW5kcyB0aGF0XG4gICAqICAgbm9kZSBhdCBzdGFnZSBsZXZlbCDigJQgbWl4ZWQgb3IgZGlhbC1vZmYgbG9ncyBkZWdyYWRlIHRvIGAnc3RhZ2UnYFxuICAgKiAgIGJlaGF2aW9yIGV4YWN0bHksIG5ldmVyIHRvIHNpbGVuY2UuXG4gICAqL1xuICBlZGdlQXR0cmlidXRpb24/OiAnc3RhZ2UnIHwgJ3Blci13cml0ZSc7XG4gIC8qKlxuICAgKiAjUDEg4oCUIHRoZSB3cml0dGVuIGtleXMgdGhhdCBhbmNob3IgdGhlIFJPT1QncyBleHBhbnNpb24gdW5kZXJcbiAgICogYCdwZXItd3JpdGUnYCAoZS5nLiBgc2xpY2VGb3JLZXlgIHBhc3NlcyB0aGUgc2xpY2VkIGtleSwgc28gdGhlIHJvb3RcbiAgICogZXhwYW5kcyB0aHJvdWdoIHRoZSByZWFkcyB0aGF0IGZlZCBUSEFUIHdyaXRlLCBub3QgdGhlIHdob2xlIHN0YWdlKS5cbiAgICogSWdub3JlZCB1bmRlciBgJ3N0YWdlJ2AuIFVuc2V0IOKGkiByb290IGV4cGFuZHMgYXQgc3RhZ2UgbGV2ZWwuXG4gICAqL1xuICByb290TGlua0tleXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDYWxsYmFjayB0aGF0IHJldHVybnMgdGhlIGtleXMgYSBzdGFnZSByZWFkIGR1cmluZyBleGVjdXRpb24uXG4gKiBUaGUgYmFja3RyYWNrZXIgY2FsbHMgdGhpcyBmb3IgZWFjaCB2aXNpdGVkIG5vZGUgdG8gZGV0ZXJtaW5lXG4gKiB3aGljaCByZWFk4oaSd3JpdGUgZWRnZXMgdG8gZm9sbG93LlxuICpcbiAqIEltcGxlbWVudG9yczogUXVhbGl0eVJlY29yZGVyIHRyYWNrcyBrZXlzUmVhZCBwZXIgc3RlcCxcbiAqIG9yIGJ1aWxkIGEgTWFwPHJ1bnRpbWVTdGFnZUlkLCBzdHJpbmdbXT4gZnJvbSBTY29wZVJlY29yZGVyLm9uUmVhZCBldmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIEtleXNSZWFkTG9va3VwID0gKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpID0+IHN0cmluZ1tdO1xuXG4vLyDilIDilIAgU3RhZ2VkIG9wdGltaXphdGlvbjogd3JpdGVyIGxvb2t1cCBzdHJhdGVnaWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFRocmVzaG9sZCBmb3Igc3dpdGNoaW5nIGZyb20gbGluZWFyIHNjYW4gdG8gcmV2ZXJzZSBpbmRleC5cbiAqIEJlbG93IHRoaXMsIE8oTikgc2NhbiBpcyBmYXN0ZXIgKG5vIGluZGV4IGJ1aWxkIGNvc3QpLlxuICogQWJvdmUgdGhpcywgTyhsb2cgTikgYmluYXJ5IHNlYXJjaCB3aW5zLlxuICovXG5jb25zdCBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRCA9IDI1NjtcblxuLyoqXG4gKiBXcml0ZXIgbG9va3VwIGZ1bmN0aW9uIHNpZ25hdHVyZS5cbiAqIFJldHVybnMgdGhlIENvbW1pdEJ1bmRsZSB0aGF0IGxhc3Qgd3JvdGUgYGtleWAgYmVmb3JlIHBvc2l0aW9uIGBiZWZvcmVJZHhgLlxuICovXG50eXBlIFdyaXRlckxvb2t1cCA9IChrZXk6IHN0cmluZywgYmVmb3JlSWR4OiBudW1iZXIpID0+IENvbW1pdEJ1bmRsZSB8IHVuZGVmaW5lZDtcblxuLyoqIFN0cmF0ZWd5IDE6IExpbmVhciBzY2FuIOKAlCBPKE4pIHBlciBsb29rdXAsIHplcm8gc2V0dXAgY29zdC4gKi9cbmZ1bmN0aW9uIGxpbmVhclNjYW5Mb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIHJldHVybiAoa2V5LCBiZWZvcmVJZHgpID0+IGZpbmRMYXN0V3JpdGVyKGNvbW1pdExvZywga2V5LCBiZWZvcmVJZHgpO1xufVxuXG4vKipcbiAqIFN0cmF0ZWd5IDI6IFJldmVyc2UgaW5kZXgg4oCUIG9uZSBPKHJvd3MpIGJ1aWxkLCBPKGRlcHRoICsgbG9nIE4pIHBlciBsb29rdXAuXG4gKiBUaGUgbG9nJ3MgcmVhZCBtb2RlbCAoYGxvZ01vZGVsLnRzYDogYSBwYXRoIHRyaWUsIGVhY2ggdG9wLWxldmVsIGtleSBmb2xkZWQgYXRcbiAqIG1vc3Qgb25jZSkgYW5zd2VycyB0aGUgd3JpdGVyIHJ1bGUg4oCUIHJvd3Mgb24sIGluc2lkZSBvciBhcm91bmQgdGhlIGtleSDigJQgYnlcbiAqIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBsYXN0IHdyaXRlIG9uIG9yIGluc2lkZSBpdCwgdGhlbiBhIHZlcmRpY3Qgb25seSBmb3IgdGhlXG4gKiBhcm91bmQtY2FuZGlkYXRlcyBhZnRlciBpdC4gVGhlIHNhbWUgYW5zd2VyIGBmaW5kTGFzdFdyaXRlcmAgZ2l2ZXMsIHNvIHRoZVxuICogc3RyYXRlZ3kgc3dpdGNoIGJlbG93IG5ldmVyIGNoYW5nZXMgYSBzbGljZS5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZUluZGV4TG9va3VwKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10pOiBXcml0ZXJMb29rdXAge1xuICBjb25zdCBtb2RlbCA9IGxvZ01vZGVsKGNvbW1pdExvZyk7XG4gIHJldHVybiAoa2V5OiBzdHJpbmcsIGJlZm9yZUlkeDogbnVtYmVyKTogQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBhdCA9IG1vZGVsLmxhc3RXcml0ZXJCZWZvcmUoa2V5LCBiZWZvcmVJZHgpO1xuICAgIHJldHVybiBhdCA+PSAwID8gY29tbWl0TG9nW2F0XSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2UgZW50cmllcyBvZiBgY29tbWl0YCB0aGF0IG1ha2UgaXQgYSB3cml0ZXIgb2YgYGxpbmtLZXlgIOKAlCB0aGUgZW50cmllcyB3aG9zZSByZWFkXG4gKiBwcmVmaXggKGBUcmFjZUVudHJ5LnJlYWRLZXlzYCkgYSBwZXItd3JpdGUgZWRnZSBleHBhbmRzIHRocm91Z2guIFRoZSBGSVJTVCBlbnRyeSBvbiB0aGUgZXhhY3RcbiAqIHBhdGggd2hlbiB0aGVyZSBpcyBvbmUgKHRoZSAjUDEgYmVoYXZpb3VyLCB1bmNoYW5nZWQpOyBvdGhlcndpc2UgZXZlcnkgZW50cnkgaW5zaWRlIG9yIGFyb3VuZFxuICogdGhlIGtleSAoOS4zMy4wOiB0aGUgY29tbWl0IHdyb3RlIHRoZSBrZXkgdGhyb3VnaCBhIG5lc3RlZCByb3cg4oCUIGEgc3ViZmxvdyBzZWVkLCBhblxuICogb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2sg4oCUIGFuZCBhbGwgb2YgdGhvc2Ugcm93cyB3cm90ZSBpdCkuXG4gKi9cbmZ1bmN0aW9uIGxpbmtpbmdFbnRyaWVzKGNvbW1pdDogQ29tbWl0QnVuZGxlLCBsaW5rS2V5OiBzdHJpbmcpOiBUcmFjZUVudHJ5W10ge1xuICBjb25zdCBleGFjdCA9IGNvbW1pdC50cmFjZS5maW5kKCh0KSA9PiB0LnBhdGggPT09IGxpbmtLZXkpO1xuICBpZiAoZXhhY3QgIT09IHVuZGVmaW5lZCkgcmV0dXJuIFtleGFjdF07XG4gIHJldHVybiBjb21taXQudHJhY2UuZmlsdGVyKCh0KSA9PiByZWxhdGlvbih0LnBhdGgsIGxpbmtLZXkpICE9PSB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIFN0YWdlZCBvcHRpbWl6YXRpb246IHBpY2sgdGhlIHJpZ2h0IHdyaXRlci1sb29rdXAgc3RyYXRlZ3kgYmFzZWQgb24gZGF0YSBzaXplLlxuICpcbiAqIExpa2UgYSBkYXRhYmFzZSBxdWVyeSBvcHRpbWl6ZXIgY2hvb3NpbmcgYmV0d2VlbiBzZXF1ZW50aWFsIHNjYW4gYW5kIGluZGV4IHNjYW46XG4gKlxuICogLSAqKlNtYWxsIGxvZyAo4omkIDI1Nik6KiogTGluZWFyIHNjYW4gd2lucy4gWmVybyBzZXR1cCBjb3N0LCBnb29kIGNhY2hlIGxvY2FsaXR5LlxuICogICBUaGUgb3ZlcmhlYWQgb2YgYnVpbGRpbmcgYSByZXZlcnNlIGluZGV4IGlzbid0IHdvcnRoIGl0IGZvciBzaG9ydCBsb2dzLlxuICpcbiAqIC0gKipMYXJnZSBsb2cgKD4gMjU2KToqKiBSZXZlcnNlIGluZGV4IHdpbnMuIE8oTsOXVSkgdXBmcm9udCBidWlsZCBjb3N0IGlzIGFtb3J0aXplZFxuICogICBhY3Jvc3MgYWxsIEJGUyBob3BzLiBFYWNoIGxvb2t1cCBiZWNvbWVzIE8obG9nIE4pIHZpYSBiaW5hcnkgc2VhcmNoIGluc3RlYWQgb2YgTyhOKS5cbiAqICAgRm9yIGFuIGFnZW50IGxvb3Agd2l0aCA1MDAgaXRlcmF0aW9ucyBhbmQgNSBrZXlzIHBlciBob3AsIHRoaXMgaXMgNTAww5c1w5dsb2coNTAwKeKJiDIySyBvcHNcbiAqICAgdnMgNTAww5c1w5c1MDA9MS4yNU0gb3BzIHdpdGggbGluZWFyIHNjYW4uXG4gKlxuICogVGhlIGNhbGxlciBuZXZlciBzZWVzIHRoaXMg4oCUIGBjYXVzYWxDaGFpbigpYCBwaWNrcyBhdXRvbWF0aWNhbGx5LlxuICovXG5mdW5jdGlvbiBjcmVhdGVXcml0ZXJMb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIGlmIChjb21taXRMb2cubGVuZ3RoIDw9IFJFVkVSU0VfSU5ERVhfVEhSRVNIT0xEKSB7XG4gICAgcmV0dXJuIGxpbmVhclNjYW5Mb29rdXAoY29tbWl0TG9nKTtcbiAgfVxuICByZXR1cm4gcmV2ZXJzZUluZGV4TG9va3VwKGNvbW1pdExvZyk7XG59XG5cbi8vIOKUgOKUgCBDb3JlIGFsZ29yaXRobSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBSRkMtMDAzIEQyOiB0aGUgYGluY29tcGxldGVTb3VyY2VzYCBub2RlIGZyYWdtZW50IGZvciBhIGNvbW1pdCDigJQgYHt9YFxuICogd2hlbiB0aGUgc3RhZ2UgY29uc3VtZWQgbm8gdW50cmFja2VkIHJlYWQgcGF0aHMsIGtlZXBpbmcgdGhlIGZpZWxkXG4gKiBBQlNFTlQgKG5vdCBlbXB0eS1hcnJheS12YWx1ZWQpIGZvciBmdWxseS10cmFja2VkIHN0YWdlcy5cbiAqL1xuZnVuY3Rpb24gaW5jb21wbGV0ZVNvdXJjZXNGcmFnbWVudChjb21taXQ6IENvbW1pdEJ1bmRsZSk6IHsgaW5jb21wbGV0ZVNvdXJjZXM/OiBSZWFkb25seUFycmF5PFVudHJhY2tlZFNvdXJjZT4gfSB7XG4gIGlmICghY29tbWl0LnVudHJhY2tlZFNvdXJjZXMgfHwgY29tbWl0LnVudHJhY2tlZFNvdXJjZXMubGVuZ3RoID09PSAwKSByZXR1cm4ge307XG4gIHJldHVybiB7IGluY29tcGxldGVTb3VyY2VzOiBjb21taXQudW50cmFja2VkU291cmNlcyB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBjYXVzYWwgREFHIHJvb3RlZCBhdCBgc3RhcnRJZGAgYnkgd2Fsa2luZyBiYWNrd2FyZHNcbiAqIHRocm91Z2ggcmVhZOKGkndyaXRlIGRlcGVuZGVuY2llcyBpbiB0aGUgY29tbWl0IGxvZy5cbiAqXG4gKiBBdXRvbWF0aWNhbGx5IHNlbGVjdHMgdGhlIG9wdGltYWwgd3JpdGVyIGxvb2t1cCBzdHJhdGVneTpcbiAqIC0gTGluZWFyIHNjYW4gZm9yIHNtYWxsIGxvZ3MgKOKJpCAyNTYgY29tbWl0cylcbiAqIC0gUmV2ZXJzZSBpbmRleCB3aXRoIGJpbmFyeSBzZWFyY2ggZm9yIGxhcmdlIGxvZ3MgKD4gMjU2IGNvbW1pdHMpXG4gKlxuICogUHJvZHVjZXMgYSBEQUcgKG5vdCBhIHRyZWUpOiBpZiB0d28gY2hpbGRyZW4gYm90aCByZWFkIGZyb20gdGhlIHNhbWVcbiAqIHBhcmVudCwgdGhlIHBhcmVudCBub2RlIGlzIHNoYXJlZCAoZGVkdXBlZCBieSBydW50aW1lU3RhZ2VJZCkuXG4gKlxuICogQHBhcmFtIGNvbW1pdExvZyAgIE9yZGVyZWQgY29tbWl0IGJ1bmRsZXMgZnJvbSBleGVjdXRvci5nZXRTbmFwc2hvdCgpLmNvbW1pdExvZ1xuICogQHBhcmFtIHN0YXJ0SWQgICAgIHJ1bnRpbWVTdGFnZUlkIHRvIHN0YXJ0IGJhY2t0cmFja2luZyBmcm9tXG4gKiBAcGFyYW0gZ2V0S2V5c1JlYWQgQ2FsbGJhY2sgcmV0dXJuaW5nIGtleXMgcmVhZCBieSBhIGdpdmVuIGV4ZWN1dGlvbiBzdGVwXG4gKiBAcGFyYW0gb3B0aW9ucyAgICAgRGVwdGggYW5kIG5vZGUgbGltaXRzXG4gKiBAcmV0dXJucyBSb290IENhdXNhbE5vZGUgd2l0aCAucGFyZW50cyBmb3JtaW5nIHRoZSBEQUcsIG9yIHVuZGVmaW5lZCBpZiBzdGFydElkIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2F1c2FsQ2hhaW4oXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sXG4gIHN0YXJ0SWQ6IHN0cmluZyxcbiAgZ2V0S2V5c1JlYWQ6IEtleXNSZWFkTG9va3VwLFxuICBvcHRpb25zPzogQ2F1c2FsQ2hhaW5PcHRpb25zLFxuKTogQ2F1c2FsTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1heERlcHRoID0gb3B0aW9ucz8ubWF4RGVwdGggPz8gMjA7XG4gIGNvbnN0IG1heE5vZGVzID0gb3B0aW9ucz8ubWF4Tm9kZXMgPz8gMTAwO1xuICBjb25zdCBjb250cm9sRGVwcyA9IG9wdGlvbnM/LmNvbnRyb2xEZXBzO1xuICBjb25zdCB3ZWlnaCA9IG9wdGlvbnM/LndlaWdoO1xuICBjb25zdCBwZXJXcml0ZSA9IG9wdGlvbnM/LmVkZ2VBdHRyaWJ1dGlvbiA9PT0gJ3Blci13cml0ZSc7XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5LiBTZXQgb25seSB3aGVuIGEgbGltaXQgYWN0dWFsbHlcbiAgLy8gY3V0cyB0aGUgc2xpY2U7IHN1cmZhY2VkIG9uIHRoZSByb290IGFzIGB0cnVuY2F0ZWRgIHNvIGEgY29uc3VtZXIgY2FuXG4gIC8vIG5ldmVyIG1pc3Rha2UgYSB0cnVuY2F0ZWQgc2xpY2UgZm9yIGEgY29tcGxldGUgb25lLlxuICBsZXQgdHJ1bmNhdGVkQnlEZXB0aCA9IGZhbHNlO1xuICBsZXQgdHJ1bmNhdGVkQnlOb2RlcyA9IGZhbHNlO1xuXG4gIC8vIEJ1aWxkIHBvc2l0aW9uIGluZGV4OiBydW50aW1lU3RhZ2VJZCDihpIgYXJyYXkgcG9zaXRpb24gKE8obikgb25jZSlcbiAgY29uc3QgaWR4TWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21taXRMb2cubGVuZ3RoOyBpKyspIHtcbiAgICBpZHhNYXAuc2V0KGNvbW1pdExvZ1tpXS5ydW50aW1lU3RhZ2VJZCwgaSk7XG4gIH1cbiAgcXVlcnlXb3JrLnVuaXRzICs9IGNvbW1pdExvZy5sZW5ndGg7XG5cbiAgY29uc3Qgc3RhcnRJZHggPSBpZHhNYXAuZ2V0KHN0YXJ0SWQpO1xuICBpZiAoc3RhcnRJZHggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBzdGFydENvbW1pdCA9IGNvbW1pdExvZ1tzdGFydElkeF07XG5cbiAgLy8gUGljayB3cml0ZXIgbG9va3VwIHN0cmF0ZWd5IGJhc2VkIG9uIGxvZyBzaXplXG4gIGNvbnN0IGZpbmRXcml0ZXIgPSBjcmVhdGVXcml0ZXJMb29rdXAoY29tbWl0TG9nKTtcblxuICAvLyBOb2RlIGRlZHVwIG1hcDogcnVudGltZVN0YWdlSWQg4oaSIENhdXNhbE5vZGUgKGVuc3VyZXMgREFHLCBub3QgdHJlZSlcbiAgY29uc3Qgbm9kZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYXVzYWxOb2RlPigpO1xuXG4gIGNvbnN0IHJvb3Q6IENhdXNhbE5vZGUgPSB7XG4gICAgcnVudGltZVN0YWdlSWQ6IHN0YXJ0SWQsXG4gICAgc3RhZ2VJZDogc3RhcnRDb21taXQuc3RhZ2VJZCxcbiAgICBzdGFnZU5hbWU6IHN0YXJ0Q29tbWl0LnN0YWdlLFxuICAgIGtleXNXcml0dGVuOiBzdGFydENvbW1pdC50cmFjZS5tYXAoKHQpID0+IHQucGF0aCksXG4gICAgbGlua2VkQnk6ICcnLFxuICAgIGRlcHRoOiAwLFxuICAgIHBhcmVudHM6IFtdLFxuICAgIHBhcmVudEVkZ2VzOiBbXSxcbiAgICAuLi5pbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KHN0YXJ0Q29tbWl0KSxcbiAgfTtcbiAgbm9kZU1hcC5zZXQoc3RhcnRJZCwgcm9vdCk7XG5cbiAgLy8g4pSA4pSAICNQMSBwZXItd3JpdGUgYXR0cmlidXRpb24gbWFjaGluZXJ5IChpbmVydCB1bmRlciAnc3RhZ2UnKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gZXhwYW5kZWRSZWFkczogcGVyIG5vZGUsIHRoZSByZWFkcyBhbHJlYWR5IHF1ZXVlZCBmb3IgZXhwYW5zaW9uIOKAlCBsYXRlXG4gIC8vIGxpbmtzIHZpYSBhZGRpdGlvbmFsIGtleXMgcmUtZW5xdWV1ZSBvbmx5IHRoZSBERUxUQSwgc28gdGhlIHNsaWNlIGdyb3dzXG4gIC8vIG1vbm90b25pY2FsbHkgdG93YXJkIHRoZSBzdGFnZS1sZXZlbCBjZWlsaW5nIGFuZCB0ZXJtaW5hdGVzIChlYWNoIGtleVxuICAvLyBleHBhbmRzIGF0IG1vc3Qgb25jZSBwZXIgbm9kZSkuIGZ1bGx5RXhwYW5kZWQ6IG5vZGVzIHRoYXQgZmVsbCBiYWNrIHRvXG4gIC8vIHN0YWdlIGxldmVsIChubyByZWFkS2V5cyBvbiBhIGxpbmtpbmcgZW50cnkpIOKAlCBub3RoaW5nIGxlZnQgdG8gYWRkLlxuICBjb25zdCBleHBhbmRlZFJlYWRzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICBjb25zdCBmdWxseUV4cGFuZGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBub2RlJ3MgZXhwYW5zaW9uIHJlYWQtc2V0IGZvciB0aGUgZ2l2ZW4gbGlua2luZyBXUklUVEVOIGtleXMuXG4gICAqIFBlci13cml0ZSBtb2RlIHdpdGggcHJvdmVuYW5jZSBwcmVzZW50IOKGkiB1bmlvbiBvZiB0aGUgbGlua2luZyB3cml0ZXMnXG4gICAqIHRlbXBvcmFsLXByZWZpeCBgcmVhZEtleXNgLiBBbnkgbGlua2luZyBlbnRyeSBXSVRIT1VUIGByZWFkS2V5c2AgKG9yIG5vXG4gICAqIGxpbmtLZXlzIGF0IGFsbCkg4oaSIGhvbmVzdCBzdGFnZS1sZXZlbCBmYWxsYmFjaywgZmxhZ2dlZCB2aWEgdGhlIHNlY29uZFxuICAgKiB0dXBsZSBtZW1iZXIgc28gdGhlIGNhbGxlciBtYXJrcyB0aGUgbm9kZSBmdWxseSBleHBhbmRlZC5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWRzRm9yTGlua3MoY29tbWl0OiBDb21taXRCdW5kbGUsIGxpbmtLZXlzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFtzdHJpbmdbXSwgYm9vbGVhbl0ge1xuICAgIGlmICghcGVyV3JpdGUgfHwgIWxpbmtLZXlzIHx8IGxpbmtLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtnZXRLZXlzUmVhZChjb21taXQucnVudGltZVN0YWdlSWQpLCB0cnVlXTtcbiAgICB9XG4gICAgY29uc3QgdW5pb24gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGxpbmtLZXkgb2YgbGlua0tleXMpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBsaW5raW5nRW50cmllcyhjb21taXQsIGxpbmtLZXkpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwIHx8IGVudHJpZXMuc29tZSgoZSkgPT4gZS5yZWFkS2V5cyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAvLyBNaXhlZC9kaWFsLW9mZiBsb2cg4oCUIGRlZ3JhZGUgVEhJUyBub2RlIHRvIHN0YWdlIGxldmVsLCBob25lc3RseS5cbiAgICAgICAgcmV0dXJuIFtnZXRLZXlzUmVhZChjb21taXQucnVudGltZVN0YWdlSWQpLCB0cnVlXTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykgZm9yIChjb25zdCByayBvZiBlbnRyeS5yZWFkS2V5cyBhcyBzdHJpbmdbXSkgdW5pb24uYWRkKHJrKTtcbiAgICB9XG4gICAgcmV0dXJuIFtbLi4udW5pb25dLCBmYWxzZV07XG4gIH1cblxuICAvLyBCRlMvd29ya2xpc3QgcXVldWU6IFtub2RlLCBjb21taXRJZHgsIGRlcHRoLCBrZXlzVG9FeHBhbmRdXG4gIGNvbnN0IFtyb290UmVhZHMsIHJvb3RJc0Z1bGxdID0gcGVyV3JpdGVcbiAgICA/IHJlYWRzRm9yTGlua3Moc3RhcnRDb21taXQsIG9wdGlvbnM/LnJvb3RMaW5rS2V5cylcbiAgICA6IFtnZXRLZXlzUmVhZChzdGFydElkKSwgdHJ1ZV07XG4gIGV4cGFuZGVkUmVhZHMuc2V0KHN0YXJ0SWQsIG5ldyBTZXQocm9vdFJlYWRzKSk7XG4gIGlmIChyb290SXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChzdGFydElkKTtcbiAgY29uc3QgcXVldWU6IEFycmF5PFtDYXVzYWxOb2RlLCBudW1iZXIsIG51bWJlciwgc3RyaW5nW11dPiA9IFtbcm9vdCwgc3RhcnRJZHgsIDAsIHJvb3RSZWFkc11dO1xuICBsZXQgdmlzaXRlZCA9IDE7XG5cbiAgLyoqXG4gICAqIExpbmsgYG5vZGUg4oaSIHBhcmVudGAgKGNyZWF0aW5nICsgZW5xdWV1ZWluZyB0aGUgcGFyZW50IHdoZW4gbmV3KS5cbiAgICogU2hhcmVkIGJ5IGRhdGEtZWRnZSBleHBhbnNpb24gKHJlYWTihpJ3cml0ZSkgYW5kIGNvbnRyb2wtZWRnZSBleHBhbnNpb25cbiAgICogKEQzKS4gT25lIENhdXNhbEVkZ2UgcGVyIGRpc3RpbmN0IChwYXJlbnQsIGtpbmQsIGtleSkgbGluazsgYHBhcmVudHNgXG4gICAqIGtlZXBzIGl0cyBoaXN0b3JpY2FsIG9uZS1lbnRyeS1wZXItcGFyZW50IGRlZHVwLlxuICAgKi9cbiAgZnVuY3Rpb24gbGlua1BhcmVudChcbiAgICBub2RlOiBDYXVzYWxOb2RlLFxuICAgIHBhcmVudENvbW1pdDogQ29tbWl0QnVuZGxlLFxuICAgIGtpbmQ6ICdkYXRhJyB8ICdjb250cm9sJyxcbiAgICBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBkZXB0aDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IHBhcmVudENvbW1pdC5ydW50aW1lU3RhZ2VJZDtcbiAgICAvLyB0aGUgZGVkdXAgc2NhbnMgYmVsb3csIGFuZCB0aGUgcGFyZW50J3MgdHJhY2Ugd2hlbiBpdCBpcyBuZXcg4oCUIGNvdW50ZWQgZm9yIHRoZSBzY2FsaW5nIHRlc3RcbiAgICBxdWVyeVdvcmsudW5pdHMgKz0gMSArIG5vZGUucGFyZW50cy5sZW5ndGggKyBub2RlLnBhcmVudEVkZ2VzLmxlbmd0aDtcbiAgICAvLyAjUDE6IHRoZSBwYXJlbnQncyBleHBhbnNpb24gcmVhZHMsIHJlc29sdmVkIExBWklMWSAob25seSBmb3IgbmV3IG5vZGVzXG4gICAgLy8gb3IgcGVyLXdyaXRlIHJlLWV4cGFuc2lvbiDigJQgZHVwbGljYXRlIGxpbmtzIHVuZGVyICdzdGFnZScgcGF5IG5vdGhpbmcpLlxuICAgIC8vIERhdGEgbGlua3MgZXhwYW5kIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIHRoZSBwYXJlbnQncyB3cml0ZSBvZlxuICAgIC8vIGBrZXlgOyBjb250cm9sIGxpbmtzIGV4cGFuZCB0aGUgZGVjaWRlciBhdCBzdGFnZSBsZXZlbCAoYSBkZWNpc2lvblxuICAgIC8vIGRlcGVuZHMgb24gZXZlcnl0aGluZyBpdCByZWFkKS5cbiAgICBjb25zdCByZXNvbHZlTGlua1JlYWRzID0gKCk6IFtzdHJpbmdbXSwgYm9vbGVhbl0gPT5cbiAgICAgIGtpbmQgPT09ICdkYXRhJ1xuICAgICAgICA/IHJlYWRzRm9yTGlua3MocGFyZW50Q29tbWl0LCBrZXkgIT09IHVuZGVmaW5lZCA/IFtrZXldIDogdW5kZWZpbmVkKVxuICAgICAgICA6IFtnZXRLZXlzUmVhZChwYXJlbnRJZCksIHRydWVdO1xuXG4gICAgbGV0IHBhcmVudE5vZGUgPSBub2RlTWFwLmdldChwYXJlbnRJZCk7XG4gICAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgICAvLyBOZXcgbm9kZSDigJQgY3JlYXRlIGFuZCBlbnF1ZXVlIChyZXNwZWN0aW5nIHRoZSBub2RlIGJ1ZGdldClcbiAgICAgIGlmICh2aXNpdGVkID49IG1heE5vZGVzKSB7XG4gICAgICAgIHRydW5jYXRlZEJ5Tm9kZXMgPSB0cnVlOyAvLyBENDogYSBkaXNjb3ZlcmVkIHBhcmVudCB3YXMgZHJvcHBlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudElkeCA9IGlkeE1hcC5nZXQocGFyZW50SWQpO1xuICAgICAgaWYgKHBhcmVudElkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIHF1ZXJ5V29yay51bml0cyArPSBwYXJlbnRDb21taXQudHJhY2UubGVuZ3RoO1xuICAgICAgcGFyZW50Tm9kZSA9IHtcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHBhcmVudElkLFxuICAgICAgICBzdGFnZUlkOiBwYXJlbnRDb21taXQuc3RhZ2VJZCxcbiAgICAgICAgc3RhZ2VOYW1lOiBwYXJlbnRDb21taXQuc3RhZ2UsXG4gICAgICAgIGtleXNXcml0dGVuOiBwYXJlbnRDb21taXQudHJhY2UubWFwKCh0KSA9PiB0LnBhdGgpLFxuICAgICAgICAvLyBsaW5rZWRCeSBzdGF5cyBhIERBVEEta2V5IGNvbmNlcHQgKGJhY2stY29tcGF0KSDigJQgY29udHJvbC1saW5rZWRcbiAgICAgICAgLy8gbm9kZXMgY2FycnkgdGhlaXIgbGFiZWwgb24gdGhlIGVkZ2UgaW5zdGVhZC5cbiAgICAgICAgbGlua2VkQnk6IGtpbmQgPT09ICdkYXRhJyA/IGtleSA/PyAnJyA6ICcnLFxuICAgICAgICBkZXB0aDogZGVwdGggKyAxLFxuICAgICAgICBwYXJlbnRzOiBbXSxcbiAgICAgICAgcGFyZW50RWRnZXM6IFtdLFxuICAgICAgICAuLi5pbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KHBhcmVudENvbW1pdCksXG4gICAgICB9O1xuICAgICAgbm9kZU1hcC5zZXQocGFyZW50SWQsIHBhcmVudE5vZGUpO1xuICAgICAgdmlzaXRlZCsrO1xuICAgICAgY29uc3QgW2xpbmtSZWFkcywgbGlua0lzRnVsbF0gPSByZXNvbHZlTGlua1JlYWRzKCk7XG4gICAgICBleHBhbmRlZFJlYWRzLnNldChwYXJlbnRJZCwgbmV3IFNldChsaW5rUmVhZHMpKTtcbiAgICAgIGlmIChsaW5rSXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChwYXJlbnRJZCk7XG4gICAgICBxdWV1ZS5wdXNoKFtwYXJlbnROb2RlLCBwYXJlbnRJZHgsIGRlcHRoICsgMSwgbGlua1JlYWRzXSk7XG4gICAgfSBlbHNlIGlmIChwZXJXcml0ZSAmJiAhZnVsbHlFeHBhbmRlZC5oYXMocGFyZW50SWQpKSB7XG4gICAgICAvLyAjUDEgd29ya2xpc3Q6IGFuIEVYSVNUSU5HIG5vZGUgbGlua2VkIHZpYSBhbm90aGVyIGtleSBtYXkgb3dlIG1vcmVcbiAgICAgIC8vIGV4cGFuc2lvbiDigJQgZW5xdWV1ZSBvbmx5IHRoZSByZWFkcyBub3QgeWV0IGV4cGFuZGVkIChtb25vdG9uZTsgdGhlXG4gICAgICAvLyBub2RlIGJ1ZGdldCBpcyB1bnRvdWNoZWQsIG5vIG5vZGUgaXMgY3JlYXRlZCkuIFJlLWV4cGFuc2lvbiBrZWVwc1xuICAgICAgLy8gdGhlIG5vZGUncyBPUklHSU5BTCBkZXB0aCBzbyBpdHMgcGFyZW50cyBnZXQgYSBjb25zaXN0ZW50IGRlcHRoKzEuXG4gICAgICBjb25zdCBbbGlua1JlYWRzLCBsaW5rSXNGdWxsXSA9IHJlc29sdmVMaW5rUmVhZHMoKTtcbiAgICAgIGNvbnN0IGV4cGFuZGVkID0gZXhwYW5kZWRSZWFkcy5nZXQocGFyZW50SWQpITtcbiAgICAgIGNvbnN0IGRlbHRhID0gbGlua1JlYWRzLmZpbHRlcigoaykgPT4gIWV4cGFuZGVkLmhhcyhrKSk7XG4gICAgICBpZiAobGlua0lzRnVsbCkgZnVsbHlFeHBhbmRlZC5hZGQocGFyZW50SWQpO1xuICAgICAgaWYgKGRlbHRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIGRlbHRhKSBleHBhbmRlZC5hZGQoayk7XG4gICAgICAgIGNvbnN0IHBhcmVudElkeCA9IGlkeE1hcC5nZXQocGFyZW50SWQpO1xuICAgICAgICBpZiAocGFyZW50SWR4ICE9PSB1bmRlZmluZWQpIHF1ZXVlLnB1c2goW3BhcmVudE5vZGUsIHBhcmVudElkeCwgcGFyZW50Tm9kZS5kZXB0aCwgZGVsdGFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEQUcgbWVyZ2U6IG9uZSBwYXJlbnRzW10gZW50cnkgcGVyIGRpc3RpbmN0IHBhcmVudCAoaGlzdG9yaWNhbCBzaGFwZSlcbiAgICBpZiAoIW5vZGUucGFyZW50cy5zb21lKChwKSA9PiBwLnJ1bnRpbWVTdGFnZUlkID09PSBwYXJlbnRJZCkpIHtcbiAgICAgIG5vZGUucGFyZW50cy5wdXNoKHBhcmVudE5vZGUpO1xuICAgIH1cbiAgICAvLyBPbmUgZWRnZSBwZXIgZGlzdGluY3QgKHBhcmVudCwga2luZCwga2V5KSBsaW5rLiBUaGUgd2VpZ2hlciAoRDQpXG4gICAgLy8gc3RhbXBzIHRoZSB3ZWlnaHQgYXQgY3JlYXRpb247IGB1bmRlZmluZWRgIOKGkiAxLjAg4oCUIHRoZSBlbmdpbmUgbmV2ZXJcbiAgICAvLyBjb21wdXRlcyB3ZWlnaHRzIGl0c2VsZi5cbiAgICBpZiAoIW5vZGUucGFyZW50RWRnZXMuc29tZSgoZSkgPT4gZS5wYXJlbnQucnVudGltZVN0YWdlSWQgPT09IHBhcmVudElkICYmIGUua2luZCA9PT0ga2luZCAmJiBlLmtleSA9PT0ga2V5KSkge1xuICAgICAgLy8gRXJyb3IgaXNvbGF0aW9uIChyZXZpZXcgZmluZGluZyk6IGEgY29uc3VtZXIgd2VpZ2hlciB0aGF0IHRocm93c1xuICAgICAgLy8gbXVzdCBkZWdyYWRlIHRvIHRoZSBkZWZhdWx0IHdlaWdodCwgbmV2ZXIgY3Jhc2ggdGhlIHNsaWNlIOKAlCB0aGVcbiAgICAgIC8vIHNhbWUgY29udHJhY3QgZXZlcnkgb3RoZXIgY29uc3VtZXIgY2FsbGJhY2sgaW4gdGhlIGxpYnJhcnkgZ2V0cy5cbiAgICAgIGxldCB3ZWlnaHQgPSAxLjA7XG4gICAgICBpZiAod2VpZ2gpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3ZWlnaHQgPSB3ZWlnaChub2RlLCBwYXJlbnROb2RlLCBrZXksIGtpbmQpID8/IDEuMDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLyogd2VpZ2hlciB0aHJldyDigJQga2VlcCAxLjAsIHRoZSBzbGljZSBzdGF5cyB1c2FibGUgKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgbmVzdGVkID0ga2luZCA9PT0gJ2RhdGEnICYmIGtleSAhPT0gdW5kZWZpbmVkICYmIHdyaXRlc09ubHlJbnNpZGUocGFyZW50Q29tbWl0LCBrZXkpO1xuICAgICAgbm9kZS5wYXJlbnRFZGdlcy5wdXNoKHtcbiAgICAgICAgcGFyZW50OiBwYXJlbnROb2RlLFxuICAgICAgICBraW5kLFxuICAgICAgICBrZXksXG4gICAgICAgIHdlaWdodCxcbiAgICAgICAgLi4uKG5lc3RlZCAmJiB7IGJhc2lzOiAnbmVzdGVkLXJvd3MnIGFzIGNvbnN0IH0pLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBbbm9kZSwgY29tbWl0SWR4LCBkZXB0aCwga2V5c1RvRXhwYW5kXSA9IHF1ZXVlLnNoaWZ0KCkhO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSAxICsga2V5c1RvRXhwYW5kLmxlbmd0aDtcblxuICAgIGlmIChkZXB0aCA+PSBtYXhEZXB0aCkge1xuICAgICAgLy8gRDQ6IG9ubHkgYSBub2RlIHRoYXQgc3RpbGwgSEFEIHNvbWV0aGluZyB0byBleHBhbmQgY291bnRzIGFzIGEgY3V0XG4gICAgICAvLyAoYSBsZWFmIGF0IHRoZSBob3Jpem9uIHRydW5jYXRlcyBub3RoaW5nKS5cbiAgICAgIGlmIChrZXlzVG9FeHBhbmQubGVuZ3RoID4gMCB8fCBjb250cm9sRGVwcz8uKG5vZGUucnVudGltZVN0YWdlSWQpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ1bmNhdGVkQnlEZXB0aCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEYXRhIGVkZ2VzOiBmb3IgZWFjaCBrZXkgaW4gdGhpcyBleHBhbnNpb24ncyByZWFkLXNldCwgZmluZCB3aG8gd3JvdGVcbiAgICAvLyBpdC4gVW5kZXIgJ3N0YWdlJyB0aGlzIGlzIHRoZSBub2RlJ3MgZnVsbCByZWFkLXNldCAoaGlzdG9yaWNhbFxuICAgIC8vIGJlaGF2aW9yKTsgdW5kZXIgJ3Blci13cml0ZScgaXQgaXMgdGhlIGxpbmtpbmcgd3JpdGVzJyB0ZW1wb3JhbCBwcmVmaXhcbiAgICAvLyAob3IgYSB3b3JrbGlzdCBkZWx0YSBvbiByZS1leHBhbnNpb24pLlxuICAgIGNvbnN0IGtleXNSZWFkID0ga2V5c1RvRXhwYW5kO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNSZWFkKSB7XG4gICAgICBjb25zdCB3cml0ZXIgPSBmaW5kV3JpdGVyKGtleSwgY29tbWl0SWR4KTtcbiAgICAgIGlmICghd3JpdGVyKSB7XG4gICAgICAgIC8vIEY0Yjogc2F5IHdoeSB0aGVyZSBpcyBubyBlZGdlIOKAlCBubyBjb21taXQgYmVmb3JlIHRoaXMgbm9kZSB3cm90ZSB0aGUga2V5LlxuICAgICAgICBub2RlLnByZVJ1blJlYWRzID8/PSB7IGNvZGU6ICdwcmUtcnVuLW9yaWdpbicsIGtleXM6IFtdIH07XG4gICAgICAgIGlmICghbm9kZS5wcmVSdW5SZWFkcy5rZXlzLmluY2x1ZGVzKGtleSkpIG5vZGUucHJlUnVuUmVhZHMua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGlua1BhcmVudChub2RlLCB3cml0ZXIsICdkYXRhJywga2V5LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLy8gQ29udHJvbCBlZGdlIChSRkMtMDAzIEQzKTogbGluayB0aGUgZ292ZXJuaW5nIGRlY2lkZXIsIGxhYmVsZWQgYnkgdGhlXG4gICAgLy8gZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQuIFRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAgLy8gbm9ybWFsbHkgdGhyb3VnaCBpdHMgb3duIGRhdGEgcmVhZHMgKGFuZCBpdHMgb3duIGNvbnRyb2wgcGFyZW50KS5cbiAgICBpZiAoY29udHJvbERlcHMpIHtcbiAgICAgIGNvbnN0IGRlcCA9IGNvbnRyb2xEZXBzKG5vZGUucnVudGltZVN0YWdlSWQpO1xuICAgICAgaWYgKGRlcCkge1xuICAgICAgICBjb25zdCBkZWNpZGVySWR4ID0gaWR4TWFwLmdldChkZXAuZGVjaWRlcklkKTtcbiAgICAgICAgaWYgKGRlY2lkZXJJZHggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxpbmtQYXJlbnQobm9kZSwgY29tbWl0TG9nW2RlY2lkZXJJZHhdLCAnY29udHJvbCcsIGRlcC5sYWJlbCwgZGVwdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5IG9uIHRoZSByb290IChhYnNlbnQgd2hlbiBjb21wbGV0ZSkuIEl0IGlzIERBVEEsIGFuZCBvbmx5XG4gIC8vIGRhdGE6IGEgcmVhZGVyIHJlYWRzIGByb290LnRydW5jYXRlZGAgKGFuZCBgZm9ybWF0Q2F1c2FsQ2hhaW5gIHByaW50cyBpdCk7IHRoZSByZWNvcmQgd3JpdGVzIG5vXG4gIC8vIGNvbnNvbGUgbGluZSAodGhlIGRldi1tb2RlIHdhcm5pbmcgd2VudCBpbiBDNiDigJQgdGhlIHJlY29yZCBpbXBvcnRzIG5vdGhpbmcgb3V0c2lkZSBpdHNlbGYpLlxuICBpZiAodHJ1bmNhdGVkQnlEZXB0aCB8fCB0cnVuY2F0ZWRCeU5vZGVzKSB7XG4gICAgcm9vdC50cnVuY2F0ZWQgPSB7IGJ5RGVwdGg6IHRydW5jYXRlZEJ5RGVwdGgsIGJ5Tm9kZXM6IHRydW5jYXRlZEJ5Tm9kZXMgfTtcbiAgfVxuXG4gIHJldHVybiByb290O1xufVxuXG4vLyDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEZsYXR0ZW4gdGhlIGNhdXNhbCBEQUcgaW50byBhIEJGUy1vcmRlcmVkIGxpc3Qgb2Ygbm9kZXMuXG4gKiBFYWNoIG5vZGUgYXBwZWFycyBleGFjdGx5IG9uY2UgKGZpcnN0IG9jY3VycmVuY2UgYnkgQkZTIG9yZGVyKS5cbiAqIFVzZWZ1bCBmb3IgbGluZWFyIGRpc3BsYXkgb3IgaXRlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbkNhdXNhbERBRyhyb290OiBDYXVzYWxOb2RlKTogQ2F1c2FsTm9kZVtdIHtcbiAgY29uc3QgcmVzdWx0OiBDYXVzYWxOb2RlW10gPSBbXTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBxdWV1ZTogQ2F1c2FsTm9kZVtdID0gW3Jvb3RdO1xuXG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IHF1ZXVlLnNoaWZ0KCkhO1xuICAgIGlmICh2aXNpdGVkLmhhcyhub2RlLnJ1bnRpbWVTdGFnZUlkKSkgY29udGludWU7XG4gICAgdmlzaXRlZC5hZGQobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG4gICAgcmVzdWx0LnB1c2gobm9kZSk7XG5cbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBub2RlLnBhcmVudHMpIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMocGFyZW50LnJ1bnRpbWVTdGFnZUlkKSkge1xuICAgICAgICBxdWV1ZS5wdXNoKHBhcmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBGb3JtYXQgYSBjYXVzYWwgREFHIGFzIGh1bWFuLXJlYWRhYmxlIGluZGVudGVkIHRleHQuXG4gKiBTaG93cyB0aGUgZGVwZW5kZW5jeSBjaGFpbiB3aXRoIGRlcHRoIGluZGVudGF0aW9uIGFuZCBsaW5rZWQtYnkga2V5cy5cbiAqXG4gKiBSRkMtMDAzIEQyOiBub2RlcyB0aGF0IGNvbnN1bWVkIHVudHJhY2tlZCByZWFkIHBhdGhzIHJlbmRlciBhbiBleHRyYVxuICogYOKaoCBhbHNvIGNvbnN1bWVkIOKApiDigJQgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAgbGluZSwgc28gYSBjb25zdW1lclxuICogKGh1bWFuIG9yIExMTSkgZGVidWdnaW5nIGZyb20gdGhlIHNsaWNlIGlzIFRPTEQgd2hlbiBpdCBpcyBpbmNvbXBsZXRlLlxuICpcbiAqIFJGQy0wMDMgRDM6IGNvbnRyb2wgZWRnZXMgcmVuZGVyIGFzIGDihpAgW2NvbnRyb2w6IDxydWxlIGxhYmVsPl1gXG4gKiAobGFiZWwgb21pdHRlZCB3aGVuIHRoZSBkZWNpc2lvbiBjYXJyaWVkIG5vbmUpLiBEYXRhIHJlbmRlcmluZyBpc1xuICogYnl0ZS1pZGVudGljYWwgdG8gdGhlIHByZS1EMyBvdXRwdXQg4oCUIGDihpAgdmlhIDxrZXk+YCBmcm9tIHRoZSBub2RlJ3NcbiAqIGRpc2NvdmVyeS10aW1lIGBsaW5rZWRCeWAuXG4gKlxuICogUkZDLTAwMyBENDogZWRnZSB3ZWlnaHRzIGZyb20gdGhlIGB3ZWlnaGAgaG9vayByZW5kZXIgYXMgYSBzdWZmaXgg4oCUXG4gKiBg4oaQIHZpYSBzeXN0ZW1Qcm9tcHQgKDAuMTgpYCDigJQgb25seSB3aGVuIOKJoCAxLjAsIHNvIHVud2VpZ2h0ZWQgb3V0cHV0IGlzXG4gKiB1bmNoYW5nZWQuIEEgdHJ1bmNhdGVkIHNsaWNlIChyb290LnRydW5jYXRlZCkgYXBwZW5kcyBhIGZpbmFsXG4gKiBg4pqgIHNsaWNlIHRydW5jYXRlZCDigKZgIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDYXVzYWxDaGFpbihyb290OiBDYXVzYWxOb2RlKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdCB3ZWlnaHRTdWZmaXggPSAoZWRnZTogQ2F1c2FsRWRnZSB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PlxuICAgIGVkZ2UgIT09IHVuZGVmaW5lZCAmJiBlZGdlLndlaWdodCAhPT0gMSA/IGAgKCR7ZWRnZS53ZWlnaHR9KWAgOiAnJztcblxuICBmdW5jdGlvbiB3YWxrKG5vZGU6IENhdXNhbE5vZGUsIGluZGVudDogbnVtYmVyLCBlZGdlc0Zyb21DaGlsZD86IENhdXNhbEVkZ2VbXSk6IHZvaWQge1xuICAgIGlmICh2aXNpdGVkLmhhcyhub2RlLnJ1bnRpbWVTdGFnZUlkKSkge1xuICAgICAgbGluZXMucHVzaChgJHsnICAnLnJlcGVhdChpbmRlbnQpfeKGsyAke25vZGUucnVudGltZVN0YWdlSWR9IChzZWUgYWJvdmUpYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZpc2l0ZWQuYWRkKG5vZGUucnVudGltZVN0YWdlSWQpO1xuXG4gICAgY29uc3QgbGlua1BhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChub2RlLmxpbmtlZEJ5KSB7XG4gICAgICBjb25zdCBkYXRhRWRnZSA9IGVkZ2VzRnJvbUNoaWxkPy5maW5kKChlKSA9PiBlLmtpbmQgPT09ICdkYXRhJyk7XG4gICAgICBsaW5rUGFydHMucHVzaChgdmlhICR7bm9kZS5saW5rZWRCeX0ke3dlaWdodFN1ZmZpeChkYXRhRWRnZSl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xFZGdlID0gZWRnZXNGcm9tQ2hpbGQ/LmZpbmQoKGUpID0+IGUua2luZCA9PT0gJ2NvbnRyb2wnKTtcbiAgICBpZiAoY29udHJvbEVkZ2UpIHtcbiAgICAgIGxpbmtQYXJ0cy5wdXNoKGBbY29udHJvbCR7Y29udHJvbEVkZ2Uua2V5ID8gYDogJHtjb250cm9sRWRnZS5rZXl9YCA6ICcnfV0ke3dlaWdodFN1ZmZpeChjb250cm9sRWRnZSl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGxpbmsgPSBsaW5rUGFydHMubGVuZ3RoID4gMCA/IGAg4oaQICR7bGlua1BhcnRzLmpvaW4oJyDihpAgJyl9YCA6ICcnO1xuXG4gICAgY29uc3Qgd3JpdGVzID0gbm9kZS5rZXlzV3JpdHRlbi5sZW5ndGggPiAwID8gYCBbd3JvdGU6ICR7bm9kZS5rZXlzV3JpdHRlbi5qb2luKCcsICcpfV1gIDogJyc7XG4gICAgbGluZXMucHVzaChgJHsnICAnLnJlcGVhdChpbmRlbnQpfSR7bm9kZS5zdGFnZU5hbWV9ICgke25vZGUucnVudGltZVN0YWdlSWR9KSR7bGlua30ke3dyaXRlc31gKTtcblxuICAgIGlmIChub2RlLmluY29tcGxldGVTb3VyY2VzICYmIG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYCR7JyAgJy5yZXBlYXQoaW5kZW50ICsgMSl94pqgIGFsc28gY29uc3VtZWQgJHtub2RlLmluY29tcGxldGVTb3VyY2VzLmpvaW4oJy8nKX0g4oCUIHNsaWNlIG1heSBiZSBpbmNvbXBsZXRlIGhlcmVgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBub2RlLnBhcmVudHMpIHtcbiAgICAgIHdhbGsoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgaW5kZW50ICsgMSxcbiAgICAgICAgbm9kZS5wYXJlbnRFZGdlcy5maWx0ZXIoKGUpID0+IGUucGFyZW50ID09PSBwYXJlbnQpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB3YWxrKHJvb3QsIDApO1xuXG4gIGlmIChyb290LnRydW5jYXRlZCkge1xuICAgIGNvbnN0IGNhdXNlcyA9IFtyb290LnRydW5jYXRlZC5ieURlcHRoICYmICdtYXhEZXB0aCByZWFjaGVkJywgcm9vdC50cnVuY2F0ZWQuYnlOb2RlcyAmJiAnbWF4Tm9kZXMgcmVhY2hlZCddXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbignLCAnKTtcbiAgICBsaW5lcy5wdXNoKGDimqAgc2xpY2UgdHJ1bmNhdGVkICgke2NhdXNlc30pIOKAlCBvbGRlciBjYXVzZXMgZXhpc3QgYmV5b25kIHRoaXMgaG9yaXpvbmApO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG4vLyDilIDilIAgRXhwb3J0ZWQgZm9yIHRlc3RpbmcgKGludGVybmFsKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIEBpbnRlcm5hbCBFeHBvc2VkIGZvciB0ZXN0aW5nIHRoZSBzdHJhdGVneSBzZWxlY3Rpb24uICovXG5leHBvcnQgY29uc3QgX1JFVkVSU0VfSU5ERVhfVEhSRVNIT0xEID0gUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQ7XG4iXX0=
467
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5REc7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWdNekMsMEVBQTBFO0FBRTFFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQVFwQyxrRUFBa0U7QUFDbEUsU0FBUyxnQkFBZ0IsQ0FBQyxTQUF5QjtJQUNqRCxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFNBQXlCO0lBQ25ELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxPQUFPLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQTRCLEVBQUU7UUFDbEUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMs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aUNBQWlDLENBQy9HLENBQUM7UUFDSixDQUFDO1FBRUQsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUNGLE1BQU0sRUFDTixNQUFNLEdBQUcsQ0FBQyxFQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUNwRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQzthQUN4RyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsTUFBTSw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVELDBFQUEwRTtBQUUxRSw0REFBNEQ7QUFDNUQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGJhY2t0cmFjay50cyDigJQgQmFja3dhcmQgY2F1c2FsIGNoYWluIGFuYWx5c2lzIG9uIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEltcGxlbWVudHMgKipiYWNrd2FyZCBwcm9ncmFtIHNsaWNpbmcqKiAoV2Vpc2VyIDE5ODQsIHRoaW4tc2xpY2UgdmFyaWFudCk6XG4gKiBnaXZlbiBhIHN0YXJ0aW5nIGV4ZWN1dGlvbiBzdGVwLCB3YWxrIGJhY2t3YXJkcyB0aHJvdWdoIHJlYWTihpJ3cml0ZVxuICogZGVwZW5kZW5jaWVzIHRvIGJ1aWxkIHRoZSBjYXVzYWwgREFHIHRoYXQgcHJvZHVjZWQgdGhlIGRhdGEgYXQgdGhhdCBzdGVwLlxuICpcbiAqICMjIEFsZ29yaXRobVxuICpcbiAqIEJGUyBvbiB0aGUgaW1wbGljaXQgZGVwZW5kZW5jeSBncmFwaCB3aGVyZSBlZGdlcyBydW4gZnJvbSByZWFkZXIg4oaSIHdyaXRlci5cbiAqXG4gKiAxLiBMb2NhdGUgc3RhcnRJZCBpbiBjb21taXRMb2cg4oaSIHJvb3Qgbm9kZVxuICogMi4gR2V0IGtleXNSZWFkIGZvciByb290IHZpYSBgZ2V0S2V5c1JlYWRgIGNhbGxiYWNrXG4gKiAzLiBGb3IgZWFjaCBrZXkgcmVhZCwgZmluZCB3aG8gbGFzdCB3cm90ZSBpdCBiZWZvcmUgdGhpcyBzdGVwIOKGkiBwYXJlbnQgY29tbWl0XG4gKiAgICAoXCJ3cm90ZVwiIGlzIHRoZSB3cml0ZXIgcnVsZSBvZiBga2V5UGF0aHMudHNgLCA5LjMzLjA6IGEgcm93IG9uIHRoZSBrZXksIGluc2lkZSBpdCwgb3JcbiAqICAgIGFyb3VuZCBpdCB0aGF0IGNoYW5nZWQgaXQg4oCUIHNvIGEgc3RhZ2UgdGhhdCByZWFkIGBjZmdgIGxpbmtzIHRvIHRoZSBzdWJmbG93IHNlZWQgb3JcbiAqICAgIG1lcmdlLWJhY2sgdGhhdCB3cm90ZSBgY2Zn4pCfYmApXG4gKiA0LiBDcmVhdGUgcGFyZW50IENhdXNhbE5vZGUsIGxpbmsgdG8gcm9vdC5wYXJlbnRzXG4gKiA1LiBFbnF1ZXVlIHBhcmVudC4gUmVwZWF0IHVudGlsIHF1ZXVlIGVtcHR5IG9yIGxpbWl0cyBoaXQuXG4gKlxuICogT3V0cHV0IGlzIGEgKipEQUcqKiAobm90IGEgbGlua2VkIGxpc3QpOiBhIHN0YWdlIHJlYWRpbmcgYGNyZWRpdFNjb3JlYCBBTkQgYGR0aWBcbiAqIGZyb20gZGlmZmVyZW50IHdyaXRlcnMgaGFzIHR3byBwYXJlbnRzLlxuICpcbiAqICMjIFN0YWdlZCBPcHRpbWl6YXRpb25cbiAqXG4gKiBUd28gd3JpdGVyLWxvb2t1cCBzdHJhdGVnaWVzLCBjaG9zZW4gYXV0b21hdGljYWxseSBieSBjb21taXQgbG9nIHNpemU6XG4gKlxuICogfCBTdHJhdGVneSB8IFdoZW4gfCBDb21wbGV4aXR5IHBlciBsb29rdXAgfFxuICogfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IExpbmVhciBzY2FuIHwgTiDiiaQgMjU2IHwgTyhOKSDigJQgc2ltcGxlIGJhY2t3YXJkIHNjYW4gfFxuICogfCBSZXZlcnNlIGluZGV4IHwgTiA+IDI1NiB8IE8oSyBsb2cgTikg4oCUIHByZWJ1aWx0IGtleeKGkltpbmRpY2VzXSwgYmluYXJ5IHNlYXJjaCB8XG4gKlxuICogVGhlIHRocmVzaG9sZCAoMjU2KSBpcyBjaG9zZW4gc28gdGhlIE8oTikgYnVpbGQgY29zdCBvZiB0aGUgcmV2ZXJzZSBpbmRleFxuICogaXMgYW1vcnRpemVkIG92ZXIgdGhlIEJGUyB0cmF2ZXJzYWwuIEJlbG93IDI1NiwgbGluZWFyIHNjYW4gd2lucyBiZWNhdXNlXG4gKiB0aGVyZSdzIG5vIGluZGV4IGJ1aWxkIG92ZXJoZWFkLiBUaGUgY29uc3VtZXIgbmV2ZXIgc2VlcyB0aGlzIOKAlCBgY2F1c2FsQ2hhaW4oKWBcbiAqIHBpY2tzIHRoZSByaWdodCBzdHJhdGVneSBpbnRlcm5hbGx5IChsaWtlIGEgcXVlcnkgb3B0aW1pemVyIGNob29zaW5nIGJldHdlZW5cbiAqIHNlcXVlbnRpYWwgc2NhbiB2cyBpbmRleCBzY2FuIGJhc2VkIG9uIHRhYmxlIHNpemUpLlxuICpcbiAqICMjIENvbXBsZXhpdHlcbiAqXG4gKiAtICoqU21hbGwgbG9ncyAoTiDiiaQgMjU2KToqKiBPKFYgw5cgSyDDlyBOKSB0b3RhbC4gVj12aXNpdGVkLCBLPWF2ZyBrZXlzL25vZGUuXG4gKiAtICoqTGFyZ2UgbG9ncyAoTiA+IDI1Nik6KiogTyhOIMOXIFUpIGluZGV4IGJ1aWxkICsgTyhWIMOXIEsgw5cgbG9nIE4pIGxvb2t1cHMuXG4gKiAgIFUgPSB1bmlxdWUga2V5cy4gQW1vcnRpemVkIG92ZXIgYWxsIEJGUyBob3BzLlxuICpcbiAqICMjIFJlZmVyZW5jZXNcbiAqXG4gKiAtIFdlaXNlciwgTS4gKDE5ODQpLiBcIlByb2dyYW0gU2xpY2luZy5cIiBJRUVFIFRTRS5cbiAqIC0gU3JpZGhhcmFuLCBNLiBldCBhbC4gKDIwMDcpLiBcIlRoaW4gU2xpY2luZy5cIiBQTERJLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjYXVzYWxDaGFpbiwgZmxhdHRlbkNhdXNhbERBRywgZm9ybWF0Q2F1c2FsQ2hhaW4gfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgZGFnID0gY2F1c2FsQ2hhaW4oY29tbWl0TG9nLCAnZGVjaWRlIzInLCAoaWQpID0+IHJlY29yZGVyLmdldEtleXNSZWFkKGlkKSk7XG4gKiBjb25zdCBmbGF0ID0gZmxhdHRlbkNhdXNhbERBRyhkYWcpOyAgICAgLy8gQkZTLW9yZGVyZWQgZmxhdCBsaXN0XG4gKiBjb25zb2xlLmxvZyhmb3JtYXRDYXVzYWxDaGFpbihkYWcpKTsgICAgIC8vIGh1bWFuLXJlYWRhYmxlXG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBidWlsZENvbW1pdEluZGV4LCBmaW5kTGFzdFdyaXRlciB9IGZyb20gJy4vY29tbWl0TG9nVXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWdpc3RlcmVkQ29kZSB9IGZyb20gJy4vaG9uZXN0eS5qcyc7XG5pbXBvcnQgeyBxdWVyeVdvcmssIHJlbGF0aW9uLCB3cml0ZXNPbmx5SW5zaWRlIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQgeyBsb2dNb2RlbCB9IGZyb20gJy4vbG9nTW9kZWwuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIFRyYWNlRW50cnksIFVudHJhY2tlZFNvdXJjZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIHNpbmdsZSBub2RlIGluIHRoZSBjYXVzYWwgREFHLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxOb2RlIHtcbiAgLyoqIFVuaXF1ZSBleGVjdXRpb24gc3RlcCBpZGVudGlmaWVyLiAqL1xuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogS2V5cyB0aGlzIHN0YWdlIHdyb3RlIChmcm9tIGl0cyBDb21taXRCdW5kbGUudHJhY2UpLiAqL1xuICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG4gIC8qKiBUaGUga2V5IHdob3NlIHJlYWTihpJ3cml0ZSBkZXBlbmRlbmN5IGxpbmtlZCB0aGlzIG5vZGUgdG8gaXRzIGNoaWxkLiBFbXB0eSBmb3IgdGhlIHJvb3QuICovXG4gIGxpbmtlZEJ5OiBzdHJpbmc7XG4gIC8qKiBCRlMgZGVwdGggZnJvbSB0aGUgc3RhcnRpbmcgbm9kZSAoMCA9IHN0YXJ0KS4gKi9cbiAgZGVwdGg6IG51bWJlcjtcbiAgLyoqXG4gICAqIFBhcmVudCBub2RlcyDigJQgc3RhZ2VzIHRoaXMgbm9kZSBkZXBlbmRzIG9uLiBEQUc6IG11bHRpcGxlIHBhcmVudHNcbiAgICogcG9zc2libGUuIEtFUFQgZm9yIGNvbXBhdGliaWxpdHk7IHdpdGggdGhlIGBjb250cm9sRGVwc2Agb3B0aW9uXG4gICAqIChSRkMtMDAzIEQzKSBnb3Zlcm5pbmcgZGVjaWRlcnMgYXBwZWFyIGhlcmUgdG9vLiBGb3IgdHlwZWQva2V5ZWQvXG4gICAqIHdlaWdodGVkIGRldGFpbCB1c2Uge0BsaW5rIHBhcmVudEVkZ2VzfS5cbiAgICovXG4gIHBhcmVudHM6IENhdXNhbE5vZGVbXTtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIG9uZSBlZGdlIHBlciBkZXBlbmRlbmN5IExJTksgKG5vdCBwZXIgcGFyZW50KTogYSBub2RlXG4gICAqIHJlYWRpbmcgdHdvIGtleXMgZnJvbSB0aGUgc2FtZSB3cml0ZXIgaGFzIE9ORSBlbnRyeSBpbiB7QGxpbmsgcGFyZW50c31cbiAgICogYnV0IFRXTyBgJ2RhdGEnYCBlZGdlcyBoZXJlLiBDb250cm9sIGRlcGVuZGVuY2llcyAodmlhIHRoZVxuICAgKiBgY29udHJvbERlcHNgIG9wdGlvbikgYWRkIGEgYCdjb250cm9sJ2AgZWRnZSB0byB0aGUgZ292ZXJuaW5nIGRlY2lkZXIuXG4gICAqL1xuICBwYXJlbnRFZGdlczogQ2F1c2FsRWRnZVtdO1xuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlciDigJQgc3RhbXBlZCBmcm9tIHRoZSBzdGFnZSdzXG4gICAqIGBDb21taXRCdW5kbGUudW50cmFja2VkU291cmNlc2AuIFByZXNlbnQgd2hlbiB0aGlzIHN0YWdlIEFMU08gY29uc3VtZWRcbiAgICogdW50cmFja2VkIHJlYWQgcGF0aHMgKGBhcmdzYCAvIGBlbnZgIC8gdW5zaGFkb3dlZCBgc2lsZW50YCByZWFkcyk6IHRoZVxuICAgKiBiYWNrd2FyZCBzbGljZSB0aHJvdWdoIHRoaXMgbm9kZSBtYXkgYmUgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aG9zZSByZWFkc1xuICAgKiBwcm9kdWNlIG5vIHJlYWTihpJ3cml0ZSBlZGdlIHRvIGZvbGxvdy4gYGZvcm1hdENhdXNhbENoYWluYCByZW5kZXJzIHRoaXNcbiAgICogYXMgYSBg4pqgIOKApiBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLiBBYnNlbnQgd2hlbiB0aGUgc3RhZ2Unc1xuICAgKiByZWFkcyB3ZXJlIGZ1bGx5IHRyYWNrZWQuXG4gICAqXG4gICAqIFJlZ2lzdHJ5IGNvZGU6IGAnaW5jb21wbGV0ZS1zb3VyY2VzJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCt1xuICAgKiBIT05FU1RZX0NPREVTYCwgc2VydmVkIG9uIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkXG4gICAqIG1lYW5zLiBUaGUgZmllbGQgY2FycmllcyBubyBgY29kZWAg4oCUIGl0cyB2YWx1ZXMgYXJlIHRoZVxuICAgKiB7QGxpbmsgVW50cmFja2VkU291cmNlfXMuXG4gICAqL1xuICBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5IOKAlCBzZXQgb24gdGhlIFJPT1Qgbm9kZSBvbmx5LCBhbmQgb25seVxuICAgKiB3aGVuIGEgbGltaXQgYWN0dWFsbHkgY3V0IHRoZSBzbGljZTogYGJ5RGVwdGhgIHdoZW4gYSBub2RlIGF0IHRoZVxuICAgKiBgbWF4RGVwdGhgIGhvcml6b24gc3RpbGwgaGFkIGVkZ2VzIHRvIGV4cGFuZCwgYGJ5Tm9kZXNgIHdoZW4gdGhlXG4gICAqIGBtYXhOb2Rlc2AgYnVkZ2V0IGJsb2NrZWQgY3JlYXRpbmcgYSBkaXNjb3ZlcmVkIHBhcmVudC4gQWJzZW50IHdoZW4gdGhlXG4gICAqIHNsaWNlIGlzIGNvbXBsZXRlLiBgZm9ybWF0Q2F1c2FsQ2hhaW5gIGFwcGVuZHMgYSBg4pqgIHNsaWNlIHRydW5jYXRlZCDigKZgXG4gICAqIGxpbmUg4oCUIGEgY29uc3VtZXIgbXVzdCBuZXZlciBtaXN0YWtlIGEgdHJ1bmNhdGVkIHNsaWNlIGZvciBhIGZ1bGwgb25lLlxuICAgKiAoVW50aWwgOS40OC4wIGRldiBtb2RlIGFsc28gd2FybmVkIG9uIHRoZSBjb25zb2xlOyB0aGUgZmllbGQgaXMgdGhlXG4gICAqIHNpZ25hbCwgcmVhZCBpdC4pXG4gICAqXG4gICAqIFJlZ2lzdHJ5IGNvZGU6IGAndHJ1bmNhdGVkJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYCwgc2VydmVkXG4gICAqIG9uIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkIG1lYW5zOyB0aGUgZmllbGQgY2FycmllcyBub1xuICAgKiBgY29kZWAuXG4gICAqL1xuICB0cnVuY2F0ZWQ/OiB7IGJ5RGVwdGg6IGJvb2xlYW47IGJ5Tm9kZXM6IGJvb2xlYW4gfTtcbiAgLyoqXG4gICAqIEY0YiAoOS4zMy4wKSDigJQgdGhlIGtleXMgdGhpcyBub2RlIHJlYWQgdGhhdCBOTyBjb21taXQgYmVmb3JlIGl0IHdyb3RlICh1bmRlciB0aGUgd3JpdGVyIHJ1bGUpLCBzbyB0aGVcbiAgICogd2FsayBoYXMgbm8gZWRnZSB0byBmb2xsb3cgZm9yIHRoZW06IHRoZWlyIHZhbHVlIGNhbWUgZnJvbSB0aGUgaW5pdGlhbCBzdGF0ZSwgZnJvemVuIHJ1biBpbnB1dCBvciBhXG4gICAqIGNsb3N1cmUg4oCUIG91dHNpZGUgdGhlIGNvbW1pdCBsb2cuIFRoZSBjb2RlIHNheXMgc28gKGAncHJlLXJ1bi1vcmlnaW4nYCwgcmVnaXN0ZXJlZCBpblxuICAgKiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2ApOyBga2V5c2AgYXJlIGluIHRoZSBvcmRlciB0aGUgd2FsayBtZXQgdGhlbS4gQUJTRU5UIHdoZW4gZXZlcnkga2V5XG4gICAqIHRoZSBub2RlIGV4cGFuZGVkIGhhZCBhIHdyaXRlciwgc28gc3VjaCBhIG5vZGUga2VlcHMgaXRzIDkuMzIuMCBzaGFwZS4gQmVmb3JlIDkuMzMuMCB0aGVzZSByZWFkcyB3ZXJlXG4gICAqIGRyb3BwZWQgd2l0aG91dCBhIHdvcmQuXG4gICAqL1xuICBwcmVSdW5SZWFkcz86IHsgY29kZTogUmVnaXN0ZXJlZENvZGU8J3ByZS1ydW4tb3JpZ2luJz47IGtleXM6IHN0cmluZ1tdIH07XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgYSB0eXBlZCBkZXBlbmRlbmN5IGVkZ2UgZnJvbSBhIGNoaWxkIG5vZGUgdG8gb25lIHBhcmVudC5cbiAqXG4gKiAtIGBraW5kOiAnZGF0YSdgICAgIOKAlCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jeTsgYGtleWAgaXMgdGhlIHN0YXRlIGtleS5cbiAqIC0gYGtpbmQ6ICdjb250cm9sJ2Ag4oCUIHRoZSBwYXJlbnQgaXMgdGhlIGRlY2lkZXIvc2VsZWN0b3Igd2hvc2UgZGVjaXNpb25cbiAqICAgYWxsb3dlZCB0aGUgY2hpbGQgdG8gcnVuOyBga2V5YCBpcyB0aGUgZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQuXG4gKlxuICogYHdlaWdodGAgZGVmYXVsdHMgdG8gMS4wOyB0aGUgYHdlaWdoYCBob29rIChSRkMtMDAzIEQ0KSBjYW4gb3ZlcnJpZGUgaXQuXG4gKiBUaGUgZW5naW5lIGl0c2VsZiBORVZFUiBjb21wdXRlcyB3ZWlnaHRzIOKAlCBzZW1hbnRpY3MgYmVsb25nIHRvIHRoZVxuICogY29uc3VtZXItaW5qZWN0ZWQgd2VpZ2hlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxFZGdlIHtcbiAgcGFyZW50OiBDYXVzYWxOb2RlO1xuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCc7XG4gIGtleT86IHN0cmluZztcbiAgd2VpZ2h0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGNGIgKDkuMzMuMCkg4oCUIHByZXNlbnQgb25seSBvbiBhIGAnZGF0YSdgIGVkZ2Ugd2hvc2UgcGFyZW50IHdyb3RlIGBrZXlgIE9OTFkgdGhyb3VnaCByb3dzIGluc2lkZSBpdFxuICAgKiAoYSBzdWJmbG93J3MgaW5wdXQgc2VlZCwgYW4gb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2ssIGEgZm9yayBjaGlsZCdzIG5hbWVzcGFjZSk6IHRoYXQgd3JpdGUgbWFkZSBwYXJ0XG4gICAqIG9mIHRoZSB2YWx1ZSwgYW5kIGVhcmxpZXIgd3JpdGVycyBtYXkgYWNjb3VudCBmb3IgdGhlIHJlc3QuIFJlZ2lzdGVyZWQgYXMgYCduZXN0ZWQtcm93cydgIGluXG4gICAqIGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYC4gQWJzZW50IGZvciBhIHdyaXRlIG9uIG9yIGFyb3VuZCB0aGUga2V5LCBzbyBhbiBleGFjdCBlZGdlIGtlZXBzXG4gICAqIGl0cyA5LjMyLjAgc2hhcGUuXG4gICAqL1xuICBiYXNpcz86IFJlZ2lzdGVyZWRDb2RlPCduZXN0ZWQtcm93cyc+O1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgY29udHJvbCBkZXBlbmRlbmN5IHJlc29sdmVkIGZvciBvbmUgZXhlY3V0aW9uIHN0ZXA6XG4gKiB3aGljaCBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEZXBlbmRlbmN5IHtcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBnb3Zlcm5pbmcgZGVjaWRlci9zZWxlY3RvciBleGVjdXRpb24gc3RlcC4gKi9cbiAgZGVjaWRlcklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCBmb3IgdGhlIGNob3NlbiBicmFuY2gsIHdoZW4gcHJlc2VudC4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgY2FsbGJhY2sgcmVzb2x2aW5nIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciBmb3IgYW4gZXhlY3V0aW9uXG4gKiBzdGVwLiBSZXR1cm4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgc3RlcCBpcyBub3QgY29udHJvbC1kZXBlbmRlbnQgb24gYW55XG4gKiByZWNvcmRlZCBkZWNpc2lvbi4gQnVpbGQgb25lIHdpdGggYGNvbnRyb2xEZXBSZWNvcmRlcigpYCBmcm9tXG4gKiBgZm9vdHByaW50anMvdHJhY2VgLCBvciBzdXBwbHkgeW91ciBvd24uXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRyb2xEZXBMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUkZDLTAwMyBENCDigJQgY29uc3VtZXItaW5qZWN0ZWQgZWRnZSB3ZWlnaGVyLiBDYWxsZWQgb25jZSBwZXIgY3JlYXRlZFxuICogZWRnZTsgcmV0dXJuIGEgd2VpZ2h0LCBvciBgdW5kZWZpbmVkYCB0byBrZWVwIHRoZSBkZWZhdWx0IDEuMC4gVGhlXG4gKiBFTkdJTkUgbmV2ZXIgY29tcHV0ZXMgd2VpZ2h0cyAoemVybyBuZXcgZGVwZW5kZW5jaWVzIOKAlCBzZW1hbnRpY3MgbGlrZVxuICogZW1iZWRkaW5nIHNpbWlsYXJpdHkgb3IgRkRMIGluZmx1ZW5jZSBiZWxvbmcgdG8gZG93bnN0cmVhbSBsaWJyYXJpZXMsXG4gKiB0aGUgc2FtZSBwbHVnLWluIHBhdHRlcm4gYXMgYE5hcnJhdGl2ZUZvcm1hdHRlcmApLiBXZWlnaHRzIHJlbmRlciBpblxuICogYGZvcm1hdENhdXNhbENoYWluYCBhcyBg4oaQIHZpYSBzeXN0ZW1Qcm9tcHQgKDAuMTgpYC5cbiAqL1xuZXhwb3J0IHR5cGUgRWRnZVdlaWdoZXIgPSAoXG4gIGNoaWxkOiBDYXVzYWxOb2RlLFxuICBwYXJlbnQ6IENhdXNhbE5vZGUsXG4gIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCcsXG4pID0+IG51bWJlciB8IHVuZGVmaW5lZDtcblxuLyoqIE9wdGlvbnMgZm9yIGNhdXNhbENoYWluKCkuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNhbENoYWluT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIEJGUyBkZXB0aCAoZGVmYXVsdDogMjApLiBQcmV2ZW50cyBydW5hd2F5IHRyYXZlcnNhbC4gKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHRvdGFsIG5vZGVzIHRvIHZpc2l0IChkZWZhdWx0OiAxMDApLiBIYXJkIGNhcCBmb3Igc2FmZXR5LiAqL1xuICBtYXhOb2Rlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSBsb29rdXAuIFdoZW4gcHJvdmlkZWQsIGV4cGFuZGluZyBhIG5vZGVcbiAgICogQUxTTyBsaW5rcyBhIGAnY29udHJvbCdgIGVkZ2UgdG8gaXRzIGdvdmVybmluZyBkZWNpZGVyIChsYWJlbGVkIGJ5IHRoZVxuICAgKiBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudCk7IHRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAqIG5vcm1hbGx5IHRocm91Z2ggaXRzIG93biBkYXRhIHJlYWRzLCBzbyBjaGFpbnMgbGlrZVxuICAgKiBgc3RhdHVzIOKGkCBbY29udHJvbF0gQ2xhc3NpZnlSaXNrIOKGkCBbZGF0YTogY3JlZGl0U2NvcmVdIFB1bGxCdXJlYXVgXG4gICAqIHJlc29sdmUgZW5kLXRvLWVuZC4gV2l0aG91dCB0aGlzIG9wdGlvbiBiZWhhdmlvciBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBjb250cm9sRGVwcz86IENvbnRyb2xEZXBMb29rdXA7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQ0IOKAlCBlZGdlIHdlaWdoZXIuIFN0YW1wcyBgQ2F1c2FsRWRnZS53ZWlnaHRgIGF0IGVkZ2UgY3JlYXRpb247XG4gICAqIGB1bmRlZmluZWRgIChvciBubyB3ZWlnaGVyKSDihpIgMS4wLiBTZWUge0BsaW5rIEVkZ2VXZWlnaGVyfS5cbiAgICovXG4gIHdlaWdoPzogRWRnZVdlaWdoZXI7XG4gIC8qKlxuICAgKiAjUDEg4oCUIGhvdyBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgaXMgZGVyaXZlZDpcbiAgICpcbiAgICogLSBgJ3N0YWdlJ2AgKGRlZmF1bHQsIGhpc3RvcmljYWwpIOKAlCBldmVyeSB2aXNpdGVkIG5vZGUgZXhwYW5kcyB0aHJvdWdoXG4gICAqICAgQUxMIG9mIGl0cyBzdGFnZSdzIHJlYWRzIChgZ2V0S2V5c1JlYWRgKS4gQSBzdGFnZSByZWFkaW5nIGBhLGJgIGFuZFxuICAgKiAgIHdyaXRpbmcgYHgseWAgbGlua3MgYm90aCByZWFkcyBhcyBjYXVzZXMgb2YgYm90aCB3cml0ZXMg4oCUIGEgc291bmQgYnV0XG4gICAqICAgY29hcnNlIG92ZXItYXBwcm94aW1hdGlvbi5cbiAgICogLSBgJ3Blci13cml0ZSdgIOKAlCB3aGVuIHRoZSBjb21taXQgbG9nIGNhcnJpZXMgcGVyLXdyaXRlIHJlYWQgcHJvdmVuYW5jZVxuICAgKiAgIChgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIHJlY29yZGVkIHVuZGVyIHRoZSBleGVjdXRvcidzXG4gICAqICAgYHdyaXRlUHJvdmVuYW5jZTogJ3JlYWRzLXByZWZpeCdgIGRpYWwpLCBhIG5vZGUgcmVhY2hlZCB2aWEga2V5IGBrYFxuICAgKiAgIGV4cGFuZHMgdGhyb3VnaCBPTkxZIHRoZSByZWFkcyB0aGF0IHByZWNlZGVkIGl0cyB3cml0ZSBvZiBga2BcbiAgICogICAodGVtcG9yYWwgcHJlZml4KS4gTm9kZXMgbGlua2VkIGxhdGVyIHZpYSBhZGRpdGlvbmFsIGtleXMgYXJlXG4gICAqICAgaW5jcmVtZW50YWxseSByZS1leHBhbmRlZCB3aXRoIGp1c3QgdGhlIG5ldyByZWFkcyAod29ya2xpc3Qg4oCUIHRoZVxuICAgKiAgIHNsaWNlIG9ubHkgZXZlciBHUk9XUyB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcpLiBIT05FU1RcbiAgICogICBGQUxMQkFDSzogYW55IGxpbmsgd2hvc2UgdHJhY2UgZW50cnkgbGFja3MgYHJlYWRLZXlzYCBleHBhbmRzIHRoYXRcbiAgICogICBub2RlIGF0IHN0YWdlIGxldmVsIOKAlCBtaXhlZCBvciBkaWFsLW9mZiBsb2dzIGRlZ3JhZGUgdG8gYCdzdGFnZSdgXG4gICAqICAgYmVoYXZpb3IgZXhhY3RseSwgbmV2ZXIgdG8gc2lsZW5jZS5cbiAgICovXG4gIGVkZ2VBdHRyaWJ1dGlvbj86ICdzdGFnZScgfCAncGVyLXdyaXRlJztcbiAgLyoqXG4gICAqICNQMSDigJQgdGhlIHdyaXR0ZW4ga2V5cyB0aGF0IGFuY2hvciB0aGUgUk9PVCdzIGV4cGFuc2lvbiB1bmRlclxuICAgKiBgJ3Blci13cml0ZSdgIChlLmcuIGBzbGljZUZvcktleWAgcGFzc2VzIHRoZSBzbGljZWQga2V5LCBzbyB0aGUgcm9vdFxuICAgKiBleHBhbmRzIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIFRIQVQgd3JpdGUsIG5vdCB0aGUgd2hvbGUgc3RhZ2UpLlxuICAgKiBJZ25vcmVkIHVuZGVyIGAnc3RhZ2UnYC4gVW5zZXQg4oaSIHJvb3QgZXhwYW5kcyBhdCBzdGFnZSBsZXZlbC5cbiAgICovXG4gIHJvb3RMaW5rS2V5cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENhbGxiYWNrIHRoYXQgcmV0dXJucyB0aGUga2V5cyBhIHN0YWdlIHJlYWQgZHVyaW5nIGV4ZWN1dGlvbi5cbiAqIFRoZSBiYWNrdHJhY2tlciBjYWxscyB0aGlzIGZvciBlYWNoIHZpc2l0ZWQgbm9kZSB0byBkZXRlcm1pbmVcbiAqIHdoaWNoIHJlYWTihpJ3cml0ZSBlZGdlcyB0byBmb2xsb3cuXG4gKlxuICogSW1wbGVtZW50b3JzOiBRdWFsaXR5UmVjb3JkZXIgdHJhY2tzIGtleXNSZWFkIHBlciBzdGVwLFxuICogb3IgYnVpbGQgYSBNYXA8cnVudGltZVN0YWdlSWQsIHN0cmluZ1tdPiBmcm9tIFNjb3BlUmVjb3JkZXIub25SZWFkIGV2ZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgS2V5c1JlYWRMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gc3RyaW5nW107XG5cbi8vIOKUgOKUgCBTdGFnZWQgb3B0aW1pemF0aW9uOiB3cml0ZXIgbG9va3VwIHN0cmF0ZWdpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhyZXNob2xkIGZvciBzd2l0Y2hpbmcgZnJvbSBsaW5lYXIgc2NhbiB0byByZXZlcnNlIGluZGV4LlxuICogQmVsb3cgdGhpcywgTyhOKSBzY2FuIGlzIGZhc3RlciAobm8gaW5kZXggYnVpbGQgY29zdCkuXG4gKiBBYm92ZSB0aGlzLCBPKGxvZyBOKSBiaW5hcnkgc2VhcmNoIHdpbnMuXG4gKi9cbmNvbnN0IFJFVkVSU0VfSU5ERVhfVEhSRVNIT0xEID0gMjU2O1xuXG4vKipcbiAqIFdyaXRlciBsb29rdXAgZnVuY3Rpb24gc2lnbmF0dXJlLlxuICogUmV0dXJucyB0aGUgQ29tbWl0QnVuZGxlIHRoYXQgbGFzdCB3cm90ZSBga2V5YCBiZWZvcmUgcG9zaXRpb24gYGJlZm9yZUlkeGAuXG4gKi9cbnR5cGUgV3JpdGVyTG9va3VwID0gKGtleTogc3RyaW5nLCBiZWZvcmVJZHg6IG51bWJlcikgPT4gQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkO1xuXG4vKiogU3RyYXRlZ3kgMTogTGluZWFyIHNjYW4g4oCUIE8oTikgcGVyIGxvb2t1cCwgemVybyBzZXR1cCBjb3N0LiAqL1xuZnVuY3Rpb24gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgcmV0dXJuIChrZXksIGJlZm9yZUlkeCkgPT4gZmluZExhc3RXcml0ZXIoY29tbWl0TG9nLCBrZXksIGJlZm9yZUlkeCk7XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgMjogUmV2ZXJzZSBpbmRleCDigJQgb25lIE8ocm93cykgYnVpbGQsIE8oZGVwdGggKyBsb2cgTikgcGVyIGxvb2t1cC5cbiAqIFRoZSBsb2cncyByZWFkIG1vZGVsIChgbG9nTW9kZWwudHNgOiBhIHBhdGggdHJpZSwgZWFjaCB0b3AtbGV2ZWwga2V5IGZvbGRlZCBhdFxuICogbW9zdCBvbmNlKSBhbnN3ZXJzIHRoZSB3cml0ZXIgcnVsZSDigJQgcm93cyBvbiwgaW5zaWRlIG9yIGFyb3VuZCB0aGUga2V5IOKAlCBieVxuICogYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGxhc3Qgd3JpdGUgb24gb3IgaW5zaWRlIGl0LCB0aGVuIGEgdmVyZGljdCBvbmx5IGZvciB0aGVcbiAqIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0LiBUaGUgc2FtZSBhbnN3ZXIgYGZpbmRMYXN0V3JpdGVyYCBnaXZlcywgc28gdGhlXG4gKiBzdHJhdGVneSBzd2l0Y2ggYmVsb3cgbmV2ZXIgY2hhbmdlcyBhIHNsaWNlLlxuICovXG5mdW5jdGlvbiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIGNvbnN0IG1vZGVsID0gbG9nTW9kZWwoY29tbWl0TG9nKTtcbiAgcmV0dXJuIChrZXk6IHN0cmluZywgYmVmb3JlSWR4OiBudW1iZXIpOiBDb21taXRCdW5kbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGF0ID0gbW9kZWwubGFzdFdyaXRlckJlZm9yZShrZXksIGJlZm9yZUlkeCk7XG4gICAgcmV0dXJuIGF0ID49IDAgPyBjb21taXRMb2dbYXRdIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSB0cmFjZSBlbnRyaWVzIG9mIGBjb21taXRgIHRoYXQgbWFrZSBpdCBhIHdyaXRlciBvZiBgbGlua0tleWAg4oCUIHRoZSBlbnRyaWVzIHdob3NlIHJlYWRcbiAqIHByZWZpeCAoYFRyYWNlRW50cnkucmVhZEtleXNgKSBhIHBlci13cml0ZSBlZGdlIGV4cGFuZHMgdGhyb3VnaC4gVGhlIEZJUlNUIGVudHJ5IG9uIHRoZSBleGFjdFxuICogcGF0aCB3aGVuIHRoZXJlIGlzIG9uZSAodGhlICNQMSBiZWhhdmlvdXIsIHVuY2hhbmdlZCk7IG90aGVyd2lzZSBldmVyeSBlbnRyeSBpbnNpZGUgb3IgYXJvdW5kXG4gKiB0aGUga2V5ICg5LjMzLjA6IHRoZSBjb21taXQgd3JvdGUgdGhlIGtleSB0aHJvdWdoIGEgbmVzdGVkIHJvdyDigJQgYSBzdWJmbG93IHNlZWQsIGFuXG4gKiBvdXRwdXRNYXBwZXIgbWVyZ2UtYmFjayDigJQgYW5kIGFsbCBvZiB0aG9zZSByb3dzIHdyb3RlIGl0KS5cbiAqL1xuZnVuY3Rpb24gbGlua2luZ0VudHJpZXMoY29tbWl0OiBDb21taXRCdW5kbGUsIGxpbmtLZXk6IHN0cmluZyk6IFRyYWNlRW50cnlbXSB7XG4gIGNvbnN0IGV4YWN0ID0gY29tbWl0LnRyYWNlLmZpbmQoKHQpID0+IHQucGF0aCA9PT0gbGlua0tleSk7XG4gIGlmIChleGFjdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gW2V4YWN0XTtcbiAgcmV0dXJuIGNvbW1pdC50cmFjZS5maWx0ZXIoKHQpID0+IHJlbGF0aW9uKHQucGF0aCwgbGlua0tleSkgIT09IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogU3RhZ2VkIG9wdGltaXphdGlvbjogcGljayB0aGUgcmlnaHQgd3JpdGVyLWxvb2t1cCBzdHJhdGVneSBiYXNlZCBvbiBkYXRhIHNpemUuXG4gKlxuICogTGlrZSBhIGRhdGFiYXNlIHF1ZXJ5IG9wdGltaXplciBjaG9vc2luZyBiZXR3ZWVuIHNlcXVlbnRpYWwgc2NhbiBhbmQgaW5kZXggc2NhbjpcbiAqXG4gKiAtICoqU21hbGwgbG9nICjiiaQgMjU2KToqKiBMaW5lYXIgc2NhbiB3aW5zLiBaZXJvIHNldHVwIGNvc3QsIGdvb2QgY2FjaGUgbG9jYWxpdHkuXG4gKiAgIFRoZSBvdmVyaGVhZCBvZiBidWlsZGluZyBhIHJldmVyc2UgaW5kZXggaXNuJ3Qgd29ydGggaXQgZm9yIHNob3J0IGxvZ3MuXG4gKlxuICogLSAqKkxhcmdlIGxvZyAoPiAyNTYpOioqIFJldmVyc2UgaW5kZXggd2lucy4gTyhOw5dVKSB1cGZyb250IGJ1aWxkIGNvc3QgaXMgYW1vcnRpemVkXG4gKiAgIGFjcm9zcyBhbGwgQkZTIGhvcHMuIEVhY2ggbG9va3VwIGJlY29tZXMgTyhsb2cgTikgdmlhIGJpbmFyeSBzZWFyY2ggaW5zdGVhZCBvZiBPKE4pLlxuICogICBGb3IgYW4gYWdlbnQgbG9vcCB3aXRoIDUwMCBpdGVyYXRpb25zIGFuZCA1IGtleXMgcGVyIGhvcCwgdGhpcyBpcyA1MDDDlzXDl2xvZyg1MDAp4omIMjJLIG9wc1xuICogICB2cyA1MDDDlzXDlzUwMD0xLjI1TSBvcHMgd2l0aCBsaW5lYXIgc2Nhbi5cbiAqXG4gKiBUaGUgY2FsbGVyIG5ldmVyIHNlZXMgdGhpcyDigJQgYGNhdXNhbENoYWluKClgIHBpY2tzIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPD0gUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQpIHtcbiAgICByZXR1cm4gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2cpO1xuICB9XG4gIHJldHVybiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nKTtcbn1cblxuLy8g4pSA4pSAIENvcmUgYWxnb3JpdGhtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJGQy0wMDMgRDI6IHRoZSBgaW5jb21wbGV0ZVNvdXJjZXNgIG5vZGUgZnJhZ21lbnQgZm9yIGEgY29tbWl0IOKAlCBge31gXG4gKiB3aGVuIHRoZSBzdGFnZSBjb25zdW1lZCBubyB1bnRyYWNrZWQgcmVhZCBwYXRocywga2VlcGluZyB0aGUgZmllbGRcbiAqIEFCU0VOVCAobm90IGVtcHR5LWFycmF5LXZhbHVlZCkgZm9yIGZ1bGx5LXRyYWNrZWQgc3RhZ2VzLlxuICovXG5mdW5jdGlvbiBpbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KGNvbW1pdDogQ29tbWl0QnVuZGxlKTogeyBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPiB9IHtcbiAgaWYgKCFjb21taXQudW50cmFja2VkU291cmNlcyB8fCBjb21taXQudW50cmFja2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybiB7fTtcbiAgcmV0dXJuIHsgaW5jb21wbGV0ZVNvdXJjZXM6IGNvbW1pdC51bnRyYWNrZWRTb3VyY2VzIH07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGNhdXNhbCBEQUcgcm9vdGVkIGF0IGBzdGFydElkYCBieSB3YWxraW5nIGJhY2t3YXJkc1xuICogdGhyb3VnaCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgb3B0aW1hbCB3cml0ZXIgbG9va3VwIHN0cmF0ZWd5OlxuICogLSBMaW5lYXIgc2NhbiBmb3Igc21hbGwgbG9ncyAo4omkIDI1NiBjb21taXRzKVxuICogLSBSZXZlcnNlIGluZGV4IHdpdGggYmluYXJ5IHNlYXJjaCBmb3IgbGFyZ2UgbG9ncyAoPiAyNTYgY29tbWl0cylcbiAqXG4gKiBQcm9kdWNlcyBhIERBRyAobm90IGEgdHJlZSk6IGlmIHR3byBjaGlsZHJlbiBib3RoIHJlYWQgZnJvbSB0aGUgc2FtZVxuICogcGFyZW50LCB0aGUgcGFyZW50IG5vZGUgaXMgc2hhcmVkIChkZWR1cGVkIGJ5IHJ1bnRpbWVTdGFnZUlkKS5cbiAqXG4gKiBAcGFyYW0gY29tbWl0TG9nICAgT3JkZXJlZCBjb21taXQgYnVuZGxlcyBmcm9tIGV4ZWN1dG9yLmdldFNuYXBzaG90KCkuY29tbWl0TG9nXG4gKiBAcGFyYW0gc3RhcnRJZCAgICAgcnVudGltZVN0YWdlSWQgdG8gc3RhcnQgYmFja3RyYWNraW5nIGZyb21cbiAqIEBwYXJhbSBnZXRLZXlzUmVhZCBDYWxsYmFjayByZXR1cm5pbmcga2V5cyByZWFkIGJ5IGEgZ2l2ZW4gZXhlY3V0aW9uIHN0ZXBcbiAqIEBwYXJhbSBvcHRpb25zICAgICBEZXB0aCBhbmQgbm9kZSBsaW1pdHNcbiAqIEByZXR1cm5zIFJvb3QgQ2F1c2FsTm9kZSB3aXRoIC5wYXJlbnRzIGZvcm1pbmcgdGhlIERBRywgb3IgdW5kZWZpbmVkIGlmIHN0YXJ0SWQgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXVzYWxDaGFpbihcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBnZXRLZXlzUmVhZDogS2V5c1JlYWRMb29rdXAsXG4gIG9wdGlvbnM/OiBDYXVzYWxDaGFpbk9wdGlvbnMsXG4pOiBDYXVzYWxOb2RlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGJ1aWxkQ2F1c2FsQ2hhaW4oY29tbWl0TG9nLCBzdGFydElkLCBnZXRLZXlzUmVhZCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgc2xpY2UgY29tcG9zaXRpb246IGtlZXAgdGhlIGFjdHVhbCBidW5kbGUgc2VsZWN0ZWQgYnkgdGhlIHdyaXRlclxuICogcXVlcnkgKGluY2x1ZGluZyBhIG5vbmVtcHR5IGNvbnRpbnVhdGlvbikuIFRoaXMgaXMgbm90IGEgcHVibGljIGVudHJ5IHBvaW50LlxuICogVGhlIHJlYWQgcG9zaXRpb24gc3RpbGwgYmVsb25ncyB0byB0aGUgZXhlY3V0aW9uJ3MgZmlyc3QgY29tbWl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2F1c2FsQ2hhaW5Gcm9tQ29tbWl0KFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICB3cml0ZXI6IENvbW1pdEJ1bmRsZSxcbiAgZ2V0S2V5c1JlYWQ6IEtleXNSZWFkTG9va3VwLFxuICBvcHRpb25zPzogQ2F1c2FsQ2hhaW5PcHRpb25zLFxuKTogQ2F1c2FsTm9kZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBidWlsZENhdXNhbENoYWluKGNvbW1pdExvZywgd3JpdGVyLnJ1bnRpbWVTdGFnZUlkLCBnZXRLZXlzUmVhZCwgb3B0aW9ucywgd3JpdGVyKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDYXVzYWxDaGFpbihcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBnZXRLZXlzUmVhZDogS2V5c1JlYWRMb29rdXAsXG4gIG9wdGlvbnM/OiBDYXVzYWxDaGFpbk9wdGlvbnMsXG4gIHNlbGVjdGVkV3JpdGVyPzogQ29tbWl0QnVuZGxlLFxuKTogQ2F1c2FsTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1heERlcHRoID0gb3B0aW9ucz8ubWF4RGVwdGggPz8gMjA7XG4gIGNvbnN0IG1heE5vZGVzID0gb3B0aW9ucz8ubWF4Tm9kZXMgPz8gMTAwO1xuICBjb25zdCBjb250cm9sRGVwcyA9IG9wdGlvbnM/LmNvbnRyb2xEZXBzO1xuICBjb25zdCB3ZWlnaCA9IG9wdGlvbnM/LndlaWdoO1xuICBjb25zdCBwZXJXcml0ZSA9IG9wdGlvbnM/LmVkZ2VBdHRyaWJ1dGlvbiA9PT0gJ3Blci13cml0ZSc7XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5LiBTZXQgb25seSB3aGVuIGEgbGltaXQgYWN0dWFsbHlcbiAgLy8gY3V0cyB0aGUgc2xpY2U7IHN1cmZhY2VkIG9uIHRoZSByb290IGFzIGB0cnVuY2F0ZWRgIHNvIGEgY29uc3VtZXIgY2FuXG4gIC8vIG5ldmVyIG1pc3Rha2UgYSB0cnVuY2F0ZWQgc2xpY2UgZm9yIGEgY29tcGxldGUgb25lLlxuICBsZXQgdHJ1bmNhdGVkQnlEZXB0aCA9IGZhbHNlO1xuICBsZXQgdHJ1bmNhdGVkQnlOb2RlcyA9IGZhbHNlO1xuXG4gIC8vIEEgY29udGludWF0aW9uIG1heSB3cml0ZSBtb3JlIGRhdGEsIGJ1dCBpdCBpcyBub3QgYW5vdGhlciBleGVjdXRpb24gb2ZcbiAgLy8gdGhlIHN0YWdlJ3MgcmVhZHMuIFVzZSB0aGUgc2hhcmVkIEZJUlNULWNvbW1pdCBydWxlIGZvciBldmVyeSByZWFkIGN1dG9mZjtcbiAgLy8ga2VlcCB3cml0ZXIgYnVuZGxlcyBzZXBhcmF0ZWx5IGZvciB0aGVpciB3cml0ZSBtZXRhZGF0YSBhbmQgcmVhZCBwcmVmaXhlcy5cbiAgY29uc3QgaWR4TWFwID0gYnVpbGRDb21taXRJbmRleChjb21taXRMb2cpO1xuICBxdWVyeVdvcmsudW5pdHMgKz0gY29tbWl0TG9nLmxlbmd0aDtcblxuICBjb25zdCBzdGFydElkeCA9IGlkeE1hcC5nZXQoc3RhcnRJZCk7XG4gIGlmIChzdGFydElkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN0YXJ0Q29tbWl0ID0gc2VsZWN0ZWRXcml0ZXIgPz8gY29tbWl0TG9nW3N0YXJ0SWR4XTtcblxuICAvLyBQaWNrIHdyaXRlciBsb29rdXAgc3RyYXRlZ3kgYmFzZWQgb24gbG9nIHNpemVcbiAgY29uc3QgZmluZFdyaXRlciA9IGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2cpO1xuXG4gIC8vIE5vZGUgZGVkdXAgbWFwOiBydW50aW1lU3RhZ2VJZCDihpIgQ2F1c2FsTm9kZSAoZW5zdXJlcyBEQUcsIG5vdCB0cmVlKVxuICBjb25zdCBub2RlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENhdXNhbE5vZGU+KCk7XG5cbiAgY29uc3Qgcm9vdDogQ2F1c2FsTm9kZSA9IHtcbiAgICBydW50aW1lU3RhZ2VJZDogc3RhcnRJZCxcbiAgICBzdGFnZUlkOiBzdGFydENvbW1pdC5zdGFnZUlkLFxuICAgIHN0YWdlTmFtZTogc3RhcnRDb21taXQuc3RhZ2UsXG4gICAga2V5c1dyaXR0ZW46IHN0YXJ0Q29tbWl0LnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSxcbiAgICBsaW5rZWRCeTogJycsXG4gICAgZGVwdGg6IDAsXG4gICAgcGFyZW50czogW10sXG4gICAgcGFyZW50RWRnZXM6IFtdLFxuICAgIC4uLmluY29tcGxldGVTb3VyY2VzRnJhZ21lbnQoc3RhcnRDb21taXQpLFxuICB9O1xuICBub2RlTWFwLnNldChzdGFydElkLCByb290KTtcblxuICAvLyDilIDilIAgI1AxIHBlci13cml0ZSBhdHRyaWJ1dGlvbiBtYWNoaW5lcnkgKGluZXJ0IHVuZGVyICdzdGFnZScpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBleHBhbmRlZFJlYWRzOiBwZXIgbm9kZSwgdGhlIHJlYWRzIGFscmVhZHkgcXVldWVkIGZvciBleHBhbnNpb24g4oCUIGxhdGVcbiAgLy8gbGlua3MgdmlhIGFkZGl0aW9uYWwga2V5cyByZS1lbnF1ZXVlIG9ubHkgdGhlIERFTFRBLCBzbyB0aGUgc2xpY2UgZ3Jvd3NcbiAgLy8gbW9ub3RvbmljYWxseSB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcgYW5kIHRlcm1pbmF0ZXMgKGVhY2gga2V5XG4gIC8vIGV4cGFuZHMgYXQgbW9zdCBvbmNlIHBlciBub2RlKS4gZnVsbHlFeHBhbmRlZDogbm9kZXMgdGhhdCBmZWxsIGJhY2sgdG9cbiAgLy8gc3RhZ2UgbGV2ZWwgKG5vIHJlYWRLZXlzIG9uIGEgbGlua2luZyBlbnRyeSkg4oCUIG5vdGhpbmcgbGVmdCB0byBhZGQuXG4gIGNvbnN0IGV4cGFuZGVkUmVhZHMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gIGNvbnN0IGZ1bGx5RXhwYW5kZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUmVzb2x2ZSBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgZm9yIHRoZSBnaXZlbiBsaW5raW5nIFdSSVRURU4ga2V5cy5cbiAgICogUGVyLXdyaXRlIG1vZGUgd2l0aCBwcm92ZW5hbmNlIHByZXNlbnQg4oaSIHVuaW9uIG9mIHRoZSBsaW5raW5nIHdyaXRlcydcbiAgICogdGVtcG9yYWwtcHJlZml4IGByZWFkS2V5c2AuIEFueSBsaW5raW5nIGVudHJ5IFdJVEhPVVQgYHJlYWRLZXlzYCAob3Igbm9cbiAgICogbGlua0tleXMgYXQgYWxsKSDihpIgaG9uZXN0IHN0YWdlLWxldmVsIGZhbGxiYWNrLCBmbGFnZ2VkIHZpYSB0aGUgc2Vjb25kXG4gICAqIHR1cGxlIG1lbWJlciBzbyB0aGUgY2FsbGVyIG1hcmtzIHRoZSBub2RlIGZ1bGx5IGV4cGFuZGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHNGb3JMaW5rcyhjb21taXQ6IENvbW1pdEJ1bmRsZSwgbGlua0tleXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogW3N0cmluZ1tdLCBib29sZWFuXSB7XG4gICAgaWYgKCFwZXJXcml0ZSB8fCAhbGlua0tleXMgfHwgbGlua0tleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgIH1cbiAgICBjb25zdCB1bmlvbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbGlua0tleSBvZiBsaW5rS2V5cykge1xuICAgICAgY29uc3QgZW50cmllcyA9IGxpbmtpbmdFbnRyaWVzKGNvbW1pdCwgbGlua0tleSk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDAgfHwgZW50cmllcy5zb21lKChlKSA9PiBlLnJlYWRLZXlzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8vIE1peGVkL2RpYWwtb2ZmIGxvZyDigJQgZGVncmFkZSBUSElTIG5vZGUgdG8gc3RhZ2UgbGV2ZWwsIGhvbmVzdGx5LlxuICAgICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSBmb3IgKGNvbnN0IHJrIG9mIGVudHJ5LnJlYWRLZXlzIGFzIHN0cmluZ1tdKSB1bmlvbi5hZGQocmspO1xuICAgIH1cbiAgICByZXR1cm4gW1suLi51bmlvbl0sIGZhbHNlXTtcbiAgfVxuXG4gIC8vIEJGUy93b3JrbGlzdCBxdWV1ZTogW25vZGUsIGNvbW1pdElkeCwgZGVwdGgsIGtleXNUb0V4cGFuZF1cbiAgY29uc3QgW3Jvb3RSZWFkcywgcm9vdElzRnVsbF0gPSBwZXJXcml0ZVxuICAgID8gcmVhZHNGb3JMaW5rcyhzdGFydENvbW1pdCwgb3B0aW9ucz8ucm9vdExpbmtLZXlzKVxuICAgIDogW2dldEtleXNSZWFkKHN0YXJ0SWQpLCB0cnVlXTtcbiAgZXhwYW5kZWRSZWFkcy5zZXQoc3RhcnRJZCwgbmV3IFNldChyb290UmVhZHMpKTtcbiAgaWYgKHJvb3RJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHN0YXJ0SWQpO1xuICBjb25zdCBxdWV1ZTogQXJyYXk8W0NhdXNhbE5vZGUsIG51bWJlciwgbnVtYmVyLCBzdHJpbmdbXV0+ID0gW1tyb290LCBzdGFydElkeCwgMCwgcm9vdFJlYWRzXV07XG4gIGxldCB2aXNpdGVkID0gMTtcblxuICAvKipcbiAgICogTGluayBgbm9kZSDihpIgcGFyZW50YCAoY3JlYXRpbmcgKyBlbnF1ZXVlaW5nIHRoZSBwYXJlbnQgd2hlbiBuZXcpLlxuICAgKiBTaGFyZWQgYnkgZGF0YS1lZGdlIGV4cGFuc2lvbiAocmVhZOKGkndyaXRlKSBhbmQgY29udHJvbC1lZGdlIGV4cGFuc2lvblxuICAgKiAoRDMpLiBPbmUgQ2F1c2FsRWRnZSBwZXIgZGlzdGluY3QgKHBhcmVudCwga2luZCwga2V5KSBsaW5rOyBgcGFyZW50c2BcbiAgICoga2VlcHMgaXRzIGhpc3RvcmljYWwgb25lLWVudHJ5LXBlci1wYXJlbnQgZGVkdXAuXG4gICAqL1xuICBmdW5jdGlvbiBsaW5rUGFyZW50KFxuICAgIG5vZGU6IENhdXNhbE5vZGUsXG4gICAgcGFyZW50Q29tbWl0OiBDb21taXRCdW5kbGUsXG4gICAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnLFxuICAgIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlcHRoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudElkID0gcGFyZW50Q29tbWl0LnJ1bnRpbWVTdGFnZUlkO1xuICAgIC8vIHRoZSBkZWR1cCBzY2FucyBiZWxvdywgYW5kIHRoZSBwYXJlbnQncyB0cmFjZSB3aGVuIGl0IGlzIG5ldyDigJQgY291bnRlZCBmb3IgdGhlIHNjYWxpbmcgdGVzdFxuICAgIHF1ZXJ5V29yay51bml0cyArPSAxICsgbm9kZS5wYXJlbnRzLmxlbmd0aCArIG5vZGUucGFyZW50RWRnZXMubGVuZ3RoO1xuICAgIC8vICNQMTogdGhlIHBhcmVudCdzIGV4cGFuc2lvbiByZWFkcywgcmVzb2x2ZWQgTEFaSUxZIChvbmx5IGZvciBuZXcgbm9kZXNcbiAgICAvLyBvciBwZXItd3JpdGUgcmUtZXhwYW5zaW9uIOKAlCBkdXBsaWNhdGUgbGlua3MgdW5kZXIgJ3N0YWdlJyBwYXkgbm90aGluZykuXG4gICAgLy8gRGF0YSBsaW5rcyBleHBhbmQgdGhyb3VnaCB0aGUgcmVhZHMgdGhhdCBmZWQgdGhlIHBhcmVudCdzIHdyaXRlIG9mXG4gICAgLy8gYGtleWA7IGNvbnRyb2wgbGlua3MgZXhwYW5kIHRoZSBkZWNpZGVyIGF0IHN0YWdlIGxldmVsIChhIGRlY2lzaW9uXG4gICAgLy8gZGVwZW5kcyBvbiBldmVyeXRoaW5nIGl0IHJlYWQpLlxuICAgIGNvbnN0IHJlc29sdmVMaW5rUmVhZHMgPSAoKTogW3N0cmluZ1tdLCBib29sZWFuXSA9PlxuICAgICAga2luZCA9PT0gJ2RhdGEnXG4gICAgICAgID8gcmVhZHNGb3JMaW5rcyhwYXJlbnRDb21taXQsIGtleSAhPT0gdW5kZWZpbmVkID8gW2tleV0gOiB1bmRlZmluZWQpXG4gICAgICAgIDogW2dldEtleXNSZWFkKHBhcmVudElkKSwgdHJ1ZV07XG5cbiAgICBsZXQgcGFyZW50Tm9kZSA9IG5vZGVNYXAuZ2V0KHBhcmVudElkKTtcbiAgICBpZiAoIXBhcmVudE5vZGUpIHtcbiAgICAgIC8vIE5ldyBub2RlIOKAlCBjcmVhdGUgYW5kIGVucXVldWUgKHJlc3BlY3RpbmcgdGhlIG5vZGUgYnVkZ2V0KVxuICAgICAgaWYgKHZpc2l0ZWQgPj0gbWF4Tm9kZXMpIHtcbiAgICAgICAgdHJ1bmNhdGVkQnlOb2RlcyA9IHRydWU7IC8vIEQ0OiBhIGRpc2NvdmVyZWQgcGFyZW50IHdhcyBkcm9wcGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50SWR4ID0gaWR4TWFwLmdldChwYXJlbnRJZCk7XG4gICAgICBpZiAocGFyZW50SWR4ID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHBhcmVudENvbW1pdC50cmFjZS5sZW5ndGg7XG4gICAgICBwYXJlbnROb2RlID0ge1xuICAgICAgICBydW50aW1lU3RhZ2VJZDogcGFyZW50SWQsXG4gICAgICAgIHN0YWdlSWQ6IHBhcmVudENvbW1pdC5zdGFnZUlkLFxuICAgICAgICBzdGFnZU5hbWU6IHBhcmVudENvbW1pdC5zdGFnZSxcbiAgICAgICAga2V5c1dyaXR0ZW46IHBhcmVudENvbW1pdC50cmFjZS5tYXAoKHQpID0+IHQucGF0aCksXG4gICAgICAgIC8vIGxpbmtlZEJ5IHN0YXlzIGEgREFUQS1rZXkgY29uY2VwdCAoYmFjay1jb21wYXQpIOKAlCBjb250cm9sLWxpbmtlZFxuICAgICAgICAvLyBub2RlcyBjYXJyeSB0aGVpciBsYWJlbCBvbiB0aGUgZWRnZSBpbnN0ZWFkLlxuICAgICAgICBsaW5rZWRCeToga2luZCA9PT0gJ2RhdGEnID8ga2V5ID8/ICcnIDogJycsXG4gICAgICAgIGRlcHRoOiBkZXB0aCArIDEsXG4gICAgICAgIHBhcmVudHM6IFtdLFxuICAgICAgICBwYXJlbnRFZGdlczogW10sXG4gICAgICAgIC4uLmluY29tcGxldGVTb3VyY2VzRnJhZ21lbnQocGFyZW50Q29tbWl0KSxcbiAgICAgIH07XG4gICAgICBub2RlTWFwLnNldChwYXJlbnRJZCwgcGFyZW50Tm9kZSk7XG4gICAgICB2aXNpdGVkKys7XG4gICAgICBjb25zdCBbbGlua1JlYWRzLCBsaW5rSXNGdWxsXSA9IHJlc29sdmVMaW5rUmVhZHMoKTtcbiAgICAgIGV4cGFuZGVkUmVhZHMuc2V0KHBhcmVudElkLCBuZXcgU2V0KGxpbmtSZWFkcykpO1xuICAgICAgaWYgKGxpbmtJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHBhcmVudElkKTtcbiAgICAgIHF1ZXVlLnB1c2goW3BhcmVudE5vZGUsIHBhcmVudElkeCwgZGVwdGggKyAxLCBsaW5rUmVhZHNdKTtcbiAgICB9IGVsc2UgaWYgKHBlcldyaXRlICYmICFmdWxseUV4cGFuZGVkLmhhcyhwYXJlbnRJZCkpIHtcbiAgICAgIC8vICNQMSB3b3JrbGlzdDogYW4gRVhJU1RJTkcgbm9kZSBsaW5rZWQgdmlhIGFub3RoZXIga2V5IG1heSBvd2UgbW9yZVxuICAgICAgLy8gZXhwYW5zaW9uIOKAlCBlbnF1ZXVlIG9ubHkgdGhlIHJlYWRzIG5vdCB5ZXQgZXhwYW5kZWQgKG1vbm90b25lOyB0aGVcbiAgICAgIC8vIG5vZGUgYnVkZ2V0IGlzIHVudG91Y2hlZCwgbm8gbm9kZSBpcyBjcmVhdGVkKS4gUmUtZXhwYW5zaW9uIGtlZXBzXG4gICAgICAvLyB0aGUgbm9kZSdzIE9SSUdJTkFMIGRlcHRoIHNvIGl0cyBwYXJlbnRzIGdldCBhIGNvbnNpc3RlbnQgZGVwdGgrMS5cbiAgICAgIGNvbnN0IFtsaW5rUmVhZHMsIGxpbmtJc0Z1bGxdID0gcmVzb2x2ZUxpbmtSZWFkcygpO1xuICAgICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRlZFJlYWRzLmdldChwYXJlbnRJZCkhO1xuICAgICAgY29uc3QgZGVsdGEgPSBsaW5rUmVhZHMuZmlsdGVyKChrKSA9PiAhZXhwYW5kZWQuaGFzKGspKTtcbiAgICAgIGlmIChsaW5rSXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChwYXJlbnRJZCk7XG4gICAgICBpZiAoZGVsdGEubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgZGVsdGEpIGV4cGFuZGVkLmFkZChrKTtcbiAgICAgICAgY29uc3QgcGFyZW50SWR4ID0gaWR4TWFwLmdldChwYXJlbnRJZCk7XG4gICAgICAgIGlmIChwYXJlbnRJZHggIT09IHVuZGVmaW5lZCkgcXVldWUucHVzaChbcGFyZW50Tm9kZSwgcGFyZW50SWR4LCBwYXJlbnROb2RlLmRlcHRoLCBkZWx0YV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERBRyBtZXJnZTogb25lIHBhcmVudHNbXSBlbnRyeSBwZXIgZGlzdGluY3QgcGFyZW50IChoaXN0b3JpY2FsIHNoYXBlKVxuICAgIGlmICghbm9kZS5wYXJlbnRzLnNvbWUoKHApID0+IHAucnVudGltZVN0YWdlSWQgPT09IHBhcmVudElkKSkge1xuICAgICAgbm9kZS5wYXJlbnRzLnB1c2gocGFyZW50Tm9kZSk7XG4gICAgfVxuICAgIC8vIE9uZSBlZGdlIHBlciBkaXN0aW5jdCAocGFyZW50LCBraW5kLCBrZXkpIGxpbmsuIFRoZSB3ZWlnaGVyIChENClcbiAgICAvLyBzdGFtcHMgdGhlIHdlaWdodCBhdCBjcmVhdGlvbjsgYHVuZGVmaW5lZGAg4oaSIDEuMCDigJQgdGhlIGVuZ2luZSBuZXZlclxuICAgIC8vIGNvbXB1dGVzIHdlaWdodHMgaXRzZWxmLlxuICAgIGlmICghbm9kZS5wYXJlbnRFZGdlcy5zb21lKChlKSA9PiBlLnBhcmVudC5ydW50aW1lU3RhZ2VJZCA9PT0gcGFyZW50SWQgJiYgZS5raW5kID09PSBraW5kICYmIGUua2V5ID09PSBrZXkpKSB7XG4gICAgICAvLyBFcnJvciBpc29sYXRpb24gKHJldmlldyBmaW5kaW5nKTogYSBjb25zdW1lciB3ZWlnaGVyIHRoYXQgdGhyb3dzXG4gICAgICAvLyBtdXN0IGRlZ3JhZGUgdG8gdGhlIGRlZmF1bHQgd2VpZ2h0LCBuZXZlciBjcmFzaCB0aGUgc2xpY2Ug4oCUIHRoZVxuICAgICAgLy8gc2FtZSBjb250cmFjdCBldmVyeSBvdGhlciBjb25zdW1lciBjYWxsYmFjayBpbiB0aGUgbGlicmFyeSBnZXRzLlxuICAgICAgbGV0IHdlaWdodCA9IDEuMDtcbiAgICAgIGlmICh3ZWlnaCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHdlaWdodCA9IHdlaWdoKG5vZGUsIHBhcmVudE5vZGUsIGtleSwga2luZCkgPz8gMS4wO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvKiB3ZWlnaGVyIHRocmV3IOKAlCBrZWVwIDEuMCwgdGhlIHNsaWNlIHN0YXlzIHVzYWJsZSAqL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBuZXN0ZWQgPSBraW5kID09PSAnZGF0YScgJiYga2V5ICE9PSB1bmRlZmluZWQgJiYgd3JpdGVzT25seUluc2lkZShwYXJlbnRDb21taXQsIGtleSk7XG4gICAgICBub2RlLnBhcmVudEVkZ2VzLnB1c2goe1xuICAgICAgICBwYXJlbnQ6IHBhcmVudE5vZGUsXG4gICAgICAgIGtpbmQsXG4gICAgICAgIGtleSxcbiAgICAgICAgd2VpZ2h0LFxuICAgICAgICAuLi4obmVzdGVkICYmIHsgYmFzaXM6ICduZXN0ZWQtcm93cycgYXMgY29uc3QgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IFtub2RlLCBjb21taXRJZHgsIGRlcHRoLCBrZXlzVG9FeHBhbmRdID0gcXVldWUuc2hpZnQoKSE7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IDEgKyBrZXlzVG9FeHBhbmQubGVuZ3RoO1xuXG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoKSB7XG4gICAgICAvLyBENDogb25seSBhIG5vZGUgdGhhdCBzdGlsbCBIQUQgc29tZXRoaW5nIHRvIGV4cGFuZCBjb3VudHMgYXMgYSBjdXRcbiAgICAgIC8vIChhIGxlYWYgYXQgdGhlIGhvcml6b24gdHJ1bmNhdGVzIG5vdGhpbmcpLlxuICAgICAgaWYgKGtleXNUb0V4cGFuZC5sZW5ndGggPiAwIHx8IGNvbnRyb2xEZXBzPy4obm9kZS5ydW50aW1lU3RhZ2VJZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnVuY2F0ZWRCeURlcHRoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERhdGEgZWRnZXM6IGZvciBlYWNoIGtleSBpbiB0aGlzIGV4cGFuc2lvbidzIHJlYWQtc2V0LCBmaW5kIHdobyB3cm90ZVxuICAgIC8vIGl0LiBVbmRlciAnc3RhZ2UnIHRoaXMgaXMgdGhlIG5vZGUncyBmdWxsIHJlYWQtc2V0IChoaXN0b3JpY2FsXG4gICAgLy8gYmVoYXZpb3IpOyB1bmRlciAncGVyLXdyaXRlJyBpdCBpcyB0aGUgbGlua2luZyB3cml0ZXMnIHRlbXBvcmFsIHByZWZpeFxuICAgIC8vIChvciBhIHdvcmtsaXN0IGRlbHRhIG9uIHJlLWV4cGFuc2lvbikuXG4gICAgY29uc3Qga2V5c1JlYWQgPSBrZXlzVG9FeHBhbmQ7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1JlYWQpIHtcbiAgICAgIGNvbnN0IHdyaXRlciA9IGZpbmRXcml0ZXIoa2V5LCBjb21taXRJZHgpO1xuICAgICAgaWYgKCF3cml0ZXIpIHtcbiAgICAgICAgLy8gRjRiOiBzYXkgd2h5IHRoZXJlIGlzIG5vIGVkZ2Ug4oCUIG5vIGNvbW1pdCBiZWZvcmUgdGhpcyBub2RlIHdyb3RlIHRoZSBrZXkuXG4gICAgICAgIG5vZGUucHJlUnVuUmVhZHMgPz89IHsgY29kZTogJ3ByZS1ydW4tb3JpZ2luJywga2V5czogW10gfTtcbiAgICAgICAgaWYgKCFub2RlLnByZVJ1blJlYWRzLmtleXMuaW5jbHVkZXMoa2V5KSkgbm9kZS5wcmVSdW5SZWFkcy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsaW5rUGFyZW50KG5vZGUsIHdyaXRlciwgJ2RhdGEnLCBrZXksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvLyBDb250cm9sIGVkZ2UgKFJGQy0wMDMgRDMpOiBsaW5rIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciwgbGFiZWxlZCBieSB0aGVcbiAgICAvLyBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudC4gVGhlIGRlY2lkZXIgbm9kZSB0aGVuIGV4cGFuZHNcbiAgICAvLyBub3JtYWxseSB0aHJvdWdoIGl0cyBvd24gZGF0YSByZWFkcyAoYW5kIGl0cyBvd24gY29udHJvbCBwYXJlbnQpLlxuICAgIGlmIChjb250cm9sRGVwcykge1xuICAgICAgY29uc3QgZGVwID0gY29udHJvbERlcHMobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG4gICAgICBpZiAoZGVwKSB7XG4gICAgICAgIGNvbnN0IGRlY2lkZXJJZHggPSBpZHhNYXAuZ2V0KGRlcC5kZWNpZGVySWQpO1xuICAgICAgICBpZiAoZGVjaWRlcklkeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbGlua1BhcmVudChub2RlLCBjb21taXRMb2dbZGVjaWRlcklkeF0sICdjb250cm9sJywgZGVwLmxhYmVsLCBkZXB0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSRkMtMDAzIEQ0IOKAlCB0cnVuY2F0aW9uIHZpc2liaWxpdHkgb24gdGhlIHJvb3QgKGFic2VudCB3aGVuIGNvbXBsZXRlKS4gSXQgaXMgREFUQSwgYW5kIG9ubHlcbiAgLy8gZGF0YTogYSByZWFkZXIgcmVhZHMgYHJvb3QudHJ1bmNhdGVkYCAoYW5kIGBmb3JtYXRDYXVzYWxDaGFpbmAgcHJpbnRzIGl0KTsgdGhlIHJlY29yZCB3cml0ZXMgbm9cbiAgLy8gY29uc29sZSBsaW5lICh0aGUgZGV2LW1vZGUgd2FybmluZyB3ZW50IGluIEM2IOKAlCB0aGUgcmVjb3JkIGltcG9ydHMgbm90aGluZyBvdXRzaWRlIGl0c2VsZikuXG4gIGlmICh0cnVuY2F0ZWRCeURlcHRoIHx8IHRydW5jYXRlZEJ5Tm9kZXMpIHtcbiAgICByb290LnRydW5jYXRlZCA9IHsgYnlEZXB0aDogdHJ1bmNhdGVkQnlEZXB0aCwgYnlOb2RlczogdHJ1bmNhdGVkQnlOb2RlcyB9O1xuICB9XG5cbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmxhdHRlbiB0aGUgY2F1c2FsIERBRyBpbnRvIGEgQkZTLW9yZGVyZWQgbGlzdCBvZiBub2Rlcy5cbiAqIEVhY2ggbm9kZSBhcHBlYXJzIGV4YWN0bHkgb25jZSAoZmlyc3Qgb2NjdXJyZW5jZSBieSBCRlMgb3JkZXIpLlxuICogVXNlZnVsIGZvciBsaW5lYXIgZGlzcGxheSBvciBpdGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQ2F1c2FsREFHKHJvb3Q6IENhdXNhbE5vZGUpOiBDYXVzYWxOb2RlW10ge1xuICBjb25zdCByZXN1bHQ6IENhdXNhbE5vZGVbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHF1ZXVlOiBDYXVzYWxOb2RlW10gPSBbcm9vdF07XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gcXVldWUuc2hpZnQoKSE7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSBjb250aW51ZTtcbiAgICB2aXNpdGVkLmFkZChub2RlLnJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXN1bHQucHVzaChub2RlKTtcblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhwYXJlbnQucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICAgIHF1ZXVlLnB1c2gocGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIGNhdXNhbCBEQUcgYXMgaHVtYW4tcmVhZGFibGUgaW5kZW50ZWQgdGV4dC5cbiAqIFNob3dzIHRoZSBkZXBlbmRlbmN5IGNoYWluIHdpdGggZGVwdGggaW5kZW50YXRpb24gYW5kIGxpbmtlZC1ieSBrZXlzLlxuICpcbiAqIFJGQy0wMDMgRDI6IG5vZGVzIHRoYXQgY29uc3VtZWQgdW50cmFja2VkIHJlYWQgcGF0aHMgcmVuZGVyIGFuIGV4dHJhXG4gKiBg4pqgIGFsc28gY29uc3VtZWQg4oCmIOKAlCBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLCBzbyBhIGNvbnN1bWVyXG4gKiAoaHVtYW4gb3IgTExNKSBkZWJ1Z2dpbmcgZnJvbSB0aGUgc2xpY2UgaXMgVE9MRCB3aGVuIGl0IGlzIGluY29tcGxldGUuXG4gKlxuICogUkZDLTAwMyBEMzogY29udHJvbCBlZGdlcyByZW5kZXIgYXMgYOKGkCBbY29udHJvbDogPHJ1bGUgbGFiZWw+XWBcbiAqIChsYWJlbCBvbWl0dGVkIHdoZW4gdGhlIGRlY2lzaW9uIGNhcnJpZWQgbm9uZSkuIERhdGEgcmVuZGVyaW5nIGlzXG4gKiBieXRlLWlkZW50aWNhbCB0byB0aGUgcHJlLUQzIG91dHB1dCDigJQgYOKGkCB2aWEgPGtleT5gIGZyb20gdGhlIG5vZGUnc1xuICogZGlzY292ZXJ5LXRpbWUgYGxpbmtlZEJ5YC5cbiAqXG4gKiBSRkMtMDAzIEQ0OiBlZGdlIHdlaWdodHMgZnJvbSB0aGUgYHdlaWdoYCBob29rIHJlbmRlciBhcyBhIHN1ZmZpeCDigJRcbiAqIGDihpAgdmlhIHN5c3RlbVByb21wdCAoMC4xOClgIOKAlCBvbmx5IHdoZW4g4omgIDEuMCwgc28gdW53ZWlnaHRlZCBvdXRwdXQgaXNcbiAqIHVuY2hhbmdlZC4gQSB0cnVuY2F0ZWQgc2xpY2UgKHJvb3QudHJ1bmNhdGVkKSBhcHBlbmRzIGEgZmluYWxcbiAqIGDimqAgc2xpY2UgdHJ1bmNhdGVkIOKApmAgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENhdXNhbENoYWluKHJvb3Q6IENhdXNhbE5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IHdlaWdodFN1ZmZpeCA9IChlZGdlOiBDYXVzYWxFZGdlIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+XG4gICAgZWRnZSAhPT0gdW5kZWZpbmVkICYmIGVkZ2Uud2VpZ2h0ICE9PSAxID8gYCAoJHtlZGdlLndlaWdodH0pYCA6ICcnO1xuXG4gIGZ1bmN0aW9uIHdhbGsobm9kZTogQ2F1c2FsTm9kZSwgaW5kZW50OiBudW1iZXIsIGVkZ2VzRnJvbUNoaWxkPzogQ2F1c2FsRWRnZVtdKTogdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl94oazICR7bm9kZS5ydW50aW1lU3RhZ2VJZH0gKHNlZSBhYm92ZSlgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlzaXRlZC5hZGQobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG5cbiAgICBjb25zdCBsaW5rUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5vZGUubGlua2VkQnkpIHtcbiAgICAgIGNvbnN0IGRhdGFFZGdlID0gZWRnZXNGcm9tQ2hpbGQ/LmZpbmQoKGUpID0+IGUua2luZCA9PT0gJ2RhdGEnKTtcbiAgICAgIGxpbmtQYXJ0cy5wdXNoKGB2aWEgJHtub2RlLmxpbmtlZEJ5fSR7d2VpZ2h0U3VmZml4KGRhdGFFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbEVkZ2UgPSBlZGdlc0Zyb21DaGlsZD8uZmluZCgoZSkgPT4gZS5raW5kID09PSAnY29udHJvbCcpO1xuICAgIGlmIChjb250cm9sRWRnZSkge1xuICAgICAgbGlua1BhcnRzLnB1c2goYFtjb250cm9sJHtjb250cm9sRWRnZS5rZXkgPyBgOiAke2NvbnRyb2xFZGdlLmtleX1gIDogJyd9XSR7d2VpZ2h0U3VmZml4KGNvbnRyb2xFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgbGluayA9IGxpbmtQYXJ0cy5sZW5ndGggPiAwID8gYCDihpAgJHtsaW5rUGFydHMuam9pbignIOKGkCAnKX1gIDogJyc7XG5cbiAgICBjb25zdCB3cml0ZXMgPSBub2RlLmtleXNXcml0dGVuLmxlbmd0aCA+IDAgPyBgIFt3cm90ZTogJHtub2RlLmtleXNXcml0dGVuLmpvaW4oJywgJyl9XWAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl9JHtub2RlLnN0YWdlTmFtZX0gKCR7bm9kZS5ydW50aW1lU3RhZ2VJZH0pJHtsaW5rfSR7d3JpdGVzfWApO1xuXG4gICAgaWYgKG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMgJiYgbm9kZS5pbmNvbXBsZXRlU291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgJHsnICAnLnJlcGVhdChpbmRlbnQgKyAxKX3imqAgYWxzbyBjb25zdW1lZCAke25vZGUuaW5jb21wbGV0ZVNvdXJjZXMuam9pbignLycpfSDigJQgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgd2FsayhcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBpbmRlbnQgKyAxLFxuICAgICAgICBub2RlLnBhcmVudEVkZ2VzLmZpbHRlcigoZSkgPT4gZS5wYXJlbnQgPT09IHBhcmVudCksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHdhbGsocm9vdCwgMCk7XG5cbiAgaWYgKHJvb3QudHJ1bmNhdGVkKSB7XG4gICAgY29uc3QgY2F1c2VzID0gW3Jvb3QudHJ1bmNhdGVkLmJ5RGVwdGggJiYgJ21heERlcHRoIHJlYWNoZWQnLCByb290LnRydW5jYXRlZC5ieU5vZGVzICYmICdtYXhOb2RlcyByZWFjaGVkJ11cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIGxpbmVzLnB1c2goYOKaoCBzbGljZSB0cnVuY2F0ZWQgKCR7Y2F1c2VzfSkg4oCUIG9sZGVyIGNhdXNlcyBleGlzdCBiZXlvbmQgdGhpcyBob3Jpem9uYCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8vIOKUgOKUgCBFeHBvcnRlZCBmb3IgdGVzdGluZyAoaW50ZXJuYWwpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQGludGVybmFsIEV4cG9zZWQgZm9yIHRlc3RpbmcgdGhlIHN0cmF0ZWd5IHNlbGVjdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBfUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQgPSBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRDtcbiJdfQ==
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * merge.ts — the union merge the `merge` verb applies. A leaf (L0, imports
3
- * nothing): `deepSmartMerge`, the one merge law every replay, fold and reader
3
+ * only the own-slot writer): `deepSmartMerge`, the law every replay, fold and reader
4
4
  * of a recorded `merge` row runs. Re-exported from `utils.ts`, so no importer
5
5
  * moved.
6
6
  */
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * merge.ts — the union merge the `merge` verb applies. A leaf (L0, imports
3
- * nothing): `deepSmartMerge`, the one merge law every replay, fold and reader
3
+ * only the own-slot writer): `deepSmartMerge`, the law every replay, fold and reader
4
4
  * of a recorded `merge` row runs. Re-exported from `utils.ts`, so no importer
5
5
  * moved.
6
6
  */
7
+ import { putOwn } from '../capture/ownData.js';
7
8
  /**
8
9
  * Deep union merge helper.
9
10
  * - Arrays (non-empty): union without duplicates (encounter order preserved)
@@ -43,18 +44,9 @@ function mergeGuarded(dst, src, inFlight) {
43
44
  for (const k of Object.keys(src)) {
44
45
  const owns = Object.prototype.hasOwnProperty.call(out, k);
45
46
  const value = mergeGuarded(owns ? out[k] : undefined, src[k], inFlight);
46
- // Spread made own slots writable data properties. Missing slots can be
47
- // assigned too, unless an inherited key (notably __proto__) intercepts
48
- // the write. Keep that key as DATA, rather than dropping it or invoking
49
- // a setter; Reflect.has tests existence without reading an inherited getter.
50
- if (!owns && Reflect.has(out, k)) {
51
- Object.defineProperty(out, k, { value, enumerable: true, writable: true, configurable: true });
52
- }
53
- else {
54
- out[k] = value;
55
- }
47
+ putOwn(out, k, value);
56
48
  }
57
49
  inFlight.delete(src);
58
50
  return out;
59
51
  }
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQVEsRUFBRSxHQUFRO0lBQy9DLE9BQU8sWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEdBQVEsRUFBRSxHQUFRLEVBQUUsUUFBMEM7SUFDbEYsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUV4RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsK0JBQStCO1FBQ2hFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMseUNBQXlDO0lBRTNGLE1BQU0sR0FBRyxHQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNwRSxDQUFDLFFBQVEsS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RSx1RUFBdUU7UUFDdkUsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakcsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBQ0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG1lcmdlLnRzIOKAlCB0aGUgdW5pb24gbWVyZ2UgdGhlIGBtZXJnZWAgdmVyYiBhcHBsaWVzLiBBIGxlYWYgKEwwLCBpbXBvcnRzXG4gKiBub3RoaW5nKTogYGRlZXBTbWFydE1lcmdlYCwgdGhlIG9uZSBtZXJnZSBsYXcgZXZlcnkgcmVwbGF5LCBmb2xkIGFuZCByZWFkZXJcbiAqIG9mIGEgcmVjb3JkZWQgYG1lcmdlYCByb3cgcnVucy4gUmUtZXhwb3J0ZWQgZnJvbSBgdXRpbHMudHNgLCBzbyBubyBpbXBvcnRlclxuICogbW92ZWQuXG4gKi9cblxuLyoqXG4gKiBEZWVwIHVuaW9uIG1lcmdlIGhlbHBlci5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiB1bmlvbiB3aXRob3V0IGR1cGxpY2F0ZXMgKGVuY291bnRlciBvcmRlciBwcmVzZXJ2ZWQpXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgcmVwbGFjZSDigJQgc3JjIGBbXWAgY2xlYXJzIHRoZSBkZXN0aW5hdGlvbiBhcnJheS5cbiAqICAgUmF0aW9uYWxlOiB3cml0aW5nIGBzY29wZS50YWdzID0gW11gIG1lYW5zIFwiY2xlYXIgdGFnc1wiLCBub3QgXCJhcHBlbmQgbm90aGluZ1wiLlxuICogICBXaXRob3V0IHRoaXMgcnVsZSwgYW4gZW1wdHktYXJyYXkgd3JpdGUgc2lsZW50bHkgYmVjb21lcyBhIG5vLW9wIHdoaWNoIGlzXG4gKiAgIGltcG9zc2libGUgdG8gZGlzdGluZ3Vpc2ggZnJvbSBhIGJ1Zy5cbiAqIC0gT2JqZWN0czogcmVjdXJzaXZlIG1lcmdlIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXlzLCBpbmNsdWRpbmcgc3BlY2lhbCBrZXlzO1xuICogICBpbmhlcml0ZWQgZGVzdGluYXRpb24gdmFsdWVzIGFuZCBzZXR0ZXJzIG5ldmVyIHBhcnRpY2lwYXRlLlxuICogLSBQcmltaXRpdmVzOiBzb3VyY2Ugd2luc1xuICpcbiAqIFRlcm1pbmF0ZXMgb24gYSBDWUNMSUMgYHNyY2AgKDkuMTguMSwgc2FtZSBsYXcgYXMge0BsaW5rIGRlZXBFcXVhbH06IGFcbiAqIHN0YXRlIHZhbHVlIHN1cnZpdmVzIGBzdHJ1Y3R1cmVkQ2xvbmVgLCB3aGljaCBwcmVzZXJ2ZXMgY3ljbGVzKS4gQSBgc3JjYFxuICogb2JqZWN0IHJlLWVudGVyZWQgd2hpbGUgaXQgaXMgc3RpbGwgYmVpbmcgbWVyZ2VkIGhpZ2hlciB1cCB0aGUgc3RhY2sgaGFuZHNcbiAqIGJhY2sgdGhlIG91dHB1dCBiZWluZyBidWlsdCBmb3IgaXQsIHNvIHRoZSBtZXJnZWQgdmFsdWUgbWlycm9ycyB0aGUgY3ljbGVcbiAqIGluc3RlYWQgb2YgdW5yb2xsaW5nIGl0IGZvcmV2ZXIuIE9ubHkgdGhlIGFuY2VzdG9ycyBvbiB0aGUgc3RhY2sgYXJlXG4gKiBndWFyZGVkIOKAlCBhIHNoYXJlZCAoYWN5Y2xpYykgYHNyY2AgcmVmZXJlbmNlIG1ldCBhZ2FpbiBhdCBhIGRpZmZlcmVudFxuICogYGRzdGAgbWVyZ2VzIGFnYWluc3QgVEhBVCBgZHN0YCwgZXhhY3RseSBhcyBiZWZvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwU21hcnRNZXJnZShkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xuICByZXR1cm4gbWVyZ2VHdWFyZGVkKGRzdCwgc3JjLCB1bmRlZmluZWQpO1xufVxuXG5mdW5jdGlvbiBtZXJnZUd1YXJkZWQoZHN0OiBhbnksIHNyYzogYW55LCBpbkZsaWdodDogV2Vha01hcDxvYmplY3QsIGFueT4gfCB1bmRlZmluZWQpOiBhbnkge1xuICBpZiAoc3JjID09PSBudWxsIHx8IHR5cGVvZiBzcmMgIT09ICdvYmplY3QnKSByZXR1cm4gc3JjO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNyYykpIHtcbiAgICBpZiAoc3JjLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdOyAvLyBlbXB0eSBzcmMgPSBjbGVhciwgbm90IG5vLW9wXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZHN0KSkgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5kc3QsIC4uLnNyY10pXTtcbiAgICByZXR1cm4gWy4uLnNyY107XG4gIH1cblxuICBpZiAoaW5GbGlnaHQ/LmhhcyhzcmMpKSByZXR1cm4gaW5GbGlnaHQuZ2V0KHNyYyk7IC8vIGN5Y2xlIOKAlCByZS1lbnRlciB0aGUgdmFsdWUgYmVpbmcgYnVpbHRcblxuICBjb25zdCBvdXQ6IGFueSA9IHsgLi4uKGRzdCAmJiB0eXBlb2YgZHN0ID09PSAnb2JqZWN0JyA/IGRzdCA6IHt9KSB9O1xuICAoaW5GbGlnaHQgPz89IG5ldyBXZWFrTWFwKCkpLnNldChzcmMsIG91dCk7XG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhzcmMpKSB7XG4gICAgY29uc3Qgb3ducyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvdXQsIGspO1xuICAgIGNvbnN0IHZhbHVlID0gbWVyZ2VHdWFyZGVkKG93bnMgPyBvdXRba10gOiB1bmRlZmluZWQsIHNyY1trXSwgaW5GbGlnaHQpO1xuICAgIC8vIFNwcmVhZCBtYWRlIG93biBzbG90cyB3cml0YWJsZSBkYXRhIHByb3BlcnRpZXMuIE1pc3Npbmcgc2xvdHMgY2FuIGJlXG4gICAgLy8gYXNzaWduZWQgdG9vLCB1bmxlc3MgYW4gaW5oZXJpdGVkIGtleSAobm90YWJseSBfX3Byb3RvX18pIGludGVyY2VwdHNcbiAgICAvLyB0aGUgd3JpdGUuIEtlZXAgdGhhdCBrZXkgYXMgREFUQSwgcmF0aGVyIHRoYW4gZHJvcHBpbmcgaXQgb3IgaW52b2tpbmdcbiAgICAvLyBhIHNldHRlcjsgUmVmbGVjdC5oYXMgdGVzdHMgZXhpc3RlbmNlIHdpdGhvdXQgcmVhZGluZyBhbiBpbmhlcml0ZWQgZ2V0dGVyLlxuICAgIGlmICghb3ducyAmJiBSZWZsZWN0LmhhcyhvdXQsIGspKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0LCBrLCB7IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRba10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgaW5GbGlnaHQuZGVsZXRlKHNyYyk7XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFRLEVBQUUsR0FBUTtJQUMvQyxPQUFPLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxHQUFRLEVBQUUsR0FBUSxFQUFFLFFBQTBDO0lBQ2xGLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFFeEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLCtCQUErQjtRQUNoRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHlDQUF5QztJQUUzRixNQUFNLEdBQUcsR0FBUSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDcEUsQ0FBQyxRQUFRLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0MsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUNELFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBtZXJnZS50cyDigJQgdGhlIHVuaW9uIG1lcmdlIHRoZSBgbWVyZ2VgIHZlcmIgYXBwbGllcy4gQSBsZWFmIChMMCwgaW1wb3J0c1xuICogb25seSB0aGUgb3duLXNsb3Qgd3JpdGVyKTogYGRlZXBTbWFydE1lcmdlYCwgdGhlIGxhdyBldmVyeSByZXBsYXksIGZvbGQgYW5kIHJlYWRlclxuICogb2YgYSByZWNvcmRlZCBgbWVyZ2VgIHJvdyBydW5zLiBSZS1leHBvcnRlZCBmcm9tIGB1dGlscy50c2AsIHNvIG5vIGltcG9ydGVyXG4gKiBtb3ZlZC5cbiAqL1xuXG5pbXBvcnQgeyBwdXRPd24gfSBmcm9tICcuLi9jYXB0dXJlL293bkRhdGEuanMnO1xuXG4vKipcbiAqIERlZXAgdW5pb24gbWVyZ2UgaGVscGVyLlxuICogLSBBcnJheXMgKG5vbi1lbXB0eSk6IHVuaW9uIHdpdGhvdXQgZHVwbGljYXRlcyAoZW5jb3VudGVyIG9yZGVyIHByZXNlcnZlZClcbiAqIC0gQXJyYXlzIChlbXB0eSk6ICAgICByZXBsYWNlIOKAlCBzcmMgYFtdYCBjbGVhcnMgdGhlIGRlc3RpbmF0aW9uIGFycmF5LlxuICogICBSYXRpb25hbGU6IHdyaXRpbmcgYHNjb3BlLnRhZ3MgPSBbXWAgbWVhbnMgXCJjbGVhciB0YWdzXCIsIG5vdCBcImFwcGVuZCBub3RoaW5nXCIuXG4gKiAgIFdpdGhvdXQgdGhpcyBydWxlLCBhbiBlbXB0eS1hcnJheSB3cml0ZSBzaWxlbnRseSBiZWNvbWVzIGEgbm8tb3Agd2hpY2ggaXNcbiAqICAgaW1wb3NzaWJsZSB0byBkaXN0aW5ndWlzaCBmcm9tIGEgYnVnLlxuICogLSBPYmplY3RzOiByZWN1cnNpdmUgbWVyZ2Ugb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleXMsIGluY2x1ZGluZyBzcGVjaWFsIGtleXM7XG4gKiAgIGluaGVyaXRlZCBkZXN0aW5hdGlvbiB2YWx1ZXMgYW5kIHNldHRlcnMgbmV2ZXIgcGFydGljaXBhdGUuXG4gKiAtIFByaW1pdGl2ZXM6IHNvdXJjZSB3aW5zXG4gKlxuICogVGVybWluYXRlcyBvbiBhIENZQ0xJQyBgc3JjYCAoOS4xOC4xLCBzYW1lIGxhdyBhcyB7QGxpbmsgZGVlcEVxdWFsfTogYVxuICogc3RhdGUgdmFsdWUgc3Vydml2ZXMgYHN0cnVjdHVyZWRDbG9uZWAsIHdoaWNoIHByZXNlcnZlcyBjeWNsZXMpLiBBIGBzcmNgXG4gKiBvYmplY3QgcmUtZW50ZXJlZCB3aGlsZSBpdCBpcyBzdGlsbCBiZWluZyBtZXJnZWQgaGlnaGVyIHVwIHRoZSBzdGFjayBoYW5kc1xuICogYmFjayB0aGUgb3V0cHV0IGJlaW5nIGJ1aWx0IGZvciBpdCwgc28gdGhlIG1lcmdlZCB2YWx1ZSBtaXJyb3JzIHRoZSBjeWNsZVxuICogaW5zdGVhZCBvZiB1bnJvbGxpbmcgaXQgZm9yZXZlci4gT25seSB0aGUgYW5jZXN0b3JzIG9uIHRoZSBzdGFjayBhcmVcbiAqIGd1YXJkZWQg4oCUIGEgc2hhcmVkIChhY3ljbGljKSBgc3JjYCByZWZlcmVuY2UgbWV0IGFnYWluIGF0IGEgZGlmZmVyZW50XG4gKiBgZHN0YCBtZXJnZXMgYWdhaW5zdCBUSEFUIGBkc3RgLCBleGFjdGx5IGFzIGJlZm9yZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBTbWFydE1lcmdlKGRzdDogYW55LCBzcmM6IGFueSk6IGFueSB7XG4gIHJldHVybiBtZXJnZUd1YXJkZWQoZHN0LCBzcmMsIHVuZGVmaW5lZCk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlR3VhcmRlZChkc3Q6IGFueSwgc3JjOiBhbnksIGluRmxpZ2h0OiBXZWFrTWFwPG9iamVjdCwgYW55PiB8IHVuZGVmaW5lZCk6IGFueSB7XG4gIGlmIChzcmMgPT09IG51bGwgfHwgdHlwZW9mIHNyYyAhPT0gJ29iamVjdCcpIHJldHVybiBzcmM7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc3JjKSkge1xuICAgIGlmIChzcmMubGVuZ3RoID09PSAwKSByZXR1cm4gW107IC8vIGVtcHR5IHNyYyA9IGNsZWFyLCBub3Qgbm8tb3BcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkc3QpKSByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmRzdCwgLi4uc3JjXSldO1xuICAgIHJldHVybiBbLi4uc3JjXTtcbiAgfVxuXG4gIGlmIChpbkZsaWdodD8uaGFzKHNyYykpIHJldHVybiBpbkZsaWdodC5nZXQoc3JjKTsgLy8gY3ljbGUg4oCUIHJlLWVudGVyIHRoZSB2YWx1ZSBiZWluZyBidWlsdFxuXG4gIGNvbnN0IG91dDogYW55ID0geyAuLi4oZHN0ICYmIHR5cGVvZiBkc3QgPT09ICdvYmplY3QnID8gZHN0IDoge30pIH07XG4gIChpbkZsaWdodCA/Pz0gbmV3IFdlYWtNYXAoKSkuc2V0KHNyYywgb3V0KTtcbiAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHNyYykpIHtcbiAgICBjb25zdCBvd25zID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG91dCwgayk7XG4gICAgY29uc3QgdmFsdWUgPSBtZXJnZUd1YXJkZWQob3ducyA/IG91dFtrXSA6IHVuZGVmaW5lZCwgc3JjW2tdLCBpbkZsaWdodCk7XG4gICAgcHV0T3duKG91dCwgaywgdmFsdWUpO1xuICB9XG4gIGluRmxpZ2h0LmRlbGV0ZShzcmMpO1xuICByZXR1cm4gb3V0O1xufVxuIl19
@@ -5,17 +5,16 @@
5
5
  * segments (__proto__, constructor, prototype). Each operation's traversal
6
6
  * contract is explicit below; merely using this module is not a sandbox.
7
7
  *
8
- * Intentional asymmetry:
9
- * - nativeSet — DENIED check at each segment; used on writer-owned
10
- * containers. It can follow an inherited object under an ordinary key.
8
+ * Selector operations read only own fields. Writers preflight the whole path
9
+ * before creating or copying any container, then place through putOwn.
11
10
  * - nativeGet — DENIED check + hasOwnProperty at every step.
12
11
  * - nativeHas — own-property existence only, including own denied names
13
12
  * and own undefined values; it does not use the DENIED rule.
14
- * - mergeContextWins — DENIED check only; Object.keys() is own-enumerable-only
15
- * by spec so prototype keys never appear in the iteration.
13
+ * - mergeContextWins — own-enumerable source keys, DENIED check, own-only
14
+ * destination precedence. Inherited fields are never destination data.
16
15
  *
17
- * Nested diagnostic writers have their own whole-selector preflight and
18
- * own-property writes in utils.ts, using the same isDeniedSegment predicate.
16
+ * Diagnostic writers retain their distinct creation/merge laws in utils.ts,
17
+ * using the same isDeniedSegment predicate and shared own-slot writer.
19
18
  *
20
19
  * Paths may be dot-notation strings or pre-split (string|number)[] arrays.
21
20
  */
@@ -30,7 +29,11 @@ export declare function isDeniedSegment(segment: string | number): boolean;
30
29
  * `defaultValue` instead of leaking Object.prototype / the Object constructor.
31
30
  */
32
31
  export declare function nativeGet(obj: any, path: string | (string | number)[], defaultValue?: any): any;
33
- /** Mutate `obj`, setting `value` at `path` (creates intermediate objects). Returns `obj`. */
32
+ /**
33
+ * Set an own path in a writer-owned container, creating missing intermediates.
34
+ * A denied selector is a no-op BEFORE any prefix is created. Inherited values
35
+ * and accessors do not participate; existing own accessors keep normal behavior.
36
+ */
34
37
  export declare function nativeSet(obj: any, path: string | (string | number)[], value: any): any;
35
38
  /**
36
39
  * Remove the own property at `path` in `obj` (the replay primitive for the
@@ -73,10 +76,10 @@ export declare function shallowCopy<T extends object>(container: T): T;
73
76
  *
74
77
  * `root` must already be owned. Walking down, every container the writer did
75
78
  * not create (`owned` does not hold it) is replaced, in its parent, by its
76
- * {@link shallowCopy}, which the writer then owns. The walk stops where
77
- * `nativeSet` would stop or create: a DENIED segment (the write is refused
78
- * there anyway), or a missing / primitive intermediate (`nativeSet` makes a
79
- * fresh container from that point on). The leaf itself is never copied — the
79
+ * {@link shallowCopy}, which the writer then owns. A denied segment anywhere
80
+ * refuses the entire walk before copying. Otherwise the walk stops at a
81
+ * missing / inherited / primitive intermediate (`nativeSet` makes a fresh
82
+ * own container from that point on). The leaf itself is never copied — the
80
83
  * write replaces it.
81
84
  *
82
85
  * Cost: one shallow copy per container on the path that this writer has not