footprintjs 4.7.0 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md CHANGED
@@ -279,10 +279,12 @@ class MyRecorder extends KeyedRecorder<MyEntry> {
279
279
  this.store(event.runtimeStageId, { ... }); // protected
280
280
  }
281
281
  }
282
- recorder.getByKey('call-llm#5'); // O(1) lookup
283
- recorder.getMap(); // ReadonlyMap
284
- recorder.values(); // MyEntry[] in insertion order
285
- recorder.clear(); // reset
282
+ // Three operations on auto-collected data:
283
+ recorder.getByKey('call-llm#5'); // Translate: per-step value
284
+ recorder.aggregate((sum, e) => sum + e.value, 0); // Aggregate: grand total
285
+ recorder.accumulate((sum, e) => sum + e.value, 0, visibleKeys); // Accumulate: progressive up to slider
286
+ recorder.filterByKeys(visibleKeys); // Filter: entries up to slider
287
+ recorder.getMap(); // Raw Map access
286
288
  ```
287
289
 
288
290
  **How runtimeStageId is generated:** A counter starts at 0 and increments by 1 for each stage execution across the entire run, including subflow stages. Subflow child traversers share the parent counter so indices are globally unique. Stages inside subflows have stageIds already prefixed by the builder (e.g., `sf-tools/execute-tool-calls`), so `buildRuntimeStageId` just appends `#index`.
