@hivegpt/hiveai-angular 0.0.425 → 0.0.428

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/bundles/hivegpt-hiveai-angular.umd.js +506 -164
  2. package/bundles/hivegpt-hiveai-angular.umd.js.map +1 -1
  3. package/bundles/hivegpt-hiveai-angular.umd.min.js +1 -1
  4. package/bundles/hivegpt-hiveai-angular.umd.min.js.map +1 -1
  5. package/esm2015/hivegpt-hiveai-angular.js +6 -4
  6. package/esm2015/lib/components/chat-drawer/chat-drawer.component.js +22 -7
  7. package/esm2015/lib/components/voice-agent/services/audio-analyzer.service.js +5 -1
  8. package/esm2015/lib/components/voice-agent/services/daily-voice-client.service.js +181 -0
  9. package/esm2015/lib/components/voice-agent/services/voice-agent.service.js +134 -140
  10. package/esm2015/lib/components/voice-agent/services/websocket-voice-client.service.js +95 -0
  11. package/esm2015/lib/components/voice-agent/voice-agent.module.js +10 -2
  12. package/fesm2015/hivegpt-hiveai-angular.js +432 -149
  13. package/fesm2015/hivegpt-hiveai-angular.js.map +1 -1
  14. package/hivegpt-hiveai-angular.d.ts +5 -3
  15. package/hivegpt-hiveai-angular.d.ts.map +1 -1
  16. package/hivegpt-hiveai-angular.metadata.json +1 -1
  17. package/lib/components/chat-drawer/chat-drawer.component.d.ts +7 -0
  18. package/lib/components/chat-drawer/chat-drawer.component.d.ts.map +1 -1
  19. package/lib/components/voice-agent/services/audio-analyzer.service.d.ts +4 -0
  20. package/lib/components/voice-agent/services/audio-analyzer.service.d.ts.map +1 -1
  21. package/lib/components/voice-agent/services/daily-voice-client.service.d.ts +48 -0
  22. package/lib/components/voice-agent/services/daily-voice-client.service.d.ts.map +1 -0
  23. package/lib/components/voice-agent/services/voice-agent.service.d.ts +24 -8
  24. package/lib/components/voice-agent/services/voice-agent.service.d.ts.map +1 -1
  25. package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts +49 -0
  26. package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts.map +1 -0
  27. package/lib/components/voice-agent/voice-agent.module.d.ts +4 -0
  28. package/lib/components/voice-agent/voice-agent.module.d.ts.map +1 -1
  29. package/package.json +2 -1
@@ -1,6 +1,10 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import { BehaviorSubject } from 'rxjs';
3
3
  import * as i0 from "@angular/core";
4
+ /**
5
+ * Audio analyzer for waveform visualization only.
6
+ * Do NOT use isUserSpeaking$ for call state; speaking state must come from Daily.js.
7
+ */
4
8
  export class AudioAnalyzerService {
5
9
  constructor() {
6
10
  this.audioContext = null;
@@ -116,4 +120,4 @@ AudioAnalyzerService.decorators = [
116
120
  providedIn: 'root'
117
121
  },] }