@@ -233,6 +233,7 @@ export class StageContext {
233
233
  getSnapshot() {
234
234
  const snapshot = {
235
235
  id: this.stageId,
236
+ runtimeStageId: this.runtimeStageId || undefined,
236
237
  name: this.stageName,
237
238
  isDecider: this.isDecider,
238
239
  isFork: this.isFork,
@@ -270,4 +271,4 @@ export class StageContext {
270
271
  return snapshot;
271
272
  }
272
273
  }
273
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHL0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6QyxNQUFNLE9BQU8sWUFBWTtJQW9DdkIsWUFDRSxLQUFhLEVBQ2IsSUFBWSxFQUNaLE9BQWUsRUFDZixZQUEwQixFQUMxQixRQUFpQixFQUNqQixRQUFtQixFQUNuQixTQUFtQjtRQXRDZCxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBR3RCLHFGQUFxRjtRQUM5RSxtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQWNwQixVQUFLLEdBQXdCLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUU5RCxpRkFBaUY7UUFDekUsaUJBQVksR0FBK0UsRUFBRSxDQUFDO1FBRXRHLG1FQUFtRTtRQUMzRCxnQkFBVyxHQUE0QixFQUFFLENBQUM7UUFnQmhELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsaUVBQWlFO0lBQ2pF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LENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFnZUNvbnRleHQg4oCUIEV4ZWN1dGlvbiBjb250ZXh0IGZvciBhIHNpbmdsZSBzdGFnZSBpbiBhIGZsb3djaGFydCBydW5cbiAqXG4gKiBMaWtlIGEgc3RhY2sgZnJhbWUgaW4gYSBjb21waWxlci9ydW50aW1lOlxuICogLSBSZWZlcmVuY2UgdG8gU2hhcmVkTWVtb3J5IChhY2Nlc3NpbmcgaGVhcCBtZW1vcnkpXG4gKiAtIFRyYW5zYWN0aW9uQnVmZmVyIGZvciBzdGFnaW5nIG11dGF0aW9ucyAodHJhbnNhY3Rpb24gYnVmZmVyKVxuICogLSBMaW5rcyB0byBwYXJlbnQvY2hpbGQvbmV4dCBjb250ZXh0cyAoY2FsbCBzdGFjayBmcmFtZXMpXG4gKiAtIERpYWdub3N0aWNDb2xsZWN0b3IgZm9yIGxvZ3MsIGVycm9ycywgbWV0cmljc1xuICovXG5cbmltcG9ydCB7IERpYWdub3N0aWNDb2xsZWN0b3IgfSBmcm9tICcuL0RpYWdub3N0aWNDb2xsZWN0b3IuanMnO1xuaW1wb3J0IHsgRXZlbnRMb2cgfSBmcm9tICcuL0V2ZW50TG9nLmpzJztcbmltcG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4vU2hhcmVkTWVtb3J5LmpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVmZmVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkJ1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dDb250cm9sVHlwZSwgRmxvd01lc3NhZ2UsIFN0YWdlU25hcHNob3QgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHJlZGFjdFBhdGNoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBTdGFnZUNvbnRleHQge1xuICBwcml2YXRlIHNoYXJlZE1lbW9yeTogU2hhcmVkTWVtb3J5O1xuICBwcml2YXRlIGJ1ZmZlcj86IFRyYW5zYWN0aW9uQnVmZmVyO1xuICBwcml2YXRlIGV2ZW50TG9nPzogRXZlbnRMb2c7XG5cbiAgcHVibGljIHN0YWdlTmFtZSA9ICcnO1xuICAvKiogVW5pcXVlIHN0YWdlIGlkZW50aWZpZXIgZnJvbSB0aGUgYnVpbGRlciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBwdWJsaWMgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBTZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBzdGFnZSBleGVjdXRpb24uICovXG4gIHB1YmxpYyBydW50aW1lU3RhZ2VJZCA9ICcnO1xuICBwdWJsaWMgcnVuSWQ6IHN0cmluZztcbiAgcHVibGljIGJyYW5jaElkPzogc3RyaW5nO1xuICBwdWJsaWMgaXNEZWNpZGVyOiBib29sZWFuO1xuICBwdWJsaWMgaXNGb3JrOiBib29sZWFuO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZnJvbSBidWlsZGVyIChzZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBleGVjdXRpb24pLiAqL1xuICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIgKHNldCBieSB0cmF2ZXJzZXIgd2hlbiB0aGlzIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludCkuICovXG4gIHB1YmxpYyBzdWJmbG93SWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHBhcmVudD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIG5leHQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBjaGlsZHJlbj86IFN0YWdlQ29udGV4dFtdO1xuXG4gIHB1YmxpYyBkZWJ1ZzogRGlhZ25vc3RpY0NvbGxlY3RvciA9IG5ldyBEaWFnbm9zdGljQ29sbGVjdG9yKCk7XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHdyaXRlcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldyBhbmQgb25Db21taXQuICovXG4gIHByaXZhdGUgX3N0YWdlV3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiA9IHt9O1xuXG4gIC8qKiBUcmFja3MgdXNlci1sZXZlbCByZWFkcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VSZWFkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKiogT2JzZXJ2ZXIgY2FsbGVkIGFmdGVyIGNvbW1pdCgpIOKAlCB1c2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGZpcmUgUmVjb3JkZXIub25Db21taXQuICovXG4gIHByaXZhdGUgX2NvbW1pdE9ic2VydmVyPzogKFxuICAgIG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4sXG4gICkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdGFnZUlkOiBzdHJpbmcsXG4gICAgc2hhcmVkTWVtb3J5OiBTaGFyZWRNZW1vcnksXG4gICAgYnJhbmNoSWQ/OiBzdHJpbmcsXG4gICAgZXZlbnRMb2c/OiBFdmVudExvZyxcbiAgICBpc0RlY2lkZXI/OiBib29sZWFuLFxuICApIHtcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gICAgdGhpcy5zdGFnZU5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc3RhZ2VJZCA9IHN0YWdlSWQ7XG4gICAgdGhpcy5zaGFyZWRNZW1vcnkgPSBzaGFyZWRNZW1vcnk7XG4gICAgdGhpcy5icmFuY2hJZCA9IGJyYW5jaElkO1xuICAgIHRoaXMuZXZlbnRMb2cgPSBldmVudExvZztcbiAgICB0aGlzLmlzRGVjaWRlciA9ICEhaXNEZWNpZGVyO1xuICAgIHRoaXMuaXNGb3JrID0gZmFsc2U7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgU2hhcmVkTWVtb3J5IGluc3RhbmNlIChuZWVkZWQgYnkgc2NvcGUgbGF5ZXIpLiAqL1xuICBnZXRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnk7XG4gIH1cblxuICAvKiogTGF6aWx5IGNyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciAocGF5IGNsb25lIGNvc3Qgb25seSBpZiBzdGFnZSB3cml0ZXMpLiAqL1xuICBnZXRUcmFuc2FjdGlvbkJ1ZmZlcigpOiBUcmFuc2FjdGlvbkJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLmJ1ZmZlcikge1xuICAgICAgdGhpcy5idWZmZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWZmZXIodGhpcy5zaGFyZWRNZW1vcnkuZ2V0U3RhdGUoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJ1ZmZlcjtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgYW4gYWJzb2x1dGUgcGF0aCBpbnNpZGUgdGhlIHNoYXJlZCBtZW1vcnkgKHJ1biBuYW1lc3BhY2UpLiAqL1xuICBwcml2YXRlIHdpdGhOYW1lc3BhY2UocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5ydW5JZCB8fCB0aGlzLnJ1bklkID09PSAnJykge1xuICAgICAgcmV0dXJuIFsuLi5wYXRoLCBrZXldO1xuICAgIH1cbiAgICByZXR1cm4gWydydW5zJywgdGhpcy5ydW5JZCwgLi4ucGF0aCwga2V5XTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXcml0ZSBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBhdGNoKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdCA9IGZhbHNlKSB7XG4gICAgdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpLnNldCh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5KSwgdmFsdWUsIHNob3VsZFJlZGFjdCk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2gocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBtZXJnZShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpLm1lcmdlKHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkpLCB2YWx1ZSk7XG4gIH1cblxuICBzZXRPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcGVyYXRpb25PdmVycmlkZT86ICdzZXQnIHwgJ2RlbGV0ZScsXG4gICkge1xuICAgIHRoaXMucGF0Y2gocGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0ID8/IGZhbHNlKTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdFxuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG4gICAgdGhpcy5fc3RhZ2VXcml0ZXNbdXNlcktleV0gPSB7XG4gICAgICB2YWx1ZTogc2hvdWxkUmVkYWN0ID8gJ1tSRURBQ1RFRF0nIDogc3RydWN0dXJlZENsb25lKHZhbHVlKSxcbiAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uT3ZlcnJpZGUgPz8gJ3NldCcsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IHRhZ2dlZCA9IGRlc2NyaXB0aW9uLnN0YXJ0c1dpdGgoJ1snKSA/IGRlc2NyaXB0aW9uIDogYFtXUklURV0gJHtkZXNjcmlwdGlvbn1gO1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCB0YWdnZWQpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZywgc2hvdWxkUmVkYWN0PzogYm9vbGVhbikge1xuICAgIHRoaXMubWVyZ2UocGF0aCwga2V5LCB2YWx1ZSk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXRcbiAgICBjb25zdCB1c2VyS2V5ID0gcGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5O1xuICAgIHRoaXMuX3N0YWdlV3JpdGVzW3VzZXJLZXldID0ge1xuICAgICAgdmFsdWU6IHNob3VsZFJlZGFjdCA/ICdbUkVEQUNURURdJyA6IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSksXG4gICAgICBvcGVyYXRpb246ICd1cGRhdGUnLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICBzZXRSb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2goW10sIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCkuc2V0KFtrZXldLCB2YWx1ZSk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVHbG9iYWxDb250ZXh0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKS5zZXQoW2tleV0sIHZhbHVlKTtcbiAgfVxuXG4gIGFwcGVuZFRvQXJyYXkocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCBpdGVtczogdW5rbm93bltdLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5nZXRWYWx1ZShwYXRoLCBrZXkpO1xuICAgIGNvbnN0IG1lcmdlZCA9IEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpID8gWy4uLmV4aXN0aW5nLCAuLi5pdGVtc10gOiBbLi4uaXRlbXNdO1xuICAgIHRoaXMuc2V0T2JqZWN0KHBhdGgsIGtleSwgbWVyZ2VkLCBmYWxzZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgbWVyZ2VPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5nZXRWYWx1ZShwYXRoLCBrZXkpO1xuICAgIGNvbnN0IG1lcmdlZCA9XG4gICAgICBleGlzdGluZyAmJiB0eXBlb2YgZXhpc3RpbmcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGV4aXN0aW5nKVxuICAgICAgICA/IHsgLi4uKGV4aXN0aW5nIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSwgLi4ub2JqIH1cbiAgICAgICAgOiB7IC4uLm9iaiB9O1xuICAgIHRoaXMuc2V0T2JqZWN0KHBhdGgsIGtleSwgbWVyZ2VkLCBmYWxzZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlYWQgb3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXRWYWx1ZShwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTtcbiAgICBjb25zdCBmcm9tUGF0Y2ggPSBidWYuZ2V0KHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkgYXMgc3RyaW5nKSk7XG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgZnJvbVBhdGNoICE9PSAndW5kZWZpbmVkJyA/IGZyb21QYXRjaCA6IHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKHRoaXMucnVuSWQsIHBhdGgsIGtleSk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCByZWFkIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXdcbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHVzZXJLZXkgPSBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG4gICAgICB0aGlzLl9zdGFnZVJlYWRzW3VzZXJLZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBgW1JFQURdICR7ZGVzY3JpcHRpb259YCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgdHJhY2tpbmcgaW4gX3N0YWdlUmVhZHMgb3IgcGF5aW5nIHN0cnVjdHVyZWRDbG9uZSBjb3N0LlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZS5nZXRWYWx1ZVNpbGVudCgpIGZvciBhcnJheSBwcm94eSBpbnRlcm5hbCBvcGVyYXRpb25zLiAqL1xuICBnZXRWYWx1ZURpcmVjdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgYnVmID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpO1xuICAgIGNvbnN0IGZyb21QYXRjaCA9IGJ1Zi5nZXQodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSBhcyBzdHJpbmcpKTtcbiAgICByZXR1cm4gdHlwZW9mIGZyb21QYXRjaCAhPT0gJ3VuZGVmaW5lZCcgPyBmcm9tUGF0Y2ggOiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRWYWx1ZSh0aGlzLnJ1bklkLCBwYXRoLCBrZXkpO1xuICB9XG5cbiAgZ2V0Um9vdChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRWYWx1ZSh0aGlzLnJ1bklkLCBbXSwga2V5KTtcbiAgfVxuXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRWYWx1ZSgnJywgW10sIGtleSk7XG4gIH1cblxuICBnZXRTY29wZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFN0YXRlKCk7XG4gIH1cblxuICBnZXRSdW5JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIENvbW1pdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgdGhhdCBmaXJlcyBhZnRlciBjb21taXQoKSBhcHBsaWVzIHBhdGNoZXMuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGRpc3BhdGNoIFJlY29yZGVyLm9uQ29tbWl0IGV2ZW50cy4gKi9cbiAgc2V0Q29tbWl0T2JzZXJ2ZXIoXG4gICAgb2JzZXJ2ZXI6IChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9jb21taXRPYnNlcnZlciA9IG9ic2VydmVyO1xuICB9XG5cbiAgY29tbWl0KCk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTtcbiAgICBjb25zdCBidW5kbGUgPSBidWYuY29tbWl0KCk7XG4gICAgY29uc3QgY29tbWl0QnVuZGxlID0ge1xuICAgICAgLi4uYnVuZGxlLFxuICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgfTtcblxuICAgIHRoaXMuc2hhcmVkTWVtb3J5LmFwcGx5UGF0Y2goY29tbWl0QnVuZGxlLm92ZXJ3cml0ZSwgY29tbWl0QnVuZGxlLnVwZGF0ZXMsIGNvbW1pdEJ1bmRsZS50cmFjZSk7XG5cbiAgICBjb25zdCByZWRhY3RlZE92ZXJ3cml0ZSA9IHJlZGFjdFBhdGNoKGNvbW1pdEJ1bmRsZS5vdmVyd3JpdGUsIGNvbW1pdEJ1bmRsZS5yZWRhY3RlZFBhdGhzKTtcbiAgICBjb25zdCByZWRhY3RlZFVwZGF0ZXMgPSByZWRhY3RQYXRjaChjb21taXRCdW5kbGUudXBkYXRlcywgY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMpO1xuICAgIHRoaXMuZXZlbnRMb2c/LnJlY29yZCh7XG4gICAgICAuLi5jb21taXRCdW5kbGUsXG4gICAgICByZWRhY3RlZFBhdGhzOiBBcnJheS5mcm9tKGNvbW1pdEJ1bmRsZS5yZWRhY3RlZFBhdGhzLnZhbHVlcygpKSxcbiAgICAgIG92ZXJ3cml0ZTogcmVkYWN0ZWRPdmVyd3JpdGUsXG4gICAgICB1cGRhdGVzOiByZWRhY3RlZFVwZGF0ZXMsXG4gICAgfSk7XG5cbiAgICAvLyBOb3RpZnkgb2JzZXJ2ZXIgKFNjb3BlRmFjYWRlKSB3aXRoIHRyYWNrZWQgbXV0YXRpb25zXG4gICAgaWYgKHRoaXMuX2NvbW1pdE9ic2VydmVyKSB7XG4gICAgICB0aGlzLl9jb21taXRPYnNlcnZlcih7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBUcmVlIG5hdmlnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgY3JlYXRlTmV4dChwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMubmV4dCkge1xuICAgICAgdGhpcy5uZXh0ID0gbmV3IFN0YWdlQ29udGV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMuc2hhcmVkTWVtb3J5LCAnJywgdGhpcy5ldmVudExvZywgaXNEZWNpZGVyKTtcbiAgICAgIHRoaXMubmV4dC5wYXJlbnQgPSB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZXh0O1xuICB9XG5cbiAgY3JlYXRlQ2hpbGQocnVuSWQ6IHN0cmluZywgYnJhbmNoSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5jaGlsZHJlbikge1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IG5ldyBTdGFnZUNvbnRleHQocnVuSWQsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5zaGFyZWRNZW1vcnksIGJyYW5jaElkLCB0aGlzLmV2ZW50TG9nLCBpc0RlY2lkZXIpO1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICBjcmVhdGVEZWNpZGVyKHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRydWUpO1xuICB9XG5cbiAgc2V0QXNEZWNpZGVyKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QXNGb3JrKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0ZvcmsgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERpYWdub3N0aWNzIGRlbGVnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYWRkTG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0RXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0RXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEVycm9yKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFcnJvcihrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgdHlwZTogRmxvd0NvbnRyb2xUeXBlLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgdGFyZ2V0U3RhZ2U/OiBzdHJpbmcgfCBzdHJpbmdbXTsgcmF0aW9uYWxlPzogc3RyaW5nOyBjb3VudD86IG51bWJlcjsgaXRlcmF0aW9uPzogbnVtYmVyIH0sXG4gICkge1xuICAgIGNvbnN0IGZsb3dNZXNzYWdlOiBGbG93TWVzc2FnZSA9IHsgdHlwZSwgZGVzY3JpcHRpb24sIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgLi4ub3B0aW9ucyB9O1xuICAgIHRoaXMuZGVidWcuYWRkRmxvd01lc3NhZ2UoZmxvd01lc3NhZ2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNuYXBzaG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldFN0YWdlSWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucnVuSWQgfHwgdGhpcy5ydW5JZCA9PT0gJycpIHJldHVybiB0aGlzLnN0YWdlTmFtZTtcbiAgICByZXR1cm4gYCR7dGhpcy5ydW5JZH0uJHt0aGlzLnN0YWdlTmFtZX1gO1xuICB9XG5cbiAgZ2V0U25hcHNob3QoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3Q6IFN0YWdlU25hcHNob3QgPSB7XG4gICAgICBpZDogdGhpcy5zdGFnZUlkLFxuICAgICAgbmFtZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBpc0RlY2lkZXI6IHRoaXMuaXNEZWNpZGVyLFxuICAgICAgaXNGb3JrOiB0aGlzLmlzRm9yayxcbiAgICAgIGxvZ3M6IHRoaXMuZGVidWcubG9nQ29udGV4dCxcbiAgICAgIGVycm9yczogdGhpcy5kZWJ1Zy5lcnJvckNvbnRleHQsXG4gICAgICBtZXRyaWNzOiB0aGlzLmRlYnVnLm1ldHJpY0NvbnRleHQsXG4gICAgICBldmFsczogdGhpcy5kZWJ1Zy5ldmFsQ29udGV4dCxcbiAgICB9O1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVdyaXRlcykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gRXh0cmFjdCB2YWx1ZXMgb25seSBmb3IgdGhlIHNuYXBzaG90IChzdHJpcCBvcGVyYXRpb24gbWV0YWRhdGEpXG4gICAgICBjb25zdCB3cml0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fc3RhZ2VXcml0ZXMpKSB7XG4gICAgICAgIHdyaXRlc1trXSA9IGVudHJ5LnZhbHVlO1xuICAgICAgfVxuICAgICAgc25hcHNob3Quc3RhZ2VXcml0ZXMgPSB3cml0ZXM7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVJlYWRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5zdGFnZVJlYWRzID0gdGhpcy5fc3RhZ2VSZWFkcztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgIHNuYXBzaG90LmRlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3ViZmxvd0lkKSB7XG4gICAgICBzbmFwc2hvdC5zdWJmbG93SWQgPSB0aGlzLnN1YmZsb3dJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LmZsb3dNZXNzYWdlcyA9IHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzO1xuICAgIH1cbiAgICBpZiAodGhpcy5uZXh0KSB7XG4gICAgICBzbmFwc2hvdC5uZXh0ID0gdGhpcy5uZXh0LmdldFNuYXBzaG90KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBzbmFwc2hvdC5jaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4ubWFwKChjKSA9PiBjLmdldFNuYXBzaG90KCkpO1xuICAgIH1cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cbn1cbiJdfQ==
274
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHL0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6QyxNQUFNLE9BQU8sWUFBWTtJQW9DdkIsWUFDRSxLQUFhLEVBQ2IsSUFBWSxFQUNaLE9BQWUsRUFDZixZQUEwQixFQUMxQixRQUFpQixFQUNqQixRQUFtQixFQUNuQixTQUFtQjtRQXRDZCxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBR3RCLHFGQUFxRjtRQUM5RSxtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQWNwQixVQUFLLEdBQXdCLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUU5RCxpRkFBaUY7UUFDekUsaUJBQVksR0FBK0UsRUFBRSxDQUFDO1FBRXRHLG1FQUFtRTtRQUMzRCxnQkFBVyxHQUE0QixFQUFFLENBQUM7UUFnQmhELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsaUVBQWlFO0lBQ2pF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LENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZCxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWdlQ29udGV4dCDigJQgRXhlY3V0aW9uIGNvbnRleHQgZm9yIGEgc2luZ2xlIHN0YWdlIGluIGEgZmxvd2NoYXJ0IHJ1blxuICpcbiAqIExpa2UgYSBzdGFjayBmcmFtZSBpbiBhIGNvbXBpbGVyL3J1bnRpbWU6XG4gKiAtIFJlZmVyZW5jZSB0byBTaGFyZWRNZW1vcnkgKGFjY2Vzc2luZyBoZWFwIG1lbW9yeSlcbiAqIC0gVHJhbnNhY3Rpb25CdWZmZXIgZm9yIHN0YWdpbmcgbXV0YXRpb25zICh0cmFuc2FjdGlvbiBidWZmZXIpXG4gKiAtIExpbmtzIHRvIHBhcmVudC9jaGlsZC9uZXh0IGNvbnRleHRzIChjYWxsIHN0YWNrIGZyYW1lcylcbiAqIC0gRGlhZ25vc3RpY0NvbGxlY3RvciBmb3IgbG9ncywgZXJyb3JzLCBtZXRyaWNzXG4gKi9cblxuaW1wb3J0IHsgRGlhZ25vc3RpY0NvbGxlY3RvciB9IGZyb20gJy4vRGlhZ25vc3RpY0NvbGxlY3Rvci5qcyc7XG5pbXBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWZmZXIgfSBmcm9tICcuL1RyYW5zYWN0aW9uQnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd0NvbnRyb2xUeXBlLCBGbG93TWVzc2FnZSwgU3RhZ2VTbmFwc2hvdCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgcmVkYWN0UGF0Y2ggfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNsYXNzIFN0YWdlQ29udGV4dCB7XG4gIHByaXZhdGUgc2hhcmVkTWVtb3J5OiBTaGFyZWRNZW1vcnk7XG4gIHByaXZhdGUgYnVmZmVyPzogVHJhbnNhY3Rpb25CdWZmZXI7XG4gIHByaXZhdGUgZXZlbnRMb2c/OiBFdmVudExvZztcblxuICBwdWJsaWMgc3RhZ2VOYW1lID0gJyc7XG4gIC8qKiBVbmlxdWUgc3RhZ2UgaWRlbnRpZmllciBmcm9tIHRoZSBidWlsZGVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHB1YmxpYyBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIFNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIHN0YWdlIGV4ZWN1dGlvbi4gKi9cbiAgcHVibGljIHJ1bnRpbWVTdGFnZUlkID0gJyc7XG4gIHB1YmxpYyBydW5JZDogc3RyaW5nO1xuICBwdWJsaWMgYnJhbmNoSWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBpc0RlY2lkZXI6IGJvb2xlYW47XG4gIHB1YmxpYyBpc0Zvcms6IGJvb2xlYW47XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBmcm9tIGJ1aWxkZXIgKHNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIGV4ZWN1dGlvbikuICovXG4gIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN1YmZsb3cgaWRlbnRpZmllciAoc2V0IGJ5IHRyYXZlcnNlciB3aGVuIHRoaXMgaXMgYSBzdWJmbG93IGVudHJ5IHBvaW50KS4gKi9cbiAgcHVibGljIHN1YmZsb3dJZD86IHN0cmluZztcblxuICBwdWJsaWMgcGFyZW50PzogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgbmV4dD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIGNoaWxkcmVuPzogU3RhZ2VDb250ZXh0W107XG5cbiAgcHVibGljIGRlYnVnOiBEaWFnbm9zdGljQ29sbGVjdG9yID0gbmV3IERpYWdub3N0aWNDb2xsZWN0b3IoKTtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgd3JpdGVzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3IGFuZCBvbkNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VXcml0ZXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+ID0ge307XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHJlYWRzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3LiAqL1xuICBwcml2YXRlIF9zdGFnZVJlYWRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIC8qKiBPYnNlcnZlciBjYWxsZWQgYWZ0ZXIgY29tbWl0KCkg4oCUIHVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZmlyZSBSZWNvcmRlci5vbkNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfY29tbWl0T2JzZXJ2ZXI/OiAoXG4gICAgbXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PixcbiAgKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgICBzaGFyZWRNZW1vcnk6IFNoYXJlZE1lbW9yeSxcbiAgICBicmFuY2hJZD86IHN0cmluZyxcbiAgICBldmVudExvZz86IEV2ZW50TG9nLFxuICAgIGlzRGVjaWRlcj86IGJvb2xlYW4sXG4gICkge1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgICB0aGlzLnN0YWdlTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdGFnZUlkID0gc3RhZ2VJZDtcbiAgICB0aGlzLnNoYXJlZE1lbW9yeSA9IHNoYXJlZE1lbW9yeTtcbiAgICB0aGlzLmJyYW5jaElkID0gYnJhbmNoSWQ7XG4gICAgdGhpcy5ldmVudExvZyA9IGV2ZW50TG9nO1xuICAgIHRoaXMuaXNEZWNpZGVyID0gISFpc0RlY2lkZXI7XG4gICAgdGhpcy5pc0ZvcmsgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBTaGFyZWRNZW1vcnkgaW5zdGFuY2UgKG5lZWRlZCBieSBzY29wZSBsYXllcikuICovXG4gIGdldFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeTtcbiAgfVxuXG4gIC8qKiBMYXppbHkgY3JlYXRlcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyIChwYXkgY2xvbmUgY29zdCBvbmx5IGlmIHN0YWdlIHdyaXRlcykuICovXG4gIGdldFRyYW5zYWN0aW9uQnVmZmVyKCk6IFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuYnVmZmVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBUcmFuc2FjdGlvbkJ1ZmZlcih0aGlzLnNoYXJlZE1lbW9yeS5nZXRTdGF0ZSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9XG5cbiAgLyoqIEJ1aWxkcyBhbiBhYnNvbHV0ZSBwYXRoIGluc2lkZSB0aGUgc2hhcmVkIG1lbW9yeSAocnVuIG5hbWVzcGFjZSkuICovXG4gIHByaXZhdGUgd2l0aE5hbWVzcGFjZShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLnJ1bklkIHx8IHRoaXMucnVuSWQgPT09ICcnKSB7XG4gICAgICByZXR1cm4gWy4uLnBhdGgsIGtleV07XG4gICAgfVxuICAgIHJldHVybiBbJ3J1bnMnLCB0aGlzLnJ1bklkLCAuLi5wYXRoLCBrZXldO1xuICB9XG5cbiAgLy8g4pSA4pSAIFdyaXRlIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcGF0Y2gocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpIHtcbiAgICB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCkuc2V0KHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkpLCB2YWx1ZSwgc2hvdWxkUmVkYWN0KTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIG1lcmdlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCkubWVyZ2UodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSksIHZhbHVlKTtcbiAgfVxuXG4gIHNldE9iamVjdChcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBzaG91bGRSZWRhY3Q/OiBib29sZWFuLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wZXJhdGlvbk92ZXJyaWRlPzogJ3NldCcgfCAnZGVsZXRlJyxcbiAgKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QgPz8gZmFsc2UpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0XG4gICAgY29uc3QgdXNlcktleSA9IHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleTtcbiAgICB0aGlzLl9zdGFnZVdyaXRlc1t1c2VyS2V5XSA9IHtcbiAgICAgIHZhbHVlOiBzaG91bGRSZWRhY3QgPyAnW1JFREFDVEVEXScgOiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpLFxuICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25PdmVycmlkZSA/PyAnc2V0JyxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdGFnZ2VkID0gZGVzY3JpcHRpb24uc3RhcnRzV2l0aCgnWycpID8gZGVzY3JpcHRpb24gOiBgW1dSSVRFXSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIHRhZ2dlZCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlT2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuKSB7XG4gICAgdGhpcy5tZXJnZShwYXRoLCBrZXksIHZhbHVlKTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdFxuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG4gICAgdGhpcy5fc3RhZ2VXcml0ZXNbdXNlcktleV0gPSB7XG4gICAgICB2YWx1ZTogc2hvdWxkUmVkYWN0ID8gJ1tSRURBQ1RFRF0nIDogc3RydWN0dXJlZENsb25lKHZhbHVlKSxcbiAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHNldFJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChbXSwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBzZXRHbG9iYWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKS5zZXQoW2tleV0sIHZhbHVlKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUdsb2JhbENvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpLnNldChba2V5XSwgdmFsdWUpO1xuICB9XG5cbiAgYXBwZW5kVG9BcnJheShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIGl0ZW1zOiB1bmtub3duW10sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID0gQXJyYXkuaXNBcnJheShleGlzdGluZykgPyBbLi4uZXhpc3RpbmcsIC4uLml0ZW1zXSA6IFsuLi5pdGVtc107XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBtZXJnZU9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID1cbiAgICAgIGV4aXN0aW5nICYmIHR5cGVvZiBleGlzdGluZyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZXhpc3RpbmcpXG4gICAgICAgID8geyAuLi4oZXhpc3RpbmcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLCAuLi5vYmogfVxuICAgICAgICA6IHsgLi4ub2JqIH07XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZCBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldFZhbHVlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpO1xuICAgIGNvbnN0IGZyb21QYXRjaCA9IGJ1Zi5nZXQodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSBhcyBzdHJpbmcpKTtcbiAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBmcm9tUGF0Y2ggIT09ICd1bmRlZmluZWQnID8gZnJvbVBhdGNoIDogdGhpcy5zaGFyZWRNZW1vcnkuZ2V0VmFsdWUodGhpcy5ydW5JZCwgcGF0aCwga2V5KTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHJlYWQgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlld1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdXNlcktleSA9IHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleTtcbiAgICAgIHRoaXMuX3N0YWdlUmVhZHNbdXNlcktleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gc3RydWN0dXJlZENsb25lKHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGBbUkVBRF0gJHtkZXNjcmlwdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCB0cmFja2luZyBpbiBfc3RhZ2VSZWFkcyBvciBwYXlpbmcgc3RydWN0dXJlZENsb25lIGNvc3QuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlLmdldFZhbHVlU2lsZW50KCkgZm9yIGFycmF5IHByb3h5IGludGVybmFsIG9wZXJhdGlvbnMuICovXG4gIGdldFZhbHVlRGlyZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBjb25zdCBidWYgPSB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCk7XG4gICAgY29uc3QgZnJvbVBhdGNoID0gYnVmLmdldCh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5IGFzIHN0cmluZykpO1xuICAgIHJldHVybiB0eXBlb2YgZnJvbVBhdGNoICE9PSAndW5kZWZpbmVkJyA/IGZyb21QYXRjaCA6IHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKHRoaXMucnVuSWQsIHBhdGgsIGtleSk7XG4gIH1cblxuICBnZXRSb290KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKHRoaXMucnVuSWQsIFtdLCBrZXkpO1xuICB9XG5cbiAgZ2V0R2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKCcnLCBbXSwga2V5KTtcbiAgfVxuXG4gIGdldFNjb3BlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0U3RhdGUoKTtcbiAgfVxuXG4gIGdldFJ1bklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgQ29tbWl0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZWdpc3RlciBhbiBvYnNlcnZlciB0aGF0IGZpcmVzIGFmdGVyIGNvbW1pdCgpIGFwcGxpZXMgcGF0Y2hlcy5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZGlzcGF0Y2ggUmVjb3JkZXIub25Db21taXQgZXZlbnRzLiAqL1xuICBzZXRDb21taXRPYnNlcnZlcihcbiAgICBvYnNlcnZlcjogKG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4pID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyID0gb2JzZXJ2ZXI7XG4gIH1cblxuICBjb21taXQoKTogdm9pZCB7XG4gICAgY29uc3QgYnVmID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpO1xuICAgIGNvbnN0IGJ1bmRsZSA9IGJ1Zi5jb21taXQoKTtcbiAgICBjb25zdCBjb21taXRCdW5kbGUgPSB7XG4gICAgICAuLi5idW5kbGUsXG4gICAgICBzdGFnZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCxcbiAgICB9O1xuXG4gICAgdGhpcy5zaGFyZWRNZW1vcnkuYXBwbHlQYXRjaChjb21taXRCdW5kbGUub3ZlcndyaXRlLCBjb21taXRCdW5kbGUudXBkYXRlcywgY29tbWl0QnVuZGxlLnRyYWNlKTtcblxuICAgIGNvbnN0IHJlZGFjdGVkT3ZlcndyaXRlID0gcmVkYWN0UGF0Y2goY29tbWl0QnVuZGxlLm92ZXJ3cml0ZSwgY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMpO1xuICAgIGNvbnN0IHJlZGFjdGVkVXBkYXRlcyA9IHJlZGFjdFBhdGNoKGNvbW1pdEJ1bmRsZS51cGRhdGVzLCBjb21taXRCdW5kbGUucmVkYWN0ZWRQYXRocyk7XG4gICAgdGhpcy5ldmVudExvZz8ucmVjb3JkKHtcbiAgICAgIC4uLmNvbW1pdEJ1bmRsZSxcbiAgICAgIHJlZGFjdGVkUGF0aHM6IEFycmF5LmZyb20oY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMudmFsdWVzKCkpLFxuICAgICAgb3ZlcndyaXRlOiByZWRhY3RlZE92ZXJ3cml0ZSxcbiAgICAgIHVwZGF0ZXM6IHJlZGFjdGVkVXBkYXRlcyxcbiAgICB9KTtcblxuICAgIC8vIE5vdGlmeSBvYnNlcnZlciAoU2NvcGVGYWNhZGUpIHdpdGggdHJhY2tlZCBtdXRhdGlvbnNcbiAgICBpZiAodGhpcy5fY29tbWl0T2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyKHsgLi4udGhpcy5fc3RhZ2VXcml0ZXMgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFRyZWUgbmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBjcmVhdGVOZXh0KHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5uZXh0KSB7XG4gICAgICB0aGlzLm5leHQgPSBuZXcgU3RhZ2VDb250ZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5zaGFyZWRNZW1vcnksICcnLCB0aGlzLmV2ZW50TG9nLCBpc0RlY2lkZXIpO1xuICAgICAgdGhpcy5uZXh0LnBhcmVudCA9IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5leHQ7XG4gIH1cblxuICBjcmVhdGVDaGlsZChydW5JZDogc3RyaW5nLCBicmFuY2hJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkID0gbmV3IFN0YWdlQ29udGV4dChydW5JZCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnNoYXJlZE1lbW9yeSwgYnJhbmNoSWQsIHRoaXMuZXZlbnRMb2csIGlzRGVjaWRlcik7XG4gICAgY2hpbGQucGFyZW50ID0gdGhpcztcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIGNyZWF0ZURlY2lkZXIocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdHJ1ZSk7XG4gIH1cblxuICBzZXRBc0RlY2lkZXIoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRGVjaWRlciA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBc0ZvcmsoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRm9yayA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgRGlhZ25vc3RpY3MgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhZGRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkTWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXJyb3Ioa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEVycm9yKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRmxvd0RlYnVnTWVzc2FnZShcbiAgICB0eXBlOiBGbG93Q29udHJvbFR5cGUsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyB0YXJnZXRTdGFnZT86IHN0cmluZyB8IHN0cmluZ1tdOyByYXRpb25hbGU/OiBzdHJpbmc7IGNvdW50PzogbnVtYmVyOyBpdGVyYXRpb24/OiBudW1iZXIgfSxcbiAgKSB7XG4gICAgY29uc3QgZmxvd01lc3NhZ2U6IEZsb3dNZXNzYWdlID0geyB0eXBlLCBkZXNjcmlwdGlvbiwgdGltZXN0YW1wOiBEYXRlLm5vdygpLCAuLi5vcHRpb25zIH07XG4gICAgdGhpcy5kZWJ1Zy5hZGRGbG93TWVzc2FnZShmbG93TWVzc2FnZSk7XG4gIH1cblxuICAvLyDilIDilIAgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0U3RhZ2VJZCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5ydW5JZCB8fCB0aGlzLnJ1bklkID09PSAnJykgcmV0dXJuIHRoaXMuc3RhZ2VOYW1lO1xuICAgIHJldHVybiBgJHt0aGlzLnJ1bklkfS4ke3RoaXMuc3RhZ2VOYW1lfWA7XG4gIH1cblxuICBnZXRTbmFwc2hvdCgpOiBTdGFnZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdDogU3RhZ2VTbmFwc2hvdCA9IHtcbiAgICAgIGlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCB8fCB1bmRlZmluZWQsXG4gICAgICBuYW1lOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIGlzRGVjaWRlcjogdGhpcy5pc0RlY2lkZXIsXG4gICAgICBpc0Zvcms6IHRoaXMuaXNGb3JrLFxuICAgICAgbG9nczogdGhpcy5kZWJ1Zy5sb2dDb250ZXh0LFxuICAgICAgZXJyb3JzOiB0aGlzLmRlYnVnLmVycm9yQ29udGV4dCxcbiAgICAgIG1ldHJpY3M6IHRoaXMuZGVidWcubWV0cmljQ29udGV4dCxcbiAgICAgIGV2YWxzOiB0aGlzLmRlYnVnLmV2YWxDb250ZXh0LFxuICAgIH07XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlV3JpdGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBFeHRyYWN0IHZhbHVlcyBvbmx5IGZvciB0aGUgc25hcHNob3QgKHN0cmlwIG9wZXJhdGlvbiBtZXRhZGF0YSlcbiAgICAgIGNvbnN0IHdyaXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2ssIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl9zdGFnZVdyaXRlcykpIHtcbiAgICAgICAgd3JpdGVzW2tdID0gZW50cnkudmFsdWU7XG4gICAgICB9XG4gICAgICBzbmFwc2hvdC5zdGFnZVdyaXRlcyA9IHdyaXRlcztcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN0YWdlUmVhZHMgPSB0aGlzLl9zdGFnZVJlYWRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgc25hcHNob3QuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdWJmbG93SWQpIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dJZCA9IHRoaXMuc3ViZmxvd0lkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QuZmxvd01lc3NhZ2VzID0gdGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXM7XG4gICAgfVxuICAgIGlmICh0aGlzLm5leHQpIHtcbiAgICAgIHNuYXBzaG90Lm5leHQgPSB0aGlzLm5leHQuZ2V0U25hcHNob3QoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIHNuYXBzaG90LmNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbi5tYXAoKGMpID0+IGMuZ2V0U25hcHNob3QoKSk7XG4gICAgfVxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxufVxuIl19
@@ -4,4 +4,4 @@
4
4
  * Zero dependencies on old code or other libraries in this package.
5
5
  */
6
6
  export {};
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB0eXBlcy50cyDigJQgQ29yZSB0eXBlIGRlZmluaXRpb25zIGZvciB0aGUgbWVtb3J5IGxpYnJhcnlcbiAqXG4gKiBaZXJvIGRlcGVuZGVuY2llcyBvbiBvbGQgY29kZSBvciBvdGhlciBsaWJyYXJpZXMgaW4gdGhpcyBwYWNrYWdlLlxuICovXG5cbi8vIOKUgOKUgCBQYXRjaCAmIFRyYWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQSBmbGF0IGtleS12YWx1ZSBiYWcgcmVwcmVzZW50aW5nIGEgc3RhdGUgcGF0Y2ggKG92ZXJ3cml0ZSBvciBtZXJnZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeVBhdGNoIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKiogQSBzaW5nbGUgZW50cnkgaW4gdGhlIGNocm9ub2xvZ2ljYWwgb3BlcmF0aW9uIHRyYWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFjZUVudHJ5IHtcbiAgLyoqIENhbm9uaWNhbCBwYXRoIHN0cmluZyAoc2VnbWVudHMgam9pbmVkIGJ5IERFTElNKS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKiogJ3NldCcgPSBoYXJkIG92ZXJ3cml0ZSwgJ21lcmdlJyA9IGRlZXAgdW5pb24gbWVyZ2UuICovXG4gIHZlcmI6ICdzZXQnIHwgJ21lcmdlJztcbn1cblxuLyoqIFRoZSBhdG9taWMgYnVuZGxlIHByb2R1Y2VkIGJ5IFRyYW5zYWN0aW9uQnVmZmVyLmNvbW1pdCgpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21taXRCdW5kbGUge1xuICAvKiogQXV0by1hc3NpZ25lZCBzdGVwIGluZGV4IChzZXQgYnkgRXZlbnRMb2cucmVjb3JkKS4gKi9cbiAgaWR4PzogbnVtYmVyO1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZS4gKi9cbiAgc3RhZ2U6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFVuaXF1ZSBwZXItZXhlY3V0aW9uLXN0ZXAgaWRlbnRpZmllci4gRm9ybWF0OiBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXggKi9cbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIENocm9ub2xvZ2ljYWwgd3JpdGUgbG9nIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheS4gKi9cbiAgdHJhY2U6IFRyYWNlRW50cnlbXTtcbiAgLyoqIFBhdGhzIHRoYXQgc2hvdWxkIGJlIHJlZGFjdGVkIGluIFVJIChzZW5zaXRpdmUgZGF0YSkuICovXG4gIHJlZGFjdGVkUGF0aHM6IHN0cmluZ1tdO1xuICAvKiogSGFyZCBvdmVyd3JpdGUgcGF0Y2hlcy4gKi9cbiAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgLyoqIERlZXAgbWVyZ2UgcGF0Y2hlcy4gKi9cbiAgdXBkYXRlczogTWVtb3J5UGF0Y2g7XG59XG5cbi8vIOKUgOKUgCBGbG93IENvbnRyb2wgTmFycmF0aXZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogVHlwZXMgb2YgY29udHJvbCBmbG93IGRlY2lzaW9ucyBjYXB0dXJlZCBieSB0aGUgZXhlY3V0aW9uIGVuZ2luZS4gKi9cbmV4cG9ydCB0eXBlIEZsb3dDb250cm9sVHlwZSA9ICduZXh0JyB8ICdicmFuY2gnIHwgJ2NoaWxkcmVuJyB8ICdzZWxlY3RlZCcgfCAnc3ViZmxvdycgfCAnbG9vcCc7XG5cbi8qKiBBIHNpbmdsZSBmbG93IGNvbnRyb2wgbmFycmF0aXZlIGVudHJ5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93TWVzc2FnZSB7XG4gIHR5cGU6IEZsb3dDb250cm9sVHlwZTtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdGFyZ2V0U3RhZ2U/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgcmF0aW9uYWxlPzogc3RyaW5nO1xuICBjb3VudD86IG51bWJlcjtcbiAgaXRlcmF0aW9uPzogbnVtYmVyO1xuICB0aW1lc3RhbXA/OiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgCBTdGFnZSBTbmFwc2hvdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFNlcmlhbGlzYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhIHN0YWdlJ3Mgc3RhdGUgKGZvciBkZWJ1Z2dpbmcgLyB2aXN1YWxpc2F0aW9uKS4gKi9cbmV4cG9ydCB0eXBlIFN0YWdlU25hcHNob3QgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgc3RhZ2UgZG9lcyAoZnJvbSBidWlsZGVyKS4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIg4oCUIHByZXNlbnQgd2hlbiB0aGlzIHN0YWdlIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludC4gKi9cbiAgc3ViZmxvd0lkPzogc3RyaW5nO1xuICBpc0RlY2lkZXI/OiBib29sZWFuO1xuICBpc0Zvcms/OiBib29sZWFuO1xuICAvKiogVXNlci1sZXZlbCB3cml0ZXMgbWFkZSBieSB0aGlzIHN0YWdlIChwcmUtbmFtZXNwYWNlIGtleXMg4oaSIHZhbHVlcykuICovXG4gIHN0YWdlV3JpdGVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBVc2VyLWxldmVsIHJlYWRzIG1hZGUgYnkgdGhpcyBzdGFnZSAocHJlLW5hbWVzcGFjZSBrZXlzIOKGkiB2YWx1ZXMgYXQgcmVhZCB0aW1lKS4gKi9cbiAgc3RhZ2VSZWFkcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBsb2dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbWV0cmljczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV2YWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZmxvd01lc3NhZ2VzPzogRmxvd01lc3NhZ2VbXTtcbiAgbmV4dD86IFN0YWdlU25hcHNob3Q7XG4gIGNoaWxkcmVuPzogU3RhZ2VTbmFwc2hvdFtdO1xufTtcblxuLy8g4pSA4pSAIFNjb3BlIEZhY3Rvcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBGb3J3YXJkLWRlY2xhcmVkIHNvIFN0YWdlQ29udGV4dCBjYW4gYWNjZXB0IGl0IHdpdGhvdXQgaW1wb3J0aW5nIHNjb3BlLy4gKi9cbmV4cG9ydCB0eXBlIFNjb3BlRmFjdG9yeTxUU2NvcGU+ID0gKGNvcmU6IFN0YWdlQ29udGV4dCwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5Q29udGV4dD86IHVua25vd24pID0+IFRTY29wZTtcblxuLy8g4pSA4pSAIFN0YWdlQ29udGV4dCAoZm9yd2FyZCByZWZlcmVuY2UgZm9yIFNjb3BlRmFjdG9yeSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8vIFRoZSBhY3R1YWwgY2xhc3MgbGl2ZXMgaW4gU3RhZ2VDb250ZXh0LnRzOyB3ZSBqdXN0IG5lZWQgdGhlIHR5cGUgaGVyZSBmb3Jcbi8vIHRoZSBTY29wZUZhY3RvcnkgZ2VuZXJpYy4gVHlwZVNjcmlwdCdzIGltcG9ydC10eXBlIGhhbmRsZXMgdGhpczpcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi9TdGFnZUNvbnRleHQuanMnO1xuIl19
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB0eXBlcy50cyDigJQgQ29yZSB0eXBlIGRlZmluaXRpb25zIGZvciB0aGUgbWVtb3J5IGxpYnJhcnlcbiAqXG4gKiBaZXJvIGRlcGVuZGVuY2llcyBvbiBvbGQgY29kZSBvciBvdGhlciBsaWJyYXJpZXMgaW4gdGhpcyBwYWNrYWdlLlxuICovXG5cbi8vIOKUgOKUgCBQYXRjaCAmIFRyYWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQSBmbGF0IGtleS12YWx1ZSBiYWcgcmVwcmVzZW50aW5nIGEgc3RhdGUgcGF0Y2ggKG92ZXJ3cml0ZSBvciBtZXJnZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeVBhdGNoIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKiogQSBzaW5nbGUgZW50cnkgaW4gdGhlIGNocm9ub2xvZ2ljYWwgb3BlcmF0aW9uIHRyYWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFjZUVudHJ5IHtcbiAgLyoqIENhbm9uaWNhbCBwYXRoIHN0cmluZyAoc2VnbWVudHMgam9pbmVkIGJ5IERFTElNKS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKiogJ3NldCcgPSBoYXJkIG92ZXJ3cml0ZSwgJ21lcmdlJyA9IGRlZXAgdW5pb24gbWVyZ2UuICovXG4gIHZlcmI6ICdzZXQnIHwgJ21lcmdlJztcbn1cblxuLyoqIFRoZSBhdG9taWMgYnVuZGxlIHByb2R1Y2VkIGJ5IFRyYW5zYWN0aW9uQnVmZmVyLmNvbW1pdCgpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21taXRCdW5kbGUge1xuICAvKiogQXV0by1hc3NpZ25lZCBzdGVwIGluZGV4IChzZXQgYnkgRXZlbnRMb2cucmVjb3JkKS4gKi9cbiAgaWR4PzogbnVtYmVyO1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZS4gKi9cbiAgc3RhZ2U6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFVuaXF1ZSBwZXItZXhlY3V0aW9uLXN0ZXAgaWRlbnRpZmllci4gRm9ybWF0OiBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXggKi9cbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIENocm9ub2xvZ2ljYWwgd3JpdGUgbG9nIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheS4gKi9cbiAgdHJhY2U6IFRyYWNlRW50cnlbXTtcbiAgLyoqIFBhdGhzIHRoYXQgc2hvdWxkIGJlIHJlZGFjdGVkIGluIFVJIChzZW5zaXRpdmUgZGF0YSkuICovXG4gIHJlZGFjdGVkUGF0aHM6IHN0cmluZ1tdO1xuICAvKiogSGFyZCBvdmVyd3JpdGUgcGF0Y2hlcy4gKi9cbiAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgLyoqIERlZXAgbWVyZ2UgcGF0Y2hlcy4gKi9cbiAgdXBkYXRlczogTWVtb3J5UGF0Y2g7XG59XG5cbi8vIOKUgOKUgCBGbG93IENvbnRyb2wgTmFycmF0aXZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogVHlwZXMgb2YgY29udHJvbCBmbG93IGRlY2lzaW9ucyBjYXB0dXJlZCBieSB0aGUgZXhlY3V0aW9uIGVuZ2luZS4gKi9cbmV4cG9ydCB0eXBlIEZsb3dDb250cm9sVHlwZSA9ICduZXh0JyB8ICdicmFuY2gnIHwgJ2NoaWxkcmVuJyB8ICdzZWxlY3RlZCcgfCAnc3ViZmxvdycgfCAnbG9vcCc7XG5cbi8qKiBBIHNpbmdsZSBmbG93IGNvbnRyb2wgbmFycmF0aXZlIGVudHJ5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93TWVzc2FnZSB7XG4gIHR5cGU6IEZsb3dDb250cm9sVHlwZTtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdGFyZ2V0U3RhZ2U/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgcmF0aW9uYWxlPzogc3RyaW5nO1xuICBjb3VudD86IG51bWJlcjtcbiAgaXRlcmF0aW9uPzogbnVtYmVyO1xuICB0aW1lc3RhbXA/OiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgCBTdGFnZSBTbmFwc2hvdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFNlcmlhbGlzYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhIHN0YWdlJ3Mgc3RhdGUgKGZvciBkZWJ1Z2dpbmcgLyB2aXN1YWxpc2F0aW9uKS4gKi9cbmV4cG9ydCB0eXBlIFN0YWdlU25hcHNob3QgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIEZvcm1hdDogW3N1YmZsb3dQYXRoL11zdGFnZUlkI2V4ZWN1dGlvbkluZGV4ICovXG4gIHJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGlzIHN0YWdlIGRvZXMgKGZyb20gYnVpbGRlcikuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3ViZmxvdyBpZGVudGlmaWVyIOKAlCBwcmVzZW50IHdoZW4gdGhpcyBzdGFnZSBpcyBhIHN1YmZsb3cgZW50cnkgcG9pbnQuICovXG4gIHN1YmZsb3dJZD86IHN0cmluZztcbiAgaXNEZWNpZGVyPzogYm9vbGVhbjtcbiAgaXNGb3JrPzogYm9vbGVhbjtcbiAgLyoqIFVzZXItbGV2ZWwgd3JpdGVzIG1hZGUgYnkgdGhpcyBzdGFnZSAocHJlLW5hbWVzcGFjZSBrZXlzIOKGkiB2YWx1ZXMpLiAqL1xuICBzdGFnZVdyaXRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogVXNlci1sZXZlbCByZWFkcyBtYWRlIGJ5IHRoaXMgc3RhZ2UgKHByZS1uYW1lc3BhY2Uga2V5cyDihpIgdmFsdWVzIGF0IHJlYWQgdGltZSkuICovXG4gIHN0YWdlUmVhZHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbG9nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGVycm9yczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIG1ldHJpY3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBldmFsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZsb3dNZXNzYWdlcz86IEZsb3dNZXNzYWdlW107XG4gIG5leHQ/OiBTdGFnZVNuYXBzaG90O1xuICBjaGlsZHJlbj86IFN0YWdlU25hcHNob3RbXTtcbn07XG5cbi8vIOKUgOKUgCBTY29wZSBGYWN0b3J5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogRm9yd2FyZC1kZWNsYXJlZCBzbyBTdGFnZUNvbnRleHQgY2FuIGFjY2VwdCBpdCB3aXRob3V0IGltcG9ydGluZyBzY29wZS8uICovXG5leHBvcnQgdHlwZSBTY29wZUZhY3Rvcnk8VFNjb3BlPiA9IChjb3JlOiBTdGFnZUNvbnRleHQsIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seUNvbnRleHQ/OiB1bmtub3duKSA9PiBUU2NvcGU7XG5cbi8vIOKUgOKUgCBTdGFnZUNvbnRleHQgKGZvcndhcmQgcmVmZXJlbmNlIGZvciBTY29wZUZhY3RvcnkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vLyBUaGUgYWN0dWFsIGNsYXNzIGxpdmVzIGluIFN0YWdlQ29udGV4dC50czsgd2UganVzdCBuZWVkIHRoZSB0eXBlIGhlcmUgZm9yXG4vLyB0aGUgU2NvcGVGYWN0b3J5IGdlbmVyaWMuIFR5cGVTY3JpcHQncyBpbXBvcnQtdHlwZSBoYW5kbGVzIHRoaXM6XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4vU3RhZ2VDb250ZXh0LmpzJztcbiJdfQ==
@@ -2,16 +2,29 @@
2
2
  * KeyedRecorder<T> — base class for Map-based recorders keyed by runtimeStageId.
3
3
  *
4
4
  * Provides typed key-value storage with O(1) lookup, insertion-ordered iteration,
5
- * and common accessors. Recorder implementations extend this and call store()
6
- * from their event hooks.
5
+ * and three standard operations on auto-collected traversal data:
6
+ *
7
+ * - **Translate** (raw): `getByKey(id)` — per-step value
8
+ * - **Accumulate** (progressive): `accumulate(fn, initial, keys?)` — running total up to a point
9
+ * - **Aggregate** (summary): `aggregate(fn, initial)` — reduce all entries
10
+ *
11
+ * Data is automatically collected during the single DFS traversal.
12
+ * The consumer chooses the operation at read time.
7
13
  *
8
14
  * @example
9
15
  * ```typescript
10
16
  * class TokenRecorder extends KeyedRecorder<LLMCallEntry> {
11
- * onLLMCall(event: LLMCallEvent) {
12
- * this.store(event.runtimeStageId, { model: event.model, ... });
13
- * }
14
- * getStats() { return aggregate(this.values()); }
17
+ * readonly id = 'tokens';
18
+ * onLLMCall(event) { this.store(event.runtimeStageId, { tokens: event.usage }); }
19
+ *
20
+ * // Translate: per-step
21
+ * getForStep(id: string) { return this.getByKey(id); }
22
+ *
23
+ * // Aggregate: total
24
+ * getTotalTokens() { return this.aggregate((sum, e) => sum + e.tokens, 0); }
25
+ *
26
+ * // Accumulate: progressive up to slider position
27
+ * getTokensUpTo(keys: Set<string>) { return this.accumulate((sum, e) => sum + e.tokens, 0, keys); }
15
28
  * }
16
29
  * ```
17
30
  */
@@ -23,6 +36,7 @@ export class KeyedRecorder {
23
36
  store(runtimeStageId, entry) {
24
37
  this.data.set(runtimeStageId, entry);
25
38
  }
39
+ // ── Translate (raw per-step) ──────────────────────────────
26
40
  /** O(1) lookup by runtimeStageId. */
27
41
  getByKey(runtimeStageId) {
28
42
  return this.data.get(runtimeStageId);
@@ -39,9 +53,44 @@ export class KeyedRecorder {
39
53
  get size() {
40
54
  return this.data.size;
41
55
  }
56
+ // ── Aggregate (reduce all entries) ────────────────────────
57
+ /** Reduce ALL entries to a single value. For dashboards, totals, summaries. */
58
+ aggregate(fn, initial) {
59
+ let acc = initial;
60
+ for (const [key, entry] of this.data) {
61
+ acc = fn(acc, entry, key);
62
+ }
63
+ return acc;
64
+ }
65
+ // ── Accumulate (progressive reduce) ───────────────────────
66
+ /**
67
+ * Reduce entries, optionally filtered by a set of keys.
68
+ * For time-travel progressive view: pass the runtimeStageIds visible at the current slider position.
69
+ * Without keys, reduces all entries (same as aggregate).
70
+ */
71
+ accumulate(fn, initial, keys) {
72
+ let acc = initial;
73
+ for (const [key, entry] of this.data) {
74
+ if (keys && !keys.has(key))
75
+ continue;
76
+ acc = fn(acc, entry, key);
77
+ }
78
+ return acc;
79
+ }
80
+ // ── Filter (subset by keys) ───────────────────────────────
81
+ /** Return entries whose keys are in the set, preserving insertion order. */
82
+ filterByKeys(keys) {
83
+ const result = [];
84
+ for (const [key, entry] of this.data) {
85
+ if (keys.has(key))
86
+ result.push(entry);
87
+ }
88
+ return result;
89
+ }
90
+ // ── Lifecycle ─────────────────────────────────────────────
42
91
  /** Clear all stored data. Called by executor before each run(). */
43
92
  clear() {
44
93
  this.data.clear();
45
94
  }
46
95
  }
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2V5ZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvS2V5ZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sT0FBZ0IsYUFBYTtJQUFuQztRQUdtQixTQUFJLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztJQStCL0MsQ0FBQztJQTdCQyw4Q0FBOEM7SUFDcEMsS0FBSyxDQUFDLGNBQXNCLEVBQUUsS0FBUTtRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxRQUFRLENBQUMsY0FBc0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsMERBQTBEO0lBQzFELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxNQUFNO1FBQ0osT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLEtBQUs7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3BCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogS2V5ZWRSZWNvcmRlcjxUPiDigJQgYmFzZSBjbGFzcyBmb3IgTWFwLWJhc2VkIHJlY29yZGVycyBrZXllZCBieSBydW50aW1lU3RhZ2VJZC5cbiAqXG4gKiBQcm92aWRlcyB0eXBlZCBrZXktdmFsdWUgc3RvcmFnZSB3aXRoIE8oMSkgbG9va3VwLCBpbnNlcnRpb24tb3JkZXJlZCBpdGVyYXRpb24sXG4gKiBhbmQgY29tbW9uIGFjY2Vzc29ycy4gUmVjb3JkZXIgaW1wbGVtZW50YXRpb25zIGV4dGVuZCB0aGlzIGFuZCBjYWxsIHN0b3JlKClcbiAqIGZyb20gdGhlaXIgZXZlbnQgaG9va3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFRva2VuUmVjb3JkZXIgZXh0ZW5kcyBLZXllZFJlY29yZGVyPExMTUNhbGxFbnRyeT4ge1xuICogICBvbkxMTUNhbGwoZXZlbnQ6IExMTUNhbGxFdmVudCkge1xuICogICAgIHRoaXMuc3RvcmUoZXZlbnQucnVudGltZVN0YWdlSWQsIHsgbW9kZWw6IGV2ZW50Lm1vZGVsLCAuLi4gfSk7XG4gKiAgIH1cbiAqICAgZ2V0U3RhdHMoKSB7IHJldHVybiBhZ2dyZWdhdGUodGhpcy52YWx1ZXMoKSk7IH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgS2V5ZWRSZWNvcmRlcjxUPiB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhID0gbmV3IE1hcDxzdHJpbmcsIFQ+KCk7XG5cbiAgLyoqIFN0b3JlIGFuIGVudHJ5IGtleWVkIGJ5IHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBwcm90ZWN0ZWQgc3RvcmUocnVudGltZVN0YWdlSWQ6IHN0cmluZywgZW50cnk6IFQpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEuc2V0KHJ1bnRpbWVTdGFnZUlkLCBlbnRyeSk7XG4gIH1cblxuICAvKiogTygxKSBsb29rdXAgYnkgcnVudGltZVN0YWdlSWQuICovXG4gIGdldEJ5S2V5KHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdldChydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKiogQWxsIGVudHJpZXMgYXMgYSByZWFkLW9ubHkgTWFwIChpbnNlcnRpb24tb3JkZXJlZCkuICovXG4gIGdldE1hcCgpOiBSZWFkb25seU1hcDxzdHJpbmcsIFQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xuICB9XG5cbiAgLyoqIEFsbCBlbnRyaWVzIGFzIGFuIGFycmF5IChpbnNlcnRpb24tb3JkZXJlZCkuICovXG4gIHZhbHVlcygpOiBUW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5kYXRhLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2YgZW50cmllcyBzdG9yZWQuICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zaXplO1xuICB9XG5cbiAgLyoqIENsZWFyIGFsbCBzdG9yZWQgZGF0YS4gQ2FsbGVkIGJ5IGV4ZWN1dG9yIGJlZm9yZSBlYWNoIHJ1bigpLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEuY2xlYXIoKTtcbiAgfVxufVxuIl19
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2V5ZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvS2V5ZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFNLE9BQWdCLGFBQWE7SUFBbkM7UUFHbUIsU0FBSSxHQUFHLElBQUksR0FBRyxFQUFhLENBQUM7SUF5RS9DLENBQUM7SUF2RUMsOENBQThDO0lBQ3BDLEtBQUssQ0FBQyxjQUFzQixFQUFFLEtBQVE7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCw2REFBNkQ7SUFFN0QscUNBQXFDO0lBQ3JDLFFBQVEsQ0FBQyxjQUFzQjtRQUM3QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCwwREFBMEQ7SUFDMUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsbURBQW1EO0lBQ25ELE1BQU07UUFDSixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFRCw2REFBNkQ7SUFFN0QsK0VBQStFO0lBQy9FLFNBQVMsQ0FBSSxFQUF3QyxFQUFFLE9BQVU7UUFDL0QsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDO1FBQ2xCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCw2REFBNkQ7SUFFN0Q7Ozs7T0FJRztJQUNILFVBQVUsQ0FBSSxFQUF3QyxFQUFFLE9BQVUsRUFBRSxJQUEwQjtRQUM1RixJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUM7UUFDbEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUFFLFNBQVM7WUFDckMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCw2REFBNkQ7SUFFN0QsNEVBQTRFO0lBQzVFLFlBQVksQ0FBQyxJQUF5QjtRQUNwQyxNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDdkIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCw2REFBNkQ7SUFFN0QsbUVBQW1FO0lBQ25FLEtBQUs7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3BCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogS2V5ZWRSZWNvcmRlcjxUPiDigJQgYmFzZSBjbGFzcyBmb3IgTWFwLWJhc2VkIHJlY29yZGVycyBrZXllZCBieSBydW50aW1lU3RhZ2VJZC5cbiAqXG4gKiBQcm92aWRlcyB0eXBlZCBrZXktdmFsdWUgc3RvcmFnZSB3aXRoIE8oMSkgbG9va3VwLCBpbnNlcnRpb24tb3JkZXJlZCBpdGVyYXRpb24sXG4gKiBhbmQgdGhyZWUgc3RhbmRhcmQgb3BlcmF0aW9ucyBvbiBhdXRvLWNvbGxlY3RlZCB0cmF2ZXJzYWwgZGF0YTpcbiAqXG4gKiAgIC0gKipUcmFuc2xhdGUqKiAocmF3KTogYGdldEJ5S2V5KGlkKWAg4oCUIHBlci1zdGVwIHZhbHVlXG4gKiAgIC0gKipBY2N1bXVsYXRlKiogKHByb2dyZXNzaXZlKTogYGFjY3VtdWxhdGUoZm4sIGluaXRpYWwsIGtleXM/KWAg4oCUIHJ1bm5pbmcgdG90YWwgdXAgdG8gYSBwb2ludFxuICogICAtICoqQWdncmVnYXRlKiogKHN1bW1hcnkpOiBgYWdncmVnYXRlKGZuLCBpbml0aWFsKWAg4oCUIHJlZHVjZSBhbGwgZW50cmllc1xuICpcbiAqIERhdGEgaXMgYXV0b21hdGljYWxseSBjb2xsZWN0ZWQgZHVyaW5nIHRoZSBzaW5nbGUgREZTIHRyYXZlcnNhbC5cbiAqIFRoZSBjb25zdW1lciBjaG9vc2VzIHRoZSBvcGVyYXRpb24gYXQgcmVhZCB0aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBUb2tlblJlY29yZGVyIGV4dGVuZHMgS2V5ZWRSZWNvcmRlcjxMTE1DYWxsRW50cnk+IHtcbiAqICAgcmVhZG9ubHkgaWQgPSAndG9rZW5zJztcbiAqICAgb25MTE1DYWxsKGV2ZW50KSB7IHRoaXMuc3RvcmUoZXZlbnQucnVudGltZVN0YWdlSWQsIHsgdG9rZW5zOiBldmVudC51c2FnZSB9KTsgfVxuICpcbiAqICAgLy8gVHJhbnNsYXRlOiBwZXItc3RlcFxuICogICBnZXRGb3JTdGVwKGlkOiBzdHJpbmcpIHsgcmV0dXJuIHRoaXMuZ2V0QnlLZXkoaWQpOyB9XG4gKlxuICogICAvLyBBZ2dyZWdhdGU6IHRvdGFsXG4gKiAgIGdldFRvdGFsVG9rZW5zKCkgeyByZXR1cm4gdGhpcy5hZ2dyZWdhdGUoKHN1bSwgZSkgPT4gc3VtICsgZS50b2tlbnMsIDApOyB9XG4gKlxuICogICAvLyBBY2N1bXVsYXRlOiBwcm9ncmVzc2l2ZSB1cCB0byBzbGlkZXIgcG9zaXRpb25cbiAqICAgZ2V0VG9rZW5zVXBUbyhrZXlzOiBTZXQ8c3RyaW5nPikgeyByZXR1cm4gdGhpcy5hY2N1bXVsYXRlKChzdW0sIGUpID0+IHN1bSArIGUudG9rZW5zLCAwLCBrZXlzKTsgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBLZXllZFJlY29yZGVyPFQ+IHtcbiAgYWJzdHJhY3QgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGEgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcblxuICAvKiogU3RvcmUgYW4gZW50cnkga2V5ZWQgYnkgcnVudGltZVN0YWdlSWQuICovXG4gIHByb3RlY3RlZCBzdG9yZShydW50aW1lU3RhZ2VJZDogc3RyaW5nLCBlbnRyeTogVCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YS5zZXQocnVudGltZVN0YWdlSWQsIGVudHJ5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUcmFuc2xhdGUgKHJhdyBwZXItc3RlcCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIE8oMSkgbG9va3VwIGJ5IHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBnZXRCeUtleShydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5nZXQocnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIEFsbCBlbnRyaWVzIGFzIGEgcmVhZC1vbmx5IE1hcCAoaW5zZXJ0aW9uLW9yZGVyZWQpLiAqL1xuICBnZXRNYXAoKTogUmVhZG9ubHlNYXA8c3RyaW5nLCBUPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgfVxuXG4gIC8qKiBBbGwgZW50cmllcyBhcyBhbiBhcnJheSAoaW5zZXJ0aW9uLW9yZGVyZWQpLiAqL1xuICB2YWx1ZXMoKTogVFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZGF0YS52YWx1ZXMoKV07XG4gIH1cblxuICAvKiogTnVtYmVyIG9mIGVudHJpZXMgc3RvcmVkLiAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRhdGEuc2l6ZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBBZ2dyZWdhdGUgKHJlZHVjZSBhbGwgZW50cmllcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJlZHVjZSBBTEwgZW50cmllcyB0byBhIHNpbmdsZSB2YWx1ZS4gRm9yIGRhc2hib2FyZHMsIHRvdGFscywgc3VtbWFyaWVzLiAqL1xuICBhZ2dyZWdhdGU8Uj4oZm46IChhY2M6IFIsIGVudHJ5OiBULCBrZXk6IHN0cmluZykgPT4gUiwgaW5pdGlhbDogUik6IFIge1xuICAgIGxldCBhY2MgPSBpbml0aWFsO1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMuZGF0YSkge1xuICAgICAgYWNjID0gZm4oYWNjLCBlbnRyeSwga2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfVxuXG4gIC8vIOKUgOKUgCBBY2N1bXVsYXRlIChwcm9ncmVzc2l2ZSByZWR1Y2UpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZWR1Y2UgZW50cmllcywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBhIHNldCBvZiBrZXlzLlxuICAgKiBGb3IgdGltZS10cmF2ZWwgcHJvZ3Jlc3NpdmUgdmlldzogcGFzcyB0aGUgcnVudGltZVN0YWdlSWRzIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgc2xpZGVyIHBvc2l0aW9uLlxuICAgKiBXaXRob3V0IGtleXMsIHJlZHVjZXMgYWxsIGVudHJpZXMgKHNhbWUgYXMgYWdncmVnYXRlKS5cbiAgICovXG4gIGFjY3VtdWxhdGU8Uj4oZm46IChhY2M6IFIsIGVudHJ5OiBULCBrZXk6IHN0cmluZykgPT4gUiwgaW5pdGlhbDogUiwga2V5cz86IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBSIHtcbiAgICBsZXQgYWNjID0gaW5pdGlhbDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGlmIChrZXlzICYmICFrZXlzLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGFjYyA9IGZuKGFjYywgZW50cnksIGtleSk7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH1cblxuICAvLyDilIDilIAgRmlsdGVyIChzdWJzZXQgYnkga2V5cykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJldHVybiBlbnRyaWVzIHdob3NlIGtleXMgYXJlIGluIHRoZSBzZXQsIHByZXNlcnZpbmcgaW5zZXJ0aW9uIG9yZGVyLiAqL1xuICBmaWx0ZXJCeUtleXMoa2V5czogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IFRbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBUW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGlmIChrZXlzLmhhcyhrZXkpKSByZXN1bHQucHVzaChlbnRyeSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDbGVhciBhbGwgc3RvcmVkIGRhdGEuIENhbGxlZCBieSBleGVjdXRvciBiZWZvcmUgZWFjaCBydW4oKS4gKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhLmNsZWFyKCk7XG4gIH1cbn1cbiJdfQ==
@@ -1,39 +1,32 @@
1
1
  /**
2
- * MetricRecorder — Production-focused recorder for timing and execution counts.
2
+ * MetricRecorder — per-step timing and execution counts, keyed by runtimeStageId.
3
3
  *
4
- * Tracks read/write/commit counts per stage and measures stage execution duration.
5
- *
6
- * Each instance gets a unique auto-increment ID (`metrics-1`, `metrics-2`, ...),
7
- * so multiple recorders with different configs coexist. Pass an explicit ID to
8
- * override a specific instance (e.g., a framework-attached recorder).
4
+ * Stores per-invocation data during traversal. Aggregated views computed on read.
5
+ * Extends KeyedRecorder<StepMetrics> for O(1) lookup and standard operations.
9
6
  *
10
7
  * @example
11
8
  * ```typescript
12
- * // Track all stages (default)
13
- * executor.attachRecorder(new MetricRecorder());
9
+ * const metric = new MetricRecorder();
10
+ * executor.attachRecorder(metric);
11
+ * await executor.run();
14
12
  *
15
- * // Track only LLM-related stages
16
- * executor.attachRecorder(new MetricRecorder({
17
- * stageFilter: (name) => ['CallLLM', 'ParseResponse'].includes(name),
18
- * }));
13
+ * // Per-step (time-travel):
14
+ * metric.getByKey('call-llm#5'); // { stageName, readCount, writeCount, duration }
19
15
  *
20
- * // Two recorders: one for LLM timing, one for everything else
21
- * executor.attachRecorder(new MetricRecorder({
22
- * stageFilter: (name) => name === 'CallLLM',
23
- * }));
24
- * executor.attachRecorder(new MetricRecorder({
25
- * stageFilter: (name) => name !== 'CallLLM',
26
- * }));
16
+ * // Aggregated (backward compat):
17
+ * metric.getMetrics(); // { totalDuration, totalReads, stageMetrics: Map<stageName, aggregated> }
27
18
  *
28
- * // Override a framework-attached recorder by passing its well-known ID
29
- * executor.attachRecorder(new MetricRecorder({ id: 'metrics' }));
19
+ * // Progressive (slider):
20
+ * metric.accumulate((sum, m) => sum + m.duration, 0, visibleKeys);
30
21
  * ```
31
22
  */
32
- export class MetricRecorder {
23
+ import { KeyedRecorder } from '../../recorder/KeyedRecorder.js';
24
+ export class MetricRecorder extends KeyedRecorder {
33
25
  constructor(idOrOptions) {
34
26
  var _a;
35
- this.metrics = new Map();
27
+ super();
36
28
  this.stageStartTimes = new Map();
29
+ this.currentRuntimeStageId = '';
37
30
  if (typeof idOrOptions === 'string') {
38
31
  this.id = idOrOptions;
39
32
  }
@@ -45,73 +38,96 @@ export class MetricRecorder {
45
38
  shouldRecord(stageName) {
46
39
  return !this.stageFilter || this.stageFilter(stageName);
47
40
  }
41
+ /** Get or create the StepMetrics for the current stage. */
42
+ current() {
43
+ const key = this.currentRuntimeStageId;
44
+ let m = this.getByKey(key);
45
+ if (!m) {
46
+ m = { stageName: '', readCount: 0, writeCount: 0, commitCount: 0, pauseCount: 0, duration: 0 };
47
+ this.store(key, m);
48
+ }
49
+ return m;
50
+ }
51
+ onStageStart(event) {
52
+ if (!this.shouldRecord(event.stageName))
53
+ return;
54
+ this.currentRuntimeStageId = event.runtimeStageId;
55
+ this.stageStartTimes.set(event.runtimeStageId, event.timestamp);
56
+ const m = this.current();
57
+ m.stageName = event.stageName;
58
+ }
48
59
  onRead(event) {
49
60
  if (!this.shouldRecord(event.stageName))
50
61
  return;
51
- this.getOrCreateStageMetrics(event.stageName).readCount++;
62
+ this.current().readCount++;
52
63
  }
53
64
  onWrite(event) {
54
65
  if (!this.shouldRecord(event.stageName))
55
66
  return;
56
- this.getOrCreateStageMetrics(event.stageName).writeCount++;
67
+ this.current().writeCount++;
57
68
  }
58
69
  onCommit(event) {
59
70
  if (!this.shouldRecord(event.stageName))
60
71
  return;
61
- this.getOrCreateStageMetrics(event.stageName).commitCount++;
72
+ this.current().commitCount++;
62
73
  }
63
74
  onPause(event) {
64
75
  if (!this.shouldRecord(event.stageName))
65
76
  return;
66
- this.getOrCreateStageMetrics(event.stageName).pauseCount++;
67
- }
68
- onStageStart(event) {
69
- if (!this.shouldRecord(event.stageName))
70
- return;
71
- this.stageStartTimes.set(event.stageName, event.timestamp);
72
- this.getOrCreateStageMetrics(event.stageName).invocationCount++;
77
+ this.current().pauseCount++;
73
78
  }
74
79
  onStageEnd(event) {
75
80
  if (!this.shouldRecord(event.stageName))
76
81
  return;
77
- const stageMetrics = this.getOrCreateStageMetrics(event.stageName);
78
- let duration;
82
+ const m = this.current();
79
83
  if (event.duration !== undefined) {
80
- duration = event.duration;
84
+ m.duration = event.duration;
81
85
  }
82
86
  else {
83
- const startTime = this.stageStartTimes.get(event.stageName);
84
- duration = startTime !== undefined ? event.timestamp - startTime : 0;
87
+ const startTime = this.stageStartTimes.get(event.runtimeStageId);
88
+ m.duration = startTime !== undefined ? event.timestamp - startTime : 0;
85
89
  }
86
- stageMetrics.totalDuration += duration;
87
- this.stageStartTimes.delete(event.stageName);
90
+ this.stageStartTimes.delete(event.runtimeStageId);
88
91
  }
92
+ /** Aggregated metrics — computes totals on the fly from per-step data (backward compatible). */
89
93
  getMetrics() {
90
- let totalDuration = 0;
91
- let totalReads = 0;
92
- let totalWrites = 0;
93
- let totalCommits = 0;
94
- let totalPauses = 0;
95
- for (const stageMetrics of this.metrics.values()) {
96
- totalDuration += stageMetrics.totalDuration;
97
- totalReads += stageMetrics.readCount;
98
- totalWrites += stageMetrics.writeCount;
99
- totalCommits += stageMetrics.commitCount;
100
- totalPauses += stageMetrics.pauseCount;
94
+ const byName = new Map();
95
+ const totalDuration = this.aggregate((sum, m) => sum + m.duration, 0);
96
+ const totalReads = this.aggregate((sum, m) => sum + m.readCount, 0);
97
+ const totalWrites = this.aggregate((sum, m) => sum + m.writeCount, 0);
98
+ const totalCommits = this.aggregate((sum, m) => sum + m.commitCount, 0);
99
+ const totalPauses = this.aggregate((sum, m) => sum + m.pauseCount, 0);
100
+ // Group by stageName for backward compat
101
+ for (const m of this.values()) {
102
+ const existing = byName.get(m.stageName);
103
+ if (existing) {
104
+ existing.readCount += m.readCount;
105
+ existing.writeCount += m.writeCount;
106
+ existing.commitCount += m.commitCount;
107
+ existing.pauseCount += m.pauseCount;
108
+ existing.totalDuration += m.duration;
109
+ existing.invocationCount++;
110
+ }
111
+ else {
112
+ byName.set(m.stageName, {
113
+ stageName: m.stageName,
114
+ readCount: m.readCount,
115
+ writeCount: m.writeCount,
116
+ commitCount: m.commitCount,
117
+ pauseCount: m.pauseCount,
118
+ totalDuration: m.duration,
119
+ invocationCount: 1,
120
+ });
121
+ }
101
122
  }
102
- return {
103
- totalDuration,
104
- totalReads,
105
- totalWrites,
106
- totalCommits,
107
- totalPauses,
108
- stageMetrics: new Map(this.metrics),
109
- };
123
+ return { totalDuration, totalReads, totalWrites, totalCommits, totalPauses, stageMetrics: byName };
110
124
  }
125
+ /** Get aggregated metrics for a specific stage name (backward compatible). */
111
126
  getStageMetrics(stageName) {
112
- const metrics = this.metrics.get(stageName);
113
- return metrics ? { ...metrics } : undefined;
127
+ const metrics = this.getMetrics();
128
+ return metrics.stageMetrics.get(stageName);
114
129
  }
130
+ /** Snapshot for serialization (backward compatible format). */
115
131
  toSnapshot() {
116
132
  const metrics = this.getMetrics();
117
133
  return {
@@ -125,29 +141,16 @@ export class MetricRecorder {
125
141
  },
126
142
  };
127
143
  }
128
- reset() {
129
- this.metrics.clear();
130
- this.stageStartTimes.clear();
131
- }
144
+ /** Clear all state — called by executor before each run(). */
132
145
  clear() {
133
- this.reset();
146
+ super.clear();
147
+ this.stageStartTimes.clear();
148
+ this.currentRuntimeStageId = '';
134
149
  }
135
- getOrCreateStageMetrics(stageName) {
136
- let stageMetrics = this.metrics.get(stageName);
137
- if (!stageMetrics) {
138
- stageMetrics = {
139
- stageName,
140
- readCount: 0,
141
- writeCount: 0,
142
- commitCount: 0,
143
- pauseCount: 0,
144
- totalDuration: 0,
145
- invocationCount: 0,
146
- };
147
- this.metrics.set(stageName, stageMetrics);
148
- }
149
- return stageMetrics;
150
+ /** Alias for clear() (backward compat). */
151
+ reset() {
152
+ this.clear();
150
153
  }
151
154
  }
152
155
  MetricRecorder._counter = 0;
153
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWV0cmljUmVjb3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Njb3BlL3JlY29yZGVycy9NZXRyaWNSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBd0NILE1BQU0sT0FBTyxjQUFjO0lBUXpCLFlBQVksV0FBNEM7O1FBSmhELFlBQU8sR0FBOEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUMvQyxvQkFBZSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBSXZELElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsRUFBRSxHQUFHLE1BQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLEVBQUUsbUNBQUksV0FBVyxFQUFFLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwRSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxXQUFXLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsU0FBaUI7UUFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWdCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPO1FBQ2hELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFpQjtRQUN2QixJQUFJLENB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Z0JBQ2IsYUFBYSxFQUFFLENBQUM7Z0JBQ2hCLGVBQWUsRUFBRSxDQUFDO2FBQ25CLENBQUM7WUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7O0FBaEljLHVCQUFRLEdBQUcsQ0FBQyxBQUFKLENBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1ldHJpY1JlY29yZGVyIOKAlCBQcm9kdWN0aW9uLWZvY3VzZWQgcmVjb3JkZXIgZm9yIHRpbWluZyBhbmQgZXhlY3V0aW9uIGNvdW50cy5cbiAqXG4gKiBUcmFja3MgcmVhZC93cml0ZS9jb21taXQgY291bnRzIHBlciBzdGFnZSBhbmQgbWVhc3VyZXMgc3RhZ2UgZXhlY3V0aW9uIGR1cmF0aW9uLlxuICpcbiAqIEVhY2ggaW5zdGFuY2UgZ2V0cyBhIHVuaXF1ZSBhdXRvLWluY3JlbWVudCBJRCAoYG1ldHJpY3MtMWAsIGBtZXRyaWNzLTJgLCAuLi4pLFxuICogc28gbXVsdGlwbGUgcmVjb3JkZXJzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3MgY29leGlzdC4gUGFzcyBhbiBleHBsaWNpdCBJRCB0b1xuICogb3ZlcnJpZGUgYSBzcGVjaWZpYyBpbnN0YW5jZSAoZS5nLiwgYSBmcmFtZXdvcmstYXR0YWNoZWQgcmVjb3JkZXIpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBUcmFjayBhbGwgc3RhZ2VzIChkZWZhdWx0KVxuICogZXhlY3V0b3IuYXR0YWNoUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCkpO1xuICpcbiAqIC8vIFRyYWNrIG9ubHkgTExNLXJlbGF0ZWQgc3RhZ2VzXG4gKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoe1xuICogICBzdGFnZUZpbHRlcjogKG5hbWUpID0+IFsnQ2FsbExMTScsICdQYXJzZVJlc3BvbnNlJ10uaW5jbHVkZXMobmFtZSksXG4gKiB9KSk7XG4gKlxuICogLy8gVHdvIHJlY29yZGVyczogb25lIGZvciBMTE0gdGltaW5nLCBvbmUgZm9yIGV2ZXJ5dGhpbmcgZWxzZVxuICogZXhlY3V0b3IuYXR0YWNoUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKHtcbiAqICAgc3RhZ2VGaWx0ZXI6IChuYW1lKSA9PiBuYW1lID09PSAnQ2FsbExMTScsXG4gKiB9KSk7XG4gKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoe1xuICogICBzdGFnZUZpbHRlcjogKG5hbWUpID0+IG5hbWUgIT09ICdDYWxsTExNJyxcbiAqIH0pKTtcbiAqXG4gKiAvLyBPdmVycmlkZSBhIGZyYW1ld29yay1hdHRhY2hlZCByZWNvcmRlciBieSBwYXNzaW5nIGl0cyB3ZWxsLWtub3duIElEXG4gKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoeyBpZDogJ21ldHJpY3MnIH0pKTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tbWl0RXZlbnQsIFBhdXNlRXZlbnQsIFJlYWRFdmVudCwgUmVjb3JkZXIsIFN0YWdlRXZlbnQsIFdyaXRlRXZlbnQgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZ2VNZXRyaWNzIHtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIHJlYWRDb3VudDogbnVtYmVyO1xuICB3cml0ZUNvdW50OiBudW1iZXI7XG4gIGNvbW1pdENvdW50OiBudW1iZXI7XG4gIHBhdXNlQ291bnQ6IG51bWJlcjtcbiAgdG90YWxEdXJhdGlvbjogbnVtYmVyO1xuICBpbnZvY2F0aW9uQ291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZ2dyZWdhdGVkTWV0cmljcyB7XG4gIHRvdGFsRHVyYXRpb246IG51bWJlcjtcbiAgdG90YWxSZWFkczogbnVtYmVyO1xuICB0b3RhbFdyaXRlczogbnVtYmVyO1xuICB0b3RhbENvbW1pdHM6IG51bWJlcjtcbiAgdG90YWxQYXVzZXM6IG51bWJlcjtcbiAgc3RhZ2VNZXRyaWNzOiBNYXA8c3RyaW5nLCBTdGFnZU1ldHJpY3M+O1xufVxuXG4vKiogT3B0aW9ucyBmb3IgTWV0cmljUmVjb3JkZXIuIEFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNSZWNvcmRlck9wdGlvbnMge1xuICAvKiogUmVjb3JkZXIgSUQuIERlZmF1bHRzIHRvIGF1dG8taW5jcmVtZW50IChgbWV0cmljcy0xYCwgYG1ldHJpY3MtMmAsIC4uLikuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKipcbiAgICogRmlsdGVyIHdoaWNoIHN0YWdlcyBhcmUgcmVjb3JkZWQuIFJldHVybiBgdHJ1ZWAgdG8gcmVjb3JkLCBgZmFsc2VgIHRvIHNraXAuXG4gICAqIFdoZW4gb21pdHRlZCwgYWxsIHN0YWdlcyBhcmUgcmVjb3JkZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gT25seSB0cmFjayBzdGFnZXMgdGhhdCBzdGFydCB3aXRoIFwiQ2FsbFwiXG4gICAqIHN0YWdlRmlsdGVyOiAobmFtZSkgPT4gbmFtZS5zdGFydHNXaXRoKCdDYWxsJylcbiAgICogYGBgXG4gICAqL1xuICBzdGFnZUZpbHRlcj86IChzdGFnZU5hbWU6IHN0cmluZykgPT4gYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIE1ldHJpY1JlY29yZGVyIGltcGxlbWVudHMgUmVjb3JkZXIge1xuICBwcml2YXRlIHN0YXRpYyBfY291bnRlciA9IDA7XG5cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBtZXRyaWNzOiBNYXA8c3RyaW5nLCBTdGFnZU1ldHJpY3M+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHN0YWdlU3RhcnRUaW1lczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzdGFnZUZpbHRlcj86IChzdGFnZU5hbWU6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihpZE9yT3B0aW9ucz86IHN0cmluZyB8IE1ldHJpY1JlY29yZGVyT3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgaWRPck9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmlkID0gaWRPck9wdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaWQgPSBpZE9yT3B0aW9ucz8uaWQgPz8gYG1ldHJpY3MtJHsrK01ldHJpY1JlY29yZGVyLl9jb3VudGVyfWA7XG4gICAgICB0aGlzLnN0YWdlRmlsdGVyID0gaWRPck9wdGlvbnM/LnN0YWdlRmlsdGVyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVjb3JkKHN0YWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnN0YWdlRmlsdGVyIHx8IHRoaXMuc3RhZ2VGaWx0ZXIoc3RhZ2VOYW1lKTtcbiAgfVxuXG4gIG9uUmVhZChldmVudDogUmVhZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFJlY29yZChldmVudC5zdGFnZU5hbWUpKSByZXR1cm47XG4gICAgdGhpcy5nZXRPckNyZWF0ZVN0YWdlTWV0cmljcyhldmVudC5zdGFnZU5hbWUpLnJlYWRDb3VudCsrO1xuICB9XG5cbiAgb25Xcml0ZShldmVudDogV3JpdGVFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRSZWNvcmQoZXZlbnQuc3RhZ2VOYW1lKSkgcmV0dXJuO1xuICAgIHRoaXMuZ2V0T3JDcmVhdGVTdGFnZU1ldHJpY3MoZXZlbnQuc3RhZ2VOYW1lKS53cml0ZUNvdW50Kys7XG4gIH1cblxuICBvbkNvbW1pdChldmVudDogQ29tbWl0RXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkUmVjb3JkKGV2ZW50LnN0YWdlTmFtZSkpIHJldHVybjtcbiAgICB0aGlzLmdldE9yQ3JlYXRlU3RhZ2VNZXRyaWNzKGV2ZW50LnN0YWdlTmFtZSkuY29tbWl0Q291bnQrKztcbiAgfVxuXG4gIG9uUGF1c2UoZXZlbnQ6IFBhdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkUmVjb3JkKGV2ZW50LnN0YWdlTmFtZSkpIHJldHVybjtcbiAgICB0aGlzLmdldE9yQ3JlYXRlU3RhZ2VNZXRyaWNzKGV2ZW50LnN0YWdlTmFtZSkucGF1c2VDb3VudCsrO1xuICB9XG5cbiAgb25TdGFnZVN0YXJ0KGV2ZW50OiBTdGFnZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFJlY29yZChldmVudC5zdGFnZU5hbWUpKSByZXR1cm47XG4gICAgdGhpcy5zdGFnZVN0YXJ0VGltZXMuc2V0KGV2ZW50LnN0YWdlTmFtZSwgZXZlbnQudGltZXN0YW1wKTtcbiAgICB0aGlzLmdldE9yQ3JlYXRlU3RhZ2VNZXRyaWNzKGV2ZW50LnN0YWdlTmFtZSkuaW52b2NhdGlvbkNvdW50Kys7XG4gIH1cblxuICBvblN0YWdlRW5kKGV2ZW50OiBTdGFnZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFJlY29yZChldmVudC5zdGFnZU5hbWUpKSByZXR1cm47XG4gICAgY29uc3Qgc3RhZ2VNZXRyaWNzID0gdGhpcy5nZXRPckNyZWF0ZVN0YWdlTWV0cmljcyhldmVudC5zdGFnZU5hbWUpO1xuICAgIGxldCBkdXJhdGlvbjogbnVtYmVyO1xuICAgIGlmIChldmVudC5kdXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkdXJhdGlvbiA9IGV2ZW50LmR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSB0aGlzLnN0YWdlU3RhcnRUaW1lcy5nZXQoZXZlbnQuc3RhZ2VOYW1lKTtcbiAgICAgIGR1cmF0aW9uID0gc3RhcnRUaW1lICE9PSB1bmRlZmluZWQgPyBldmVudC50aW1lc3RhbXAgLSBzdGFydFRpbWUgOiAwO1xuICAgIH1cbiAgICBzdGFnZU1ldHJpY3MudG90YWxEdXJhdGlvbiArPSBkdXJhdGlvbjtcbiAgICB0aGlzLnN0YWdlU3RhcnRUaW1lcy5kZWxldGUoZXZlbnQuc3RhZ2VOYW1lKTtcbiAgfVxuXG4gIGdldE1ldHJpY3MoKTogQWdncmVnYXRlZE1ldHJpY3Mge1xuICAgIGxldCB0b3RhbER1cmF0aW9uID0gMDtcbiAgICBsZXQgdG90YWxSZWFkcyA9IDA7XG4gICAgbGV0IHRvdGFsV3JpdGVzID0gMDtcbiAgICBsZXQgdG90YWxDb21taXRzID0gMDtcbiAgICBsZXQgdG90YWxQYXVzZXMgPSAwO1xuXG4gICAgZm9yIChjb25zdCBzdGFnZU1ldHJpY3Mgb2YgdGhpcy5tZXRyaWNzLnZhbHVlcygpKSB7XG4gICAgICB0b3RhbER1cmF0aW9uICs9IHN0YWdlTWV0cmljcy50b3RhbER1cmF0aW9uO1xuICAgICAgdG90YWxSZWFkcyArPSBzdGFnZU1ldHJpY3MucmVhZENvdW50O1xuICAgICAgdG90YWxXcml0ZXMgKz0gc3RhZ2VNZXRyaWNzLndyaXRlQ291bnQ7XG4gICAgICB0b3RhbENvbW1pdHMgKz0gc3RhZ2VNZXRyaWNzLmNvbW1pdENvdW50O1xuICAgICAgdG90YWxQYXVzZXMgKz0gc3RhZ2VNZXRyaWNzLnBhdXNlQ291bnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsRHVyYXRpb24sXG4gICAgICB0b3RhbFJlYWRzLFxuICAgICAgdG90YWxXcml0ZXMsXG4gICAgICB0b3RhbENvbW1pdHMsXG4gICAgICB0b3RhbFBhdXNlcyxcbiAgICAgIHN0YWdlTWV0cmljczogbmV3IE1hcCh0aGlzLm1ldHJpY3MpLFxuICAgIH07XG4gIH1cblxuICBnZXRTdGFnZU1ldHJpY3Moc3RhZ2VOYW1lOiBzdHJpbmcpOiBTdGFnZU1ldHJpY3MgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLm1ldHJpY3MuZ2V0KHN0YWdlTmFtZSk7XG4gICAgcmV0dXJuIG1ldHJpY3MgPyB7IC4uLm1ldHJpY3MgfSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRvU25hcHNob3QoKTogeyBuYW1lOiBzdHJpbmc7IGRhdGE6IHVua25vd24gfSB7XG4gICAgY29uc3QgbWV0cmljcyA9IHRoaXMuZ2V0TWV0cmljcygpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnTWV0cmljcycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRvdGFsRHVyYXRpb246IG1ldHJpY3MudG90YWxEdXJhdGlvbixcbiAgICAgICAgdG90YWxSZWFkczogbWV0cmljcy50b3RhbFJlYWRzLFxuICAgICAgICB0b3RhbFdyaXRlczogbWV0cmljcy50b3RhbFdyaXRlcyxcbiAgICAgICAgdG90YWxDb21taXRzOiBtZXRyaWNzLnRvdGFsQ29tbWl0cyxcbiAgICAgICAgc3RhZ2VzOiBPYmplY3QuZnJvbUVudHJpZXMobWV0cmljcy5zdGFnZU1ldHJpY3MpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5tZXRyaWNzLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFnZVN0YXJ0VGltZXMuY2xlYXIoKTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVTdGFnZU1ldHJpY3Moc3RhZ2VOYW1lOiBzdHJpbmcpOiBTdGFnZU1ldHJpY3Mge1xuICAgIGxldCBzdGFnZU1ldHJpY3MgPSB0aGlzLm1ldHJpY3MuZ2V0KHN0YWdlTmFtZSk7XG4gICAgaWYgKCFzdGFnZU1ldHJpY3MpIHtcbiAgICAgIHN0YWdlTWV0cmljcyA9IHtcbiAgICAgICAgc3RhZ2VOYW1lLFxuICAgICAgICByZWFkQ291bnQ6IDAsXG4gICAgICAgIHdyaXRlQ291bnQ6IDAsXG4gICAgICAgIGNvbW1pdENvdW50OiAwLFxuICAgICAgICBwYXVzZUNvdW50OiAwLFxuICAgICAgICB0b3RhbER1cmF0aW9uOiAwLFxuICAgICAgICBpbnZvY2F0aW9uQ291bnQ6IDAsXG4gICAgICB9O1xuICAgICAgdGhpcy5tZXRyaWNzLnNldChzdGFnZU5hbWUsIHN0YWdlTWV0cmljcyk7XG4gICAgfVxuICAgIHJldHVybiBzdGFnZU1ldHJpY3M7XG4gIH1cbn1cbiJdfQ==
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWV0cmljUmVjb3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Njb3BlL3JlY29yZGVycy9NZXRyaWNSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBaURoRSxNQUFNLE9BQU8sY0FBZSxTQUFRLGFBQTBCO0lBUTVELFlBQVksV0FBNEM7O1FBQ3RELEtBQUssRUFBRSxDQUFDO1FBTEYsb0JBQWUsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUM1QywwQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFLakMsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUN4QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBQSxXQUFXLGFBQVgsV0FBVyx1QkFBWCxXQUFXLENBQUUsRUFBRSxtQ0FBSSxXQUFXLEVBQUUsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BFLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLFdBQVcsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVPLFlBQVksQ0FBQyxTQUFpQjtRQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCwyREFBMkQ7SUFDbkQsT0FBTztRQUNiLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUN2QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxDQUFDLEVB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WUFBWSxDQUFDO2FBQ2pEO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCw4REFBOEQ7SUFDckQsS0FBSztRQUNaLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLEtBQUs7UUFDSCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDOztBQTNJYyx1QkFBUSxHQUFHLENBQUMsQUFBSixDQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZXRyaWNSZWNvcmRlciDigJQgcGVyLXN0ZXAgdGltaW5nIGFuZCBleGVjdXRpb24gY291bnRzLCBrZXllZCBieSBydW50aW1lU3RhZ2VJZC5cbiAqXG4gKiBTdG9yZXMgcGVyLWludm9jYXRpb24gZGF0YSBkdXJpbmcgdHJhdmVyc2FsLiBBZ2dyZWdhdGVkIHZpZXdzIGNvbXB1dGVkIG9uIHJlYWQuXG4gKiBFeHRlbmRzIEtleWVkUmVjb3JkZXI8U3RlcE1ldHJpY3M+IGZvciBPKDEpIGxvb2t1cCBhbmQgc3RhbmRhcmQgb3BlcmF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbWV0cmljID0gbmV3IE1ldHJpY1JlY29yZGVyKCk7XG4gKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihtZXRyaWMpO1xuICogYXdhaXQgZXhlY3V0b3IucnVuKCk7XG4gKlxuICogLy8gUGVyLXN0ZXAgKHRpbWUtdHJhdmVsKTpcbiAqIG1ldHJpYy5nZXRCeUtleSgnY2FsbC1sbG0jNScpOyAgLy8geyBzdGFnZU5hbWUsIHJlYWRDb3VudCwgd3JpdGVDb3VudCwgZHVyYXRpb24gfVxuICpcbiAqIC8vIEFnZ3JlZ2F0ZWQgKGJhY2t3YXJkIGNvbXBhdCk6XG4gKiBtZXRyaWMuZ2V0TWV0cmljcygpOyAgLy8geyB0b3RhbER1cmF0aW9uLCB0b3RhbFJlYWRzLCBzdGFnZU1ldHJpY3M6IE1hcDxzdGFnZU5hbWUsIGFnZ3JlZ2F0ZWQ+IH1cbiAqXG4gKiAvLyBQcm9ncmVzc2l2ZSAoc2xpZGVyKTpcbiAqIG1ldHJpYy5hY2N1bXVsYXRlKChzdW0sIG0pID0+IHN1bSArIG0uZHVyYXRpb24sIDAsIHZpc2libGVLZXlzKTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IEtleWVkUmVjb3JkZXIgfSBmcm9tICcuLi8uLi9yZWNvcmRlci9LZXllZFJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0RXZlbnQsIFBhdXNlRXZlbnQsIFJlYWRFdmVudCwgUmVjb3JkZXIsIFN0YWdlRXZlbnQsIFdyaXRlRXZlbnQgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8qKiBQZXItaW52b2NhdGlvbiBtZXRyaWNzIGZvciBhIHNpbmdsZSBleGVjdXRpb24gc3RlcC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcE1ldHJpY3Mge1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZS4gKi9cbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2Ygc2NvcGUgcmVhZHMgZHVyaW5nIHRoaXMgaW52b2NhdGlvbi4gKi9cbiAgcmVhZENvdW50OiBudW1iZXI7XG4gIC8qKiBOdW1iZXIgb2Ygc2NvcGUgd3JpdGVzIGR1cmluZyB0aGlzIGludm9jYXRpb24uICovXG4gIHdyaXRlQ291bnQ6IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBjb21taXRzIGR1cmluZyB0aGlzIGludm9jYXRpb24uICovXG4gIGNvbW1pdENvdW50OiBudW1iZXI7XG4gIC8qKiBOdW1iZXIgb2YgcGF1c2VzIGR1cmluZyB0aGlzIGludm9jYXRpb24uICovXG4gIHBhdXNlQ291bnQ6IG51bWJlcjtcbiAgLyoqIER1cmF0aW9uIGluIG1zIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIGR1cmF0aW9uOiBudW1iZXI7XG59XG5cbi8qKiBBZ2dyZWdhdGVkIG1ldHJpY3MgYWNyb3NzIGFsbCBpbnZvY2F0aW9ucyAoYmFja3dhcmQgY29tcGF0aWJsZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEFnZ3JlZ2F0ZWRNZXRyaWNzIHtcbiAgdG90YWxEdXJhdGlvbjogbnVtYmVyO1xuICB0b3RhbFJlYWRzOiBudW1iZXI7XG4gIHRvdGFsV3JpdGVzOiBudW1iZXI7XG4gIHRvdGFsQ29tbWl0czogbnVtYmVyO1xuICB0b3RhbFBhdXNlczogbnVtYmVyO1xuICAvKiogQWdncmVnYXRlZCBieSBzdGFnZU5hbWUg4oCUIHN1bXMgYWNyb3NzIGxvb3AgaW52b2NhdGlvbnMuICovXG4gIHN0YWdlTWV0cmljczogTWFwPHN0cmluZywgU3RhZ2VNZXRyaWNzPjtcbn1cblxuLyoqIEFnZ3JlZ2F0ZWQgcGVyLXN0YWdlTmFtZSAoYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIHByZS1ydW50aW1lU3RhZ2VJZCBBUEkpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFnZU1ldHJpY3Mge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgcmVhZENvdW50OiBudW1iZXI7XG4gIHdyaXRlQ291bnQ6IG51bWJlcjtcbiAgY29tbWl0Q291bnQ6IG51bWJlcjtcbiAgcGF1c2VDb3VudDogbnVtYmVyO1xuICB0b3RhbER1cmF0aW9uOiBudW1iZXI7XG4gIGludm9jYXRpb25Db3VudDogbnVtYmVyO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgTWV0cmljUmVjb3JkZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY1JlY29yZGVyT3B0aW9ucyB7XG4gIC8qKiBSZWNvcmRlciBJRC4gRGVmYXVsdHMgdG8gYXV0by1pbmNyZW1lbnQgKGBtZXRyaWNzLTFgLCBgbWV0cmljcy0yYCwgLi4uKS4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBGaWx0ZXIgd2hpY2ggc3RhZ2VzIGFyZSByZWNvcmRlZC4gUmV0dXJuIGB0cnVlYCB0byByZWNvcmQsIGBmYWxzZWAgdG8gc2tpcC4gKi9cbiAgc3RhZ2VGaWx0ZXI/OiAoc3RhZ2VOYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBNZXRyaWNSZWNvcmRlciBleHRlbmRzIEtleWVkUmVjb3JkZXI8U3RlcE1ldHJpY3M+IGltcGxlbWVudHMgUmVjb3JkZXIge1xuICBwcml2YXRlIHN0YXRpYyBfY291bnRlciA9IDA7XG5cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBzdGFnZVN0YXJ0VGltZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIGN1cnJlbnRSdW50aW1lU3RhZ2VJZCA9ICcnO1xuICBwcml2YXRlIHN0YWdlRmlsdGVyPzogKHN0YWdlTmFtZTogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGlkT3JPcHRpb25zPzogc3RyaW5nIHwgTWV0cmljUmVjb3JkZXJPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAodHlwZW9mIGlkT3JPcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5pZCA9IGlkT3JPcHRpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlkID0gaWRPck9wdGlvbnM/LmlkID8/IGBtZXRyaWNzLSR7KytNZXRyaWNSZWNvcmRlci5fY291bnRlcn1gO1xuICAgICAgdGhpcy5zdGFnZUZpbHRlciA9IGlkT3JPcHRpb25zPy5zdGFnZUZpbHRlcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlY29yZChzdGFnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5zdGFnZUZpbHRlciB8fCB0aGlzLnN0YWdlRmlsdGVyKHN0YWdlTmFtZSk7XG4gIH1cblxuICAvKiogR2V0IG9yIGNyZWF0ZSB0aGUgU3RlcE1ldHJpY3MgZm9yIHRoZSBjdXJyZW50IHN0YWdlLiAqL1xuICBwcml2YXRlIGN1cnJlbnQoKTogU3RlcE1ldHJpY3Mge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY3VycmVudFJ1bnRpbWVTdGFnZUlkO1xuICAgIGxldCBtID0gdGhpcy5nZXRCeUtleShrZXkpO1xuICAgIGlmICghbSkge1xuICAgICAgbSA9IHsgc3RhZ2VOYW1lOiAnJywgcmVhZENvdW50OiAwLCB3cml0ZUNvdW50OiAwLCBjb21taXRDb3VudDogMCwgcGF1c2VDb3VudDogMCwgZHVyYXRpb246IDAgfTtcbiAgICAgIHRoaXMuc3RvcmUoa2V5LCBtKTtcbiAgICB9XG4gICAgcmV0dXJuIG07XG4gIH1cblxuICBvblN0YWdlU3RhcnQoZXZlbnQ6IFN0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkUmVjb3JkKGV2ZW50LnN0YWdlTmFtZSkpIHJldHVybjtcbiAgICB0aGlzLmN1cnJlbnRSdW50aW1lU3RhZ2VJZCA9IGV2ZW50LnJ1bnRpbWVTdGFnZUlkO1xuICAgIHRoaXMuc3RhZ2VTdGFydFRpbWVzLnNldChldmVudC5ydW50aW1lU3RhZ2VJZCwgZXZlbnQudGltZXN0YW1wKTtcbiAgICBjb25zdCBtID0gdGhpcy5jdXJyZW50KCk7XG4gICAgbS5zdGFnZU5hbWUgPSBldmVudC5zdGFnZU5hbWU7XG4gIH1cblxuICBvblJlYWQoZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRSZWNvcmQoZXZlbnQuc3RhZ2VOYW1lKSkgcmV0dXJuO1xuICAgIHRoaXMuY3VycmVudCgpLnJlYWRDb3VudCsrO1xuICB9XG5cbiAgb25Xcml0ZShldmVudDogV3JpdGVFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRSZWNvcmQoZXZlbnQuc3RhZ2VOYW1lKSkgcmV0dXJuO1xuICAgIHRoaXMuY3VycmVudCgpLndyaXRlQ291bnQrKztcbiAgfVxuXG4gIG9uQ29tbWl0KGV2ZW50OiBDb21taXRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRSZWNvcmQoZXZlbnQuc3RhZ2VOYW1lKSkgcmV0dXJuO1xuICAgIHRoaXMuY3VycmVudCgpLmNvbW1pdENvdW50Kys7XG4gIH1cblxuICBvblBhdXNlKGV2ZW50OiBQYXVzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFJlY29yZChldmVudC5zdGFnZU5hbWUpKSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50KCkucGF1c2VDb3VudCsrO1xuICB9XG5cbiAgb25TdGFnZUVuZChldmVudDogU3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRSZWNvcmQoZXZlbnQuc3RhZ2VOYW1lKSkgcmV0dXJuO1xuICAgIGNvbnN0IG0gPSB0aGlzLmN1cnJlbnQoKTtcbiAgICBpZiAoZXZlbnQuZHVyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbS5kdXJhdGlvbiA9IGV2ZW50LmR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSB0aGlzLnN0YWdlU3RhcnRUaW1lcy5nZXQoZXZlbnQucnVudGltZVN0YWdlSWQpO1xuICAgICAgbS5kdXJhdGlvbiA9IHN0YXJ0VGltZSAhPT0gdW5kZWZpbmVkID8gZXZlbnQudGltZXN0YW1wIC0gc3RhcnRUaW1lIDogMDtcbiAgICB9XG4gICAgdGhpcy5zdGFnZVN0YXJ0VGltZXMuZGVsZXRlKGV2ZW50LnJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKiBBZ2dyZWdhdGVkIG1ldHJpY3Mg4oCUIGNvbXB1dGVzIHRvdGFscyBvbiB0aGUgZmx5IGZyb20gcGVyLXN0ZXAgZGF0YSAoYmFja3dhcmQgY29tcGF0aWJsZSkuICovXG4gIGdldE1ldHJpY3MoKTogQWdncmVnYXRlZE1ldHJpY3Mge1xuICAgIGNvbnN0IGJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBTdGFnZU1ldHJpY3M+KCk7XG5cbiAgICBjb25zdCB0b3RhbER1cmF0aW9uID0gdGhpcy5hZ2dyZWdhdGUoKHN1bSwgbSkgPT4gc3VtICsgbS5kdXJhdGlvbiwgMCk7XG4gICAgY29uc3QgdG90YWxSZWFkcyA9IHRoaXMuYWdncmVnYXRlKChzdW0sIG0pID0+IHN1bSArIG0ucmVhZENvdW50LCAwKTtcbiAgICBjb25zdCB0b3RhbFdyaXRlcyA9IHRoaXMuYWdncmVnYXRlKChzdW0sIG0pID0+IHN1bSArIG0ud3JpdGVDb3VudCwgMCk7XG4gICAgY29uc3QgdG90YWxDb21taXRzID0gdGhpcy5hZ2dyZWdhdGUoKHN1bSwgbSkgPT4gc3VtICsgbS5jb21taXRDb3VudCwgMCk7XG4gICAgY29uc3QgdG90YWxQYXVzZXMgPSB0aGlzLmFnZ3JlZ2F0ZSgoc3VtLCBtKSA9PiBzdW0gKyBtLnBhdXNlQ291bnQsIDApO1xuXG4gICAgLy8gR3JvdXAgYnkgc3RhZ2VOYW1lIGZvciBiYWNrd2FyZCBjb21wYXRcbiAgICBmb3IgKGNvbnN0IG0gb2YgdGhpcy52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBieU5hbWUuZ2V0KG0uc3RhZ2VOYW1lKTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICBleGlzdGluZy5yZWFkQ291bnQgKz0gbS5yZWFkQ291bnQ7XG4gICAgICAgIGV4aXN0aW5nLndyaXRlQ291bnQgKz0gbS53cml0ZUNvdW50O1xuICAgICAgICBleGlzdGluZy5jb21taXRDb3VudCArPSBtLmNvbW1pdENvdW50O1xuICAgICAgICBleGlzdGluZy5wYXVzZUNvdW50ICs9IG0ucGF1c2VDb3VudDtcbiAgICAgICAgZXhpc3RpbmcudG90YWxEdXJhdGlvbiArPSBtLmR1cmF0aW9uO1xuICAgICAgICBleGlzdGluZy5pbnZvY2F0aW9uQ291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ5TmFtZS5zZXQobS5zdGFnZU5hbWUsIHtcbiAgICAgICAgICBzdGFnZU5hbWU6IG0uc3RhZ2VOYW1lLFxuICAgICAgICAgIHJlYWRDb3VudDogbS5yZWFkQ291bnQsXG4gICAgICAgICAgd3JpdGVDb3VudDogbS53cml0ZUNvdW50LFxuICAgICAgICAgIGNvbW1pdENvdW50OiBtLmNvbW1pdENvdW50LFxuICAgICAgICAgIHBhdXNlQ291bnQ6IG0ucGF1c2VDb3VudCxcbiAgICAgICAgICB0b3RhbER1cmF0aW9uOiBtLmR1cmF0aW9uLFxuICAgICAgICAgIGludm9jYXRpb25Db3VudDogMSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdG90YWxEdXJhdGlvbiwgdG90YWxSZWFkcywgdG90YWxXcml0ZXMsIHRvdGFsQ29tbWl0cywgdG90YWxQYXVzZXMsIHN0YWdlTWV0cmljczogYnlOYW1lIH07XG4gIH1cblxuICAvKiogR2V0IGFnZ3JlZ2F0ZWQgbWV0cmljcyBmb3IgYSBzcGVjaWZpYyBzdGFnZSBuYW1lIChiYWNrd2FyZCBjb21wYXRpYmxlKS4gKi9cbiAgZ2V0U3RhZ2VNZXRyaWNzKHN0YWdlTmFtZTogc3RyaW5nKTogU3RhZ2VNZXRyaWNzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5nZXRNZXRyaWNzKCk7XG4gICAgcmV0dXJuIG1ldHJpY3Muc3RhZ2VNZXRyaWNzLmdldChzdGFnZU5hbWUpO1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IGZvciBzZXJpYWxpemF0aW9uIChiYWNrd2FyZCBjb21wYXRpYmxlIGZvcm1hdCkuICovXG4gIHRvU25hcHNob3QoKTogeyBuYW1lOiBzdHJpbmc7IGRhdGE6IHVua25vd24gfSB7XG4gICAgY29uc3QgbWV0cmljcyA9IHRoaXMuZ2V0TWV0cmljcygpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnTWV0cmljcycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRvdGFsRHVyYXRpb246IG1ldHJpY3MudG90YWxEdXJhdGlvbixcbiAgICAgICAgdG90YWxSZWFkczogbWV0cmljcy50b3RhbFJlYWRzLFxuICAgICAgICB0b3RhbFdyaXRlczogbWV0cmljcy50b3RhbFdyaXRlcyxcbiAgICAgICAgdG90YWxDb21taXRzOiBtZXRyaWNzLnRvdGFsQ29tbWl0cyxcbiAgICAgICAgc3RhZ2VzOiBPYmplY3QuZnJvbUVudHJpZXMobWV0cmljcy5zdGFnZU1ldHJpY3MpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIENsZWFyIGFsbCBzdGF0ZSDigJQgY2FsbGVkIGJ5IGV4ZWN1dG9yIGJlZm9yZSBlYWNoIHJ1bigpLiAqL1xuICBvdmVycmlkZSBjbGVhcigpOiB2b2lkIHtcbiAgICBzdXBlci5jbGVhcigpO1xuICAgIHRoaXMuc3RhZ2VTdGFydFRpbWVzLmNsZWFyKCk7XG4gICAgdGhpcy5jdXJyZW50UnVudGltZVN0YWdlSWQgPSAnJztcbiAgfVxuXG4gIC8qKiBBbGlhcyBmb3IgY2xlYXIoKSAoYmFja3dhcmQgY29tcGF0KS4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG59XG4iXX0=
@@ -1,3 +1,3 @@
1
1
  export { DebugRecorder } from './DebugRecorder.js';
2
2
  export { MetricRecorder } from './MetricRecorder.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Njb3BlL3JlY29yZGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cbmV4cG9ydCB0eXBlIHtcbiAgQ29tbWl0RXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIFJlYWRFdmVudCxcbiAgUmVjb3JkZXIsXG4gIFJlY29yZGVyQ29udGV4dCxcbiAgU3RhZ2VFdmVudCxcbiAgV3JpdGVFdmVudCxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuZXhwb3J0IHR5cGUgeyBEZWJ1Z0VudHJ5LCBEZWJ1Z1JlY29yZGVyT3B0aW9ucywgRGVidWdWZXJib3NpdHkgfSBmcm9tICcuL0RlYnVnUmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgRGVidWdSZWNvcmRlciB9IGZyb20gJy4vRGVidWdSZWNvcmRlci5qcyc7XG5leHBvcnQgdHlwZSB7IEFnZ3JlZ2F0ZWRNZXRyaWNzLCBTdGFnZU1ldHJpY3MgfSBmcm9tICcuL01ldHJpY1JlY29yZGVyLmpzJztcbmV4cG9ydCB7IE1ldHJpY1JlY29yZGVyIH0gZnJvbSAnLi9NZXRyaWNSZWNvcmRlci5qcyc7XG4iXX0=
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Njb3BlL3JlY29yZGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cbmV4cG9ydCB0eXBlIHtcbiAgQ29tbWl0RXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIFJlYWRFdmVudCxcbiAgUmVjb3JkZXIsXG4gIFJlY29yZGVyQ29udGV4dCxcbiAgU3RhZ2VFdmVudCxcbiAgV3JpdGVFdmVudCxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuZXhwb3J0IHR5cGUgeyBEZWJ1Z0VudHJ5LCBEZWJ1Z1JlY29yZGVyT3B0aW9ucywgRGVidWdWZXJib3NpdHkgfSBmcm9tICcuL0RlYnVnUmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgRGVidWdSZWNvcmRlciB9IGZyb20gJy4vRGVidWdSZWNvcmRlci5qcyc7XG5leHBvcnQgdHlwZSB7IEFnZ3JlZ2F0ZWRNZXRyaWNzLCBTdGFnZU1ldHJpY3MsIFN0ZXBNZXRyaWNzIH0gZnJvbSAnLi9NZXRyaWNSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBNZXRyaWNSZWNvcmRlciB9IGZyb20gJy4vTWV0cmljUmVjb3JkZXIuanMnO1xuIl19