118
122
  ];
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW8tYW5hbHl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9oaXR0aGFrdXIvaGl2ZS1ncHQvSGl2ZUFJLVBhY2thZ2VzL0FuZ3VsYXIvcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy92b2ljZS1hZ2VudC9zZXJ2aWNlcy9hdWRpby1hbmFseXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7QUFLbkQsTUFBTSxPQUFPLG9CQUFvQjtJQUhqQztRQUlVLGlCQUFZLEdBQXdCLElBQUksQ0FBQztRQUN6QyxpQkFBWSxHQUF3QixJQUFJLENBQUM7UUFDekMsY0FBUyxHQUFzQixJQUFJLENBQUM7UUFDcEMscUJBQWdCLEdBQWtCLElBQUksQ0FBQztRQUN2QyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWxCLHVCQUFrQixHQUFHLElBQUksZUFBZSxDQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRXBFLGlDQUFpQztRQUN6QixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2Ysc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLDZCQUF3QixHQUFHLEVBQUUsQ0FBQztRQUM5QixrQ0FBNkIsR0FBRyxHQUFHLENBQUM7UUFDcEMsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBRXpDLGlCQUFZLEdBQXlCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM1RSxvQkFBZSxHQUF3QixJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFLENBQUM7S0FnSGxGO0lBOUdDLEtBQUssQ0FBQyxNQUFtQjtRQUN2QixJQUFJLElB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Q0FBQyxFQUFFLEVBQUU7WUFDcEMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ3pDLEdBQUcsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLG9CQUFvQixDQUFDLElBQWdCO1FBQzNDLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFL0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoRCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixxQkFBcUI7WUFDckIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkQ7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Ozs7WUFwSUYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEF1ZGlvQW5hbHl6ZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBhdWRpb0NvbnRleHQ6IEF1ZGlvQ29udGV4dCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFuYWx5c2VyTm9kZTogQW5hbHlzZXJOb2RlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGF0YUFycmF5OiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYW5pbWF0aW9uRnJhbWVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaXNSdW5uaW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBhdWRpb0xldmVsc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcltdPihbXSk7XG4gIHByaXZhdGUgaXNVc2VyU3BlYWtpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gQWRhcHRpdmUgbm9pc2UgZmxvb3IgZGV0ZWN0aW9uXG4gIHByaXZhdGUgbm9pc2VGbG9vciA9IDA7XG4gIHByaXZhdGUgbm9pc2VGbG9vclNhbXBsZXM6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgTk9JU0VfRkxPT1JfU0FNUExFX0NPVU5UID0gMzA7XG4gIHByaXZhdGUgcmVhZG9ubHkgU1BFQUtJTkdfVEhSRVNIT0xEX01VTFRJUExJRVIgPSAyLjU7XG4gIHByaXZhdGUgcmVhZG9ubHkgV0FWRUZPUk1fQkFSX0NPVU5UID0gNDA7XG5cbiAgYXVkaW9MZXZlbHMkOiBPYnNlcnZhYmxlPG51bWJlcltdPiA9IHRoaXMuYXVkaW9MZXZlbHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBpc1VzZXJTcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmlzVXNlclNwZWFraW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBzdGFydChzdHJlYW06IE1lZGlhU3RyZWFtKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5hdWRpb0NvbnRleHQgPSBuZXcgKHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgKHdpbmRvdyBhcyBhbnkpLndlYmtpdEF1ZGlvQ29udGV4dCkoKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuYXVkaW9Db250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKHN0cmVhbSk7XG4gICAgICBcbiAgICAgIHRoaXMuYW5hbHlzZXJOb2RlID0gdGhpcy5hdWRpb0NvbnRleHQuY3JlYXRlQW5hbHlzZXIoKTtcbiAgICAgIHRoaXMuYW5hbHlzZXJOb2RlLmZmdFNpemUgPSAyMDQ4O1xuICAgICAgdGhpcy5hbmFseXNlck5vZGUuc21vb3RoaW5nVGltZUNvbnN0YW50ID0gMC44O1xuICAgICAgXG4gICAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmFuYWx5c2VyTm9kZS5mcmVxdWVuY3lCaW5Db3VudDtcbiAgICAgIHRoaXMuZGF0YUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyTGVuZ3RoKTtcbiAgICAgIFxuICAgICAgc291cmNlLmNvbm5lY3QodGhpcy5hbmFseXNlck5vZGUpO1xuICAgICAgXG4gICAgICB0aGlzLmlzUnVubmluZyA9IHRydWU7XG4gICAgICB0aGlzLm5vaXNlRmxvb3JTYW1wbGVzID0gW107XG4gICAgICB0aGlzLm5vaXNlRmxvb3IgPSAwO1xuICAgICAgXG4gICAgICB0aGlzLmFuYWx5emUoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgYXVkaW8gYW5hbHl6ZXI6JywgZXJyb3IpO1xuICAgICAgdGhpcy5zdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgc3RvcCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xuICAgIFxuICAgIGlmICh0aGlzLmFuaW1hdGlvbkZyYW1lSWQgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgICB0aGlzLmFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFuYWx5c2VyTm9kZSkge1xuICAgICAgdGhpcy5hbmFseXNlck5vZGUuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5hbmFseXNlck5vZGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmF1ZGlvQ29udGV4dCAmJiB0aGlzLmF1ZGlvQ29udGV4dC5zdGF0ZSAhPT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHRoaXMuYXVkaW9Db250ZXh0LmNsb3NlKCkuY2F0Y2goY29uc29sZS5lcnJvcik7XG4gICAgICB0aGlzLmF1ZGlvQ29udGV4dCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhQXJyYXkgPSBudWxsO1xuICAgIHRoaXMuYXVkaW9MZXZlbHNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbmFseXplKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1J1bm5pbmcgfHwgIXRoaXMuYW5hbHlzZXJOb2RlIHx8ICF0aGlzLmRhdGFBcnJheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYW5hbHlzZXJOb2RlLmdldEJ5dGVUaW1lRG9tYWluRGF0YSh0aGlzLmRhdGFBcnJheSk7XG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIFJNUyAoUm9vdCBNZWFuIFNxdWFyZSkgdm9sdW1lXG4gICAgY29uc3Qgcm1zID0gdGhpcy5jYWxjdWxhdGVSTVModGhpcy5kYXRhQXJyYXkpO1xuICAgIFxuICAgIC8vIExlYXJuIG5vaXNlIGZsb29yIGR1cmluZyBpbml0aWFsIHNhbXBsZXNcbiAgICBpZiAodGhpcy5ub2lzZUZsb29yU2FtcGxlcy5sZW5ndGggPCB0aGlzLk5PSVNFX0ZMT09SX1NBTVBMRV9DT1VOVCkge1xuICAgICAgdGhpcy5ub2lzZUZsb29yU2FtcGxlcy5wdXNoKHJtcyk7XG4gICAgICBpZiAodGhpcy5ub2lzZUZsb29yU2FtcGxlcy5sZW5ndGggPT09IHRoaXMuTk9JU0VfRkxPT1JfU0FNUExFX0NPVU5UKSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBhdmVyYWdlIG5vaXNlIGZsb29yXG4gICAgICAgIGNvbnN0IHN1bSA9IHRoaXMubm9pc2VGbG9vclNhbXBsZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgICAgIHRoaXMubm9pc2VGbG9vciA9IHN1bSAvIHRoaXMuTk9JU0VfRkxPT1JfU0FNUExFX0NPVU5UO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGUgbm9pc2UgZmxvb3IgYWRhcHRpdmVseSAobW92aW5nIGF2ZXJhZ2UpXG4gICAgICB0aGlzLm5vaXNlRmxvb3IgPSB0aGlzLm5vaXNlRmxvb3IgKiAwLjk5ICsgcm1zICogMC4wMTtcbiAgICB9XG5cbiAgICAvLyBEZXRlY3QgaWYgdXNlciBpcyBzcGVha2luZ1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMubm9pc2VGbG9vciAqIHRoaXMuU1BFQUtJTkdfVEhSRVNIT0xEX01VTFRJUExJRVI7XG4gICAgY29uc3QgaXNTcGVha2luZyA9IHJtcyA+IHRocmVzaG9sZDtcbiAgICB0aGlzLmlzVXNlclNwZWFraW5nU3ViamVjdC5uZXh0KGlzU3BlYWtpbmcpO1xuXG4gICAgLy8gR2VuZXJhdGUgd2F2ZWZvcm0gYmFyc1xuICAgIGNvbnN0IGJhcnMgPSB0aGlzLmdlbmVyYXRlV2F2ZWZvcm1CYXJzKHRoaXMuZGF0YUFycmF5KTtcbiAgICB0aGlzLmF1ZGlvTGV2ZWxzU3ViamVjdC5uZXh0KGJhcnMpO1xuXG4gICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuYW5hbHl6ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlUk1TKGRhdGE6IFVpbnQ4QXJyYXkpOiBudW1iZXIge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IChkYXRhW2ldIC0gMTI4KSAvIDEyODtcbiAgICAgIHN1bSArPSBub3JtYWxpemVkICogbm9ybWFsaXplZDtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguc3FydChzdW0gLyBkYXRhLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlV2F2ZWZvcm1CYXJzKGRhdGE6IFVpbnQ4QXJyYXkpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgYmFyczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBzdGVwID0gTWF0aC5mbG9vcihkYXRhLmxlbmd0aCAvIHRoaXMuV0FWRUZPUk1fQkFSX0NPVU5UKTtcbiAgICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuV0FWRUZPUk1fQkFSX0NPVU5UOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gaSAqIHN0ZXA7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbaW5kZXhdO1xuICAgICAgLy8gTm9ybWFsaXplIHRvIDAtMTAwXG4gICAgICBjb25zdCBub3JtYWxpemVkID0gTWF0aC5hYnMoKHZhbHVlIC0gMTI4KSAvIDEyOCkgKiAxMDA7XG4gICAgICBiYXJzLnB1c2goTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCBub3JtYWxpemVkKSkpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYmFycztcbiAgfVxufVxuIl19
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW8tYW5hbHl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9oaXR0aGFrdXIvaGl2ZS1ncHQvSGl2ZUFJLVBhY2thZ2VzL0FuZ3VsYXIvcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy92b2ljZS1hZ2VudC9zZXJ2aWNlcy9hdWRpby1hbmFseXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7QUFFbkQ7OztHQUdHO0FBSUgsTUFBTSxPQUFPLG9CQUFvQjtJQUhqQztRQUlVLGlCQUFZLEdBQXdCLElBQUksQ0FBQztRQUN6QyxpQkFBWSxHQUF3QixJQUFJLENBQUM7UUFDekMsY0FBUyxHQUFzQixJQUFJLENBQUM7UUFDcEMscUJBQWdCLEdBQWtCLElBQUksQ0FBQztRQUN2QyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWxCLHVCQUFrQixHQUFHLElBQUksZUFBZSxDQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRXBFLGlDQUFpQztRQUN6QixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2Ysc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLDZCQUF3QixHQUFHLEVBQUUsQ0FBQztRQUM5QixrQ0FBNkIsR0FBRyxHQUFHLENBQUM7UUFDcEMsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBRXpDLGlCQUFZLEdBQXlCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM1RSxvQkFBZSxHQUF3QixJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFLENBQUM7S0FnSGxGO0lBOUdDLEtBQUssQ0FBQyxNQUFtQjtR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aW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogQXVkaW8gYW5hbHl6ZXIgZm9yIHdhdmVmb3JtIHZpc3VhbGl6YXRpb24gb25seS5cbiAqIERvIE5PVCB1c2UgaXNVc2VyU3BlYWtpbmckIGZvciBjYWxsIHN0YXRlOyBzcGVha2luZyBzdGF0ZSBtdXN0IGNvbWUgZnJvbSBEYWlseS5qcy5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXVkaW9BbmFseXplclNlcnZpY2Uge1xuICBwcml2YXRlIGF1ZGlvQ29udGV4dDogQXVkaW9Db250ZXh0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYW5hbHlzZXJOb2RlOiBBbmFseXNlck5vZGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkYXRhQXJyYXk6IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhbmltYXRpb25GcmFtZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpc1J1bm5pbmcgPSBmYWxzZTtcblxuICBwcml2YXRlIGF1ZGlvTGV2ZWxzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyW10+KFtdKTtcbiAgcHJpdmF0ZSBpc1VzZXJTcGVha2luZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyBBZGFwdGl2ZSBub2lzZSBmbG9vciBkZXRlY3Rpb25cbiAgcHJpdmF0ZSBub2lzZUZsb29yID0gMDtcbiAgcHJpdmF0ZSBub2lzZUZsb29yU2FtcGxlczogbnVtYmVyW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBOT0lTRV9GTE9PUl9TQU1QTEVfQ09VTlQgPSAzMDtcbiAgcHJpdmF0ZSByZWFkb25seSBTUEVBS0lOR19USFJFU0hPTERfTVVMVElQTElFUiA9IDIuNTtcbiAgcHJpdmF0ZSByZWFkb25seSBXQVZFRk9STV9CQVJfQ09VTlQgPSA0MDtcblxuICBhdWRpb0xldmVscyQ6IE9ic2VydmFibGU8bnVtYmVyW10+ID0gdGhpcy5hdWRpb0xldmVsc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGlzVXNlclNwZWFraW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHN0YXJ0KHN0cmVhbTogTWVkaWFTdHJlYW0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHRoaXMuc3RvcCgpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmF1ZGlvQ29udGV4dCA9IG5ldyAod2luZG93LkF1ZGlvQ29udGV4dCB8fCAod2luZG93IGFzIGFueSkud2Via2l0QXVkaW9Db250ZXh0KSgpO1xuICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5hdWRpb0NvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2Uoc3RyZWFtKTtcbiAgICAgIFxuICAgICAgdGhpcy5hbmFseXNlck5vZGUgPSB0aGlzLmF1ZGlvQ29udGV4dC5jcmVhdGVBbmFseXNlcigpO1xuICAgICAgdGhpcy5hbmFseXNlck5vZGUuZmZ0U2l6ZSA9IDIwNDg7XG4gICAgICB0aGlzLmFuYWx5c2VyTm9kZS5zbW9vdGhpbmdUaW1lQ29uc3RhbnQgPSAwLjg7XG4gICAgICBcbiAgICAgIGNvbnN0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYW5hbHlzZXJOb2RlLmZyZXF1ZW5jeUJpbkNvdW50O1xuICAgICAgdGhpcy5kYXRhQXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmZXJMZW5ndGgpO1xuICAgICAgXG4gICAgICBzb3VyY2UuY29ubmVjdCh0aGlzLmFuYWx5c2VyTm9kZSk7XG4gICAgICBcbiAgICAgIHRoaXMuaXNSdW5uaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMubm9pc2VGbG9vclNhbXBsZXMgPSBbXTtcbiAgICAgIHRoaXMubm9pc2VGbG9vciA9IDA7XG4gICAgICBcbiAgICAgIHRoaXMuYW5hbHl6ZSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyBhdWRpbyBhbmFseXplcjonLCBlcnJvcik7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBzdG9wKCk6IHZvaWQge1xuICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XG4gICAgXG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRpb25GcmFtZUlkKTtcbiAgICAgIHRoaXMuYW5pbWF0aW9uRnJhbWVJZCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYW5hbHlzZXJOb2RlKSB7XG4gICAgICB0aGlzLmFuYWx5c2VyTm9kZS5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLmFuYWx5c2VyTm9kZSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXVkaW9Db250ZXh0ICYmIHRoaXMuYXVkaW9Db250ZXh0LnN0YXRlICE9PSAnY2xvc2VkJykge1xuICAgICAgdGhpcy5hdWRpb0NvbnRleHQuY2xvc2UoKS5jYXRjaChjb25zb2xlLmVycm9yKTtcbiAgICAgIHRoaXMuYXVkaW9Db250ZXh0ID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFBcnJheSA9IG51bGw7XG4gICAgdGhpcy5hdWRpb0xldmVsc1N1YmplY3QubmV4dChbXSk7XG4gICAgdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGFuYWx5emUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUnVubmluZyB8fCAhdGhpcy5hbmFseXNlck5vZGUgfHwgIXRoaXMuZGF0YUFycmF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hbmFseXNlck5vZGUuZ2V0Qnl0ZVRpbWVEb21haW5EYXRhKHRoaXMuZGF0YUFycmF5KTtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgUk1TIChSb290IE1lYW4gU3F1YXJlKSB2b2x1bWVcbiAgICBjb25zdCBybXMgPSB0aGlzLmNhbGN1bGF0ZVJNUyh0aGlzLmRhdGFBcnJheSk7XG4gICAgXG4gICAgLy8gTGVhcm4gbm9pc2UgZmxvb3IgZHVyaW5nIGluaXRpYWwgc2FtcGxlc1xuICAgIGlmICh0aGlzLm5vaXNlRmxvb3JTYW1wbGVzLmxlbmd0aCA8IHRoaXMuTk9JU0VfRkxPT1JfU0FNUExFX0NPVU5UKSB7XG4gICAgICB0aGlzLm5vaXNlRmxvb3JTYW1wbGVzLnB1c2gocm1zKTtcbiAgICAgIGlmICh0aGlzLm5vaXNlRmxvb3JTYW1wbGVzLmxlbmd0aCA9PT0gdGhpcy5OT0lTRV9GTE9PUl9TQU1QTEVfQ09VTlQpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2Ugbm9pc2UgZmxvb3JcbiAgICAgICAgY29uc3Qgc3VtID0gdGhpcy5ub2lzZUZsb29yU2FtcGxlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAgICAgdGhpcy5ub2lzZUZsb29yID0gc3VtIC8gdGhpcy5OT0lTRV9GTE9PUl9TQU1QTEVfQ09VTlQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZSBub2lzZSBmbG9vciBhZGFwdGl2ZWx5IChtb3ZpbmcgYXZlcmFnZSlcbiAgICAgIHRoaXMubm9pc2VGbG9vciA9IHRoaXMubm9pc2VGbG9vciAqIDAuOTkgKyBybXMgKiAwLjAxO1xuICAgIH1cblxuICAgIC8vIERldGVjdCBpZiB1c2VyIGlzIHNwZWFraW5nXG4gICAgY29uc3QgdGhyZXNob2xkID0gdGhpcy5ub2lzZUZsb29yICogdGhpcy5TUEVBS0lOR19USFJFU0hPTERfTVVMVElQTElFUjtcbiAgICBjb25zdCBpc1NwZWFraW5nID0gcm1zID4gdGhyZXNob2xkO1xuICAgIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoaXNTcGVha2luZyk7XG5cbiAgICAvLyBHZW5lcmF0ZSB3YXZlZm9ybSBiYXJzXG4gICAgY29uc3QgYmFycyA9IHRoaXMuZ2VuZXJhdGVXYXZlZm9ybUJhcnModGhpcy5kYXRhQXJyYXkpO1xuICAgIHRoaXMuYXVkaW9MZXZlbHNTdWJqZWN0Lm5leHQoYmFycyk7XG5cbiAgICB0aGlzLmFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5hbmFseXplKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVSTVMoZGF0YTogVWludDhBcnJheSk6IG51bWJlciB7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gKGRhdGFbaV0gLSAxMjgpIC8gMTI4O1xuICAgICAgc3VtICs9IG5vcm1hbGl6ZWQgKiBub3JtYWxpemVkO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5zcXJ0KHN1bSAvIGRhdGEubGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVXYXZlZm9ybUJhcnMoZGF0YTogVWludDhBcnJheSk6IG51bWJlcltdIHtcbiAgICBjb25zdCBiYXJzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHN0ZXAgPSBNYXRoLmZsb29yKGRhdGEubGVuZ3RoIC8gdGhpcy5XQVZFRk9STV9CQVJfQ09VTlQpO1xuICAgIFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5XQVZFRk9STV9CQVJfQ09VTlQ7IGkrKykge1xuICAgICAgY29uc3QgaW5kZXggPSBpICogc3RlcDtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtpbmRleF07XG4gICAgICAvLyBOb3JtYWxpemUgdG8gMC0xMDBcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBNYXRoLmFicygodmFsdWUgLSAxMjgpIC8gMTI4KSAqIDEwMDtcbiAgICAgIGJhcnMucHVzaChNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIG5vcm1hbGl6ZWQpKSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBiYXJzO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,181 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Injectable, NgZone } from '@angular/core';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import Daily from '@daily-co/daily-js';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Daily.js WebRTC client for voice agent audio.
8
+ * Responsibilities:
9
+ * - Create and manage Daily CallObject
10
+ * - Join Daily room using room_url
11
+ * - Handle mic capture + speaker playback
12
+ * - Provide real-time speaking detection via active-speaker-change (primary)
13
+ * and track-started/track-stopped (fallback for immediate feedback)
14
+ * - Expose speaking$ (bot speaking), userSpeaking$ (user speaking), micMuted$
15
+ * - Expose localStream$ for waveform visualization (AudioAnalyzerService)
16
+ *
17
+ * Speaking state flips immediately when agent audio starts playing.
18
+ * If user speaks while bot is talking, state switches to listening.
19
+ */
20
+ export class DailyVoiceClientService {
21
+ constructor(ngZone) {
22
+ this.ngZone = ngZone;
23
+ this.callObject = null;
24
+ this.localStream = null;
25
+ this.localSessionId = null;
26
+ this.speakingSubject = new BehaviorSubject(false);
27
+ this.userSpeakingSubject = new BehaviorSubject(false);
28
+ this.micMutedSubject = new BehaviorSubject(false);
29
+ this.localStreamSubject = new BehaviorSubject(null);
30
+ /** True when bot (remote participant) is the active speaker. */
31
+ this.speaking$ = this.speakingSubject.asObservable();
32
+ /** True when user (local participant) is the active speaker. */
33
+ this.userSpeaking$ = this.userSpeakingSubject.asObservable();
34
+ /** True when mic is muted. */
35
+ this.micMuted$ = this.micMutedSubject.asObservable();
36
+ /** Emits local mic stream for waveform visualization. */
37
+ this.localStream$ = this.localStreamSubject.asObservable();
38
+ }
39
+ /**
40
+ * Connect to Daily room. Acquires mic first for waveform, then joins with audio.
41
+ * @param roomUrl Daily room URL (from room_created)
42
+ * @param token Optional meeting token
43
+ */
44
+ connect(roomUrl, token) {
45
+ return __awaiter(this, void 0, void 0, function* () {
46
+ if (this.callObject) {
47
+ yield this.disconnect();
48
+ }
49
+ try {
50
+ // Get mic stream for both Daily and waveform (single capture)
51
+ const stream = yield navigator.mediaDevices.getUserMedia({ audio: true });
52
+ const audioTrack = stream.getAudioTracks()[0];
53
+ if (!audioTrack) {
54
+ stream.getTracks().forEach((t) => t.stop());
55
+ throw new Error('No audio track');
56
+ }
57
+ this.localStream = stream;
58
+ this.localStreamSubject.next(stream);
59
+ // Create audio-only call object
60
+ // videoSource: false = no camera, audioSource = our mic track
61
+ const callObject = Daily.createCallObject({
62
+ videoSource: false,
63
+ audioSource: audioTrack,
64
+ });
65
+ this.callObject = callObject;
66
+ this.setupEventHandlers(callObject);
67
+ // Join room; Daily handles playback of remote (bot) audio automatically
68
+ yield callObject.join({ url: roomUrl, token });
69
+ const participants = callObject.participants();
70
+ if (participants === null || participants === void 0 ? void 0 : participants.local) {
71
+ this.localSessionId = participants.local.session_id;
72
+ }
73
+ // Initial mute state: Daily starts with audio on
74
+ this.micMutedSubject.next(!callObject.localAudio());
75
+ }
76
+ catch (err) {
77
+ this.cleanup();
78
+ throw err;
79
+ }
80
+ });
81
+ }
82
+ setupEventHandlers(call) {
83
+ // active-speaker-change: primary source for real-time speaking detection.
84
+ // Emits when the loudest participant changes; bot speaking = remote is active.
85
+ call.on('active-speaker-change', (event) => {
86
+ this.ngZone.run(() => {
87
+ var _a;
88
+ const peerId = (_a = event === null || event === void 0 ? void 0 : event.activeSpeaker) === null || _a === void 0 ? void 0 : _a.peerId;
89
+ if (!peerId || !this.localSessionId) {
90
+ this.speakingSubject.next(false);
91
+ this.userSpeakingSubject.next(false);
92
+ return;
93
+ }
94
+ const isLocal = peerId === this.localSessionId;
95
+ this.userSpeakingSubject.next(isLocal);
96
+ this.speakingSubject.next(!isLocal);
97
+ });
98
+ });
99
+ // track-started / track-stopped: fallback for immediate feedback when
100
+ // remote (bot) audio track starts or stops. Ensures talking indicator
101
+ // flips as soon as agent audio begins, without waiting for active-speaker-change.
102
+ call.on('track-started', (event) => {
103
+ this.ngZone.run(() => {
104
+ var _a, _b;
105
+ const p = event === null || event === void 0 ? void 0 : event.participant;
106
+ const type = (_a = event === null || event === void 0 ? void 0 : event.type) !== null && _a !== void 0 ? _a : (_b = event === null || event === void 0 ? void 0 : event.track) === null || _b === void 0 ? void 0 : _b.kind;
107
+ if (p && !p.local && type === 'audio') {
108
+ this.speakingSubject.next(true);
109
+ }
110
+ });
111
+ });
112
+ call.on('track-stopped', (event) => {
113
+ this.ngZone.run(() => {
114
+ var _a, _b;
115
+ const p = event === null || event === void 0 ? void 0 : event.participant;
116
+ const type = (_a = event === null || event === void 0 ? void 0 : event.type) !== null && _a !== void 0 ? _a : (_b = event === null || event === void 0 ? void 0 : event.track) === null || _b === void 0 ? void 0 : _b.kind;
117
+ if (p && !p.local && type === 'audio') {
118
+ this.speakingSubject.next(false);
119
+ }
120
+ });
121
+ });
122
+ call.on('left-meeting', () => {
123
+ this.ngZone.run(() => this.cleanup());
124
+ });
125
+ call.on('error', (event) => {
126
+ this.ngZone.run(() => {
127
+ var _a;
128
+ console.error('DailyVoiceClient: Daily error', (_a = event === null || event === void 0 ? void 0 : event.errorMsg) !== null && _a !== void 0 ? _a : event);
129
+ this.cleanup();
130
+ });
131
+ });
132
+ }
133
+ /** Set mic muted state. */
134
+ setMuted(muted) {
135
+ if (!this.callObject)
136
+ return;
137
+ this.callObject.setLocalAudio(!muted);
138
+ this.micMutedSubject.next(muted);
139
+ }
140
+ /** Disconnect and cleanup. */
141
+ disconnect() {
142
+ return __awaiter(this, void 0, void 0, function* () {
143
+ if (!this.callObject) {
144
+ this.cleanup();
145
+ return;
146
+ }
147
+ try {
148
+ yield this.callObject.leave();
149
+ }
150
+ catch (e) {
151
+ // ignore
152
+ }
153
+ this.cleanup();
154
+ });
155
+ }
156
+ cleanup() {
157
+ if (this.callObject) {
158
+ this.callObject.destroy().catch(() => { });
159
+ this.callObject = null;
160
+ }
161
+ if (this.localStream) {
162
+ this.localStream.getTracks().forEach((t) => t.stop());
163
+ this.localStream = null;
164
+ }
165
+ this.localSessionId = null;
166
+ this.speakingSubject.next(false);
167
+ this.userSpeakingSubject.next(false);
168
+ this.localStreamSubject.next(null);
169
+ // Keep last micMuted state; will reset on next connect
170
+ }
171
+ }
172
+ DailyVoiceClientService.ɵprov = i0.ɵɵdefineInjectable({ factory: function DailyVoiceClientService_Factory() { return new DailyVoiceClientService(i0.ɵɵinject(i0.NgZone)); }, token: DailyVoiceClientService, providedIn: "root" });
173
+ DailyVoiceClientService.decorators = [
174
+ { type: Injectable, args: [{
175
+ providedIn: 'root',
176
+ },] }
177
+ ];
178
+ DailyVoiceClientService.ctorParameters = () => [
179
+ { type: NgZone }
180
+ ];
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvaGl0dGhha3VyL2hpdmUtZ3B0L0hpdmVBSS1QYWNrYWdlcy9Bbmd1bGFyL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvdm9pY2UtYWdlbnQvc2VydmljZXMvZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxLQUFLLE1BQU0sb0JBQW9CLENBQUM7O0FBR3ZDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFJSCxNQUFNLE9BQU8sdUJBQXVCO0lBdUJsQyxZQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXRCMUIsZUFBVSxHQUFxQixJQUFJLENBQUM7UUFDcEMsZ0JBQVcsR0FBdUIsSUFBSSxDQUFDO1FBQ3ZDLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUVyQyxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3RELHdCQUFtQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzFELG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDdEQsdUJBQWtCLEdBQUcsSUFBSSxlQUFlLENBQXFCLElBQUksQ0FBQyxDQUFDO1FBRTNFLGdFQUFnRTtRQUNoRSxjQUFTLEdBQXdCLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFckUsZ0VBQWdFO1FBQ2hFLGtCQUFhLEdBQXdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUU3RSw4QkFBOEI7UUFD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LENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2YsT0FBTzthQUNSO1lBQ0QsSUFBSTtnQkFDRixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDL0I7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixTQUFTO2FBQ1Y7WUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIsQ0FBQztLQUFBO0lBRU8sT0FBTztRQUNiLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztTQUN4QjtRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7U0FDekI7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsdURBQXVEO0lBQ3pELENBQUM7Ozs7WUFwS0YsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUFyQm9CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IERhaWx5IGZyb20gJ0BkYWlseS1jby9kYWlseS1qcyc7XG5pbXBvcnQgdHlwZSB7IERhaWx5Q2FsbCwgRGFpbHlQYXJ0aWNpcGFudCB9IGZyb20gJ0BkYWlseS1jby9kYWlseS1qcyc7XG5cbi8qKlxuICogRGFpbHkuanMgV2ViUlRDIGNsaWVudCBmb3Igdm9pY2UgYWdlbnQgYXVkaW8uXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBDcmVhdGUgYW5kIG1hbmFnZSBEYWlseSBDYWxsT2JqZWN0XG4gKiAtIEpvaW4gRGFpbHkgcm9vbSB1c2luZyByb29tX3VybFxuICogLSBIYW5kbGUgbWljIGNhcHR1cmUgKyBzcGVha2VyIHBsYXliYWNrXG4gKiAtIFByb3ZpZGUgcmVhbC10aW1lIHNwZWFraW5nIGRldGVjdGlvbiB2aWEgYWN0aXZlLXNwZWFrZXItY2hhbmdlIChwcmltYXJ5KVxuICogICBhbmQgdHJhY2stc3RhcnRlZC90cmFjay1zdG9wcGVkIChmYWxsYmFjayBmb3IgaW1tZWRpYXRlIGZlZWRiYWNrKVxuICogLSBFeHBvc2Ugc3BlYWtpbmckIChib3Qgc3BlYWtpbmcpLCB1c2VyU3BlYWtpbmckICh1c2VyIHNwZWFraW5nKSwgbWljTXV0ZWQkXG4gKiAtIEV4cG9zZSBsb2NhbFN0cmVhbSQgZm9yIHdhdmVmb3JtIHZpc3VhbGl6YXRpb24gKEF1ZGlvQW5hbHl6ZXJTZXJ2aWNlKVxuICpcbiAqIFNwZWFraW5nIHN0YXRlIGZsaXBzIGltbWVkaWF0ZWx5IHdoZW4gYWdlbnQgYXVkaW8gc3RhcnRzIHBsYXlpbmcuXG4gKiBJZiB1c2VyIHNwZWFrcyB3aGlsZSBib3QgaXMgdGFsa2luZywgc3RhdGUgc3dpdGNoZXMgdG8gbGlzdGVuaW5nLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRGFpbHlWb2ljZUNsaWVudFNlcnZpY2Uge1xuICBwcml2YXRlIGNhbGxPYmplY3Q6IERhaWx5Q2FsbCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxvY2FsU3RyZWFtOiBNZWRpYVN0cmVhbSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxvY2FsU2Vzc2lvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHNwZWFraW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHVzZXJTcGVha2luZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBtaWNNdXRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBsb2NhbFN0cmVhbVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lZGlhU3RyZWFtIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIFRydWUgd2hlbiBib3QgKHJlbW90ZSBwYXJ0aWNpcGFudCkgaXMgdGhlIGFjdGl2ZSBzcGVha2VyLiAqL1xuICBzcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnNwZWFraW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKiogVHJ1ZSB3aGVuIHVzZXIgKGxvY2FsIHBhcnRpY2lwYW50KSBpcyB0aGUgYWN0aXZlIHNwZWFrZXIuICovXG4gIHVzZXJTcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqIFRydWUgd2hlbiBtaWMgaXMgbXV0ZWQuICovXG4gIG1pY011dGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMubWljTXV0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKiBFbWl0cyBsb2NhbCBtaWMgc3RyZWFtIGZvciB3YXZlZm9ybSB2aXN1YWxpemF0aW9uLiAqL1xuICBsb2NhbFN0cmVhbSQ6IE9ic2VydmFibGU8TWVkaWFTdHJlYW0gfCBudWxsPiA9XG4gICAgdGhpcy5sb2NhbFN0cmVhbVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge31cblxuICAvKipcbiAgICogQ29ubmVjdCB0byBEYWlseSByb29tLiBBY3F1aXJlcyBtaWMgZmlyc3QgZm9yIHdhdmVmb3JtLCB0aGVuIGpvaW5zIHdpdGggYXVkaW8uXG4gICAqIEBwYXJhbSByb29tVXJsIERhaWx5IHJvb20gVVJMIChmcm9tIHJvb21fY3JlYXRlZClcbiAgICogQHBhcmFtIHRva2VuIE9wdGlvbmFsIG1lZXRpbmcgdG9rZW5cbiAgICovXG4gIGFzeW5jIGNvbm5lY3Qocm9vbVVybDogc3RyaW5nLCB0b2tlbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNhbGxPYmplY3QpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgbWljIHN0cmVhbSBmb3IgYm90aCBEYWlseSBhbmQgd2F2ZWZvcm0gKHNpbmdsZSBjYXB0dXJlKVxuICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyBhdWRpbzogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IGF1ZGlvVHJhY2sgPSBzdHJlYW0uZ2V0QXVkaW9UcmFja3MoKVswXTtcbiAgICAgIGlmICghYXVkaW9UcmFjaykge1xuICAgICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGF1ZGlvIHRyYWNrJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9jYWxTdHJlYW0gPSBzdHJlYW07XG4gICAgICB0aGlzLmxvY2FsU3RyZWFtU3ViamVjdC5uZXh0KHN0cmVhbSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhdWRpby1vbmx5IGNhbGwgb2JqZWN0XG4gICAgICAvLyB2aWRlb1NvdXJjZTogZmFsc2UgPSBubyBjYW1lcmEsIGF1ZGlvU291cmNlID0gb3VyIG1pYyB0cmFja1xuICAgICAgY29uc3QgY2FsbE9iamVjdCA9IERhaWx5LmNyZWF0ZUNhbGxPYmplY3Qoe1xuICAgICAgICB2aWRlb1NvdXJjZTogZmFsc2UsXG4gICAgICAgIGF1ZGlvU291cmNlOiBhdWRpb1RyYWNrLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY2FsbE9iamVjdCA9IGNhbGxPYmplY3Q7XG5cbiAgICAgIHRoaXMuc2V0dXBFdmVudEhhbmRsZXJzKGNhbGxPYmplY3QpO1xuXG4gICAgICAvLyBKb2luIHJvb207IERhaWx5IGhhbmRsZXMgcGxheWJhY2sgb2YgcmVtb3RlIChib3QpIGF1ZGlvIGF1dG9tYXRpY2FsbHlcbiAgICAgIGF3YWl0IGNhbGxPYmplY3Quam9pbih7IHVybDogcm9vbVVybCwgdG9rZW4gfSk7XG5cbiAgICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IGNhbGxPYmplY3QucGFydGljaXBhbnRzKCk7XG4gICAgICBpZiAocGFydGljaXBhbnRzPy5sb2NhbCkge1xuICAgICAgICB0aGlzLmxvY2FsU2Vzc2lvbklkID0gcGFydGljaXBhbnRzLmxvY2FsLnNlc3Npb25faWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEluaXRpYWwgbXV0ZSBzdGF0ZTogRGFpbHkgc3RhcnRzIHdpdGggYXVkaW8gb25cbiAgICAgIHRoaXMubWljTXV0ZWRTdWJqZWN0Lm5leHQoIWNhbGxPYmplY3QubG9jYWxBdWRpbygpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBFdmVudEhhbmRsZXJzKGNhbGw6IERhaWx5Q2FsbCk6IHZvaWQge1xuICAgIC8vIGFjdGl2ZS1zcGVha2VyLWNoYW5nZTogcHJpbWFyeSBzb3VyY2UgZm9yIHJlYWwtdGltZSBzcGVha2luZyBkZXRlY3Rpb24uXG4gICAgLy8gRW1pdHMgd2hlbiB0aGUgbG91ZGVzdCBwYXJ0aWNpcGFudCBjaGFuZ2VzOyBib3Qgc3BlYWtpbmcgPSByZW1vdGUgaXMgYWN0aXZlLlxuICAgIGNhbGwub24oJ2FjdGl2ZS1zcGVha2VyLWNoYW5nZScsIChldmVudDogeyBhY3RpdmVTcGVha2VyPzogeyBwZWVySWQ/OiBzdHJpbmcgfSB9KSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBwZWVySWQgPSBldmVudD8uYWN0aXZlU3BlYWtlcj8ucGVlcklkO1xuICAgICAgICBpZiAoIXBlZXJJZCB8fCAhdGhpcy5sb2NhbFNlc3Npb25JZCkge1xuICAgICAgICAgIHRoaXMuc3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMudXNlclNwZWFraW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNMb2NhbCA9IHBlZXJJZCA9PT0gdGhpcy5sb2NhbFNlc3Npb25JZDtcbiAgICAgICAgdGhpcy51c2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoaXNMb2NhbCk7XG4gICAgICAgIHRoaXMuc3BlYWtpbmdTdWJqZWN0Lm5leHQoIWlzTG9jYWwpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFjay1zdGFydGVkIC8gdHJhY2stc3RvcHBlZDogZmFsbGJhY2sgZm9yIGltbWVkaWF0ZSBmZWVkYmFjayB3aGVuXG4gICAgLy8gcmVtb3RlIChib3QpIGF1ZGlvIHRyYWNrIHN0YXJ0cyBvciBzdG9wcy4gRW5zdXJlcyB0YWxraW5nIGluZGljYXRvclxuICAgIC8vIGZsaXBzIGFzIHNvb24gYXMgYWdlbnQgYXVkaW8gYmVnaW5zLCB3aXRob3V0IHdhaXRpbmcgZm9yIGFjdGl2ZS1zcGVha2VyLWNoYW5nZS5cbiAgICBjYWxsLm9uKCd0cmFjay1zdGFydGVkJywgKGV2ZW50OiB7IHBhcnRpY2lwYW50PzogRGFpbHlQYXJ0aWNpcGFudCB8IG51bGw7IHR5cGU/OiBzdHJpbmc7IHRyYWNrPzogTWVkaWFTdHJlYW1UcmFjayB9KSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBwID0gZXZlbnQ/LnBhcnRpY2lwYW50O1xuICAgICAgICBjb25zdCB0eXBlID0gZXZlbnQ/LnR5cGUgPz8gZXZlbnQ/LnRyYWNrPy5raW5kO1xuICAgICAgICBpZiAocCAmJiAhcC5sb2NhbCAmJiB0eXBlID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgdGhpcy5zcGVha2luZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjYWxsLm9uKCd0cmFjay1zdG9wcGVkJywgKGV2ZW50OiB7IHBhcnRpY2lwYW50PzogRGFpbHlQYXJ0aWNpcGFudCB8IG51bGw7IHR5cGU/OiBzdHJpbmc7IHRyYWNrPzogTWVkaWFTdHJlYW1UcmFjayB9KSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBwID0gZXZlbnQ/LnBhcnRpY2lwYW50O1xuICAgICAgICBjb25zdCB0eXBlID0gZXZlbnQ/LnR5cGUgPz8gZXZlbnQ/LnRyYWNrPy5raW5kO1xuICAgICAgICBpZiAocCAmJiAhcC5sb2NhbCAmJiB0eXBlID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgdGhpcy5zcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2FsbC5vbignbGVmdC1tZWV0aW5nJywgKCkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuY2xlYW51cCgpKTtcbiAgICB9KTtcblxuICAgIGNhbGwub24oJ2Vycm9yJywgKGV2ZW50PzogeyBlcnJvck1zZz86IHN0cmluZyB9KSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdEYWlseVZvaWNlQ2xpZW50OiBEYWlseSBlcnJvcicsIGV2ZW50Py5lcnJvck1zZyA/PyBldmVudCk7XG4gICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2V0IG1pYyBtdXRlZCBzdGF0ZS4gKi9cbiAgc2V0TXV0ZWQobXV0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FsbE9iamVjdCkgcmV0dXJuO1xuICAgIHRoaXMuY2FsbE9iamVjdC5zZXRMb2NhbEF1ZGlvKCFtdXRlZCk7XG4gICAgdGhpcy5taWNNdXRlZFN1YmplY3QubmV4dChtdXRlZCk7XG4gIH1cblxuICAvKiogRGlzY29ubmVjdCBhbmQgY2xlYW51cC4gKi9cbiAgYXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY2FsbE9iamVjdCkge1xuICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxPYmplY3QubGVhdmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FsbE9iamVjdCkge1xuICAgICAgdGhpcy5jYWxsT2JqZWN0LmRlc3Ryb3koKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aGlzLmNhbGxPYmplY3QgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2NhbFN0cmVhbSkge1xuICAgICAgdGhpcy5sb2NhbFN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XG4gICAgICB0aGlzLmxvY2FsU3RyZWFtID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5sb2NhbFNlc3Npb25JZCA9IG51bGw7XG4gICAgdGhpcy5zcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy51c2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIHRoaXMubG9jYWxTdHJlYW1TdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgLy8gS2VlcCBsYXN0IG1pY011dGVkIHN0YXRlOyB3aWxsIHJlc2V0IG9uIG5leHQgY29ubmVjdFxuICB9XG59XG4iXX0=