homebridge-unifi-protect 5.0.5 → 5.2.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.
@@ -7,8 +7,8 @@ exports.ProtectStreamingDelegate = void 0;
7
7
  const unifi_protect_1 = require("unifi-protect");
8
8
  const settings_1 = require("./settings");
9
9
  const protect_ffmpeg_1 = require("./protect-ffmpeg");
10
+ const protect_record_1 = require("./protect-record");
10
11
  const protect_rtp_1 = require("./protect-rtp");
11
- const url_1 = require("url");
12
12
  const ws_1 = __importDefault(require("ws"));
13
13
  const ffmpeg_for_homebridge_1 = __importDefault(require("ffmpeg-for-homebridge"));
14
14
  const camera_utils_1 = require("@homebridge/camera-utils");
@@ -22,20 +22,69 @@ class ProtectStreamingDelegate {
22
22
  this.config = protectCamera.platform.config;
23
23
  this.debug = protectCamera.platform.debug.bind(protectCamera.platform);
24
24
  this.hap = protectCamera.api.hap;
25
+ this.hksv = null;
25
26
  this.log = protectCamera.platform.log;
26
27
  this.name = protectCamera.name.bind(protectCamera);
27
28
  this.ongoingSessions = {};
28
29
  this.protectCamera = protectCamera;
29
30
  this.pendingSessions = {};
30
31
  this.platform = protectCamera.platform;
32
+ this.rtspEntry = null;
31
33
  this.snapshotCache = {};
32
- this.isTalkbackLive = false;
33
34
  this.videoEncoder = this.config.videoEncoder || "libx264";
34
35
  this.videoProcessor = this.config.videoProcessor || ffmpeg_for_homebridge_1.default || "ffmpeg";
36
+ // Setup for HKSV, if enabled.
37
+ if (this.protectCamera.isHksv) {
38
+ this.hksv = new protect_record_1.ProtectRecordingDelegate(protectCamera);
39
+ }
35
40
  // Setup for our camera controller.
36
41
  const options = {
42
+ // HomeKit requires at least 2 streams, and HomeKit Secure Video requires 1.
37
43
  cameraStreamCount: 10,
44
+ // Our streaming delegate - aka us.
38
45
  delegate: this,
46
+ // Our recording capabilities for HomeKit Secure Video.
47
+ recording: !this.protectCamera.isHksv ? undefined : {
48
+ delegate: this.hksv,
49
+ options: {
50
+ audio: {
51
+ codecs: [
52
+ {
53
+ // Protect supports a 48 KHz sampling rate, and the low complexity AAC profile.
54
+ samplerate: 5 /* KHZ_48 */,
55
+ type: 0 /* AAC_LC */
56
+ }
57
+ ]
58
+ },
59
+ mediaContainerConfiguration: [
60
+ {
61
+ // The default HKSV segment length is 4000ms. It turns out that any setting less than that will disable
62
+ // HomeKit Secure Video.
63
+ fragmentLength: settings_1.PROTECT_HKSV_SEGMENT_LENGTH,
64
+ type: 0 /* FRAGMENTED_MP4 */
65
+ }
66
+ ],
67
+ // Maximum prebuffer length supported. In Protect, this is effectively unlimited, but HomeKit only seems to
68
+ // request a maximum of a 4000ms prebuffer.
69
+ prebufferLength: settings_1.PROTECT_HKSV_BUFFER_LENGTH,
70
+ video: {
71
+ parameters: {
72
+ // Through admittedly anecdotal testing on various G3 and G4 models, UniFi Protect seems to support
73
+ // only the H.264 Main profile, though it does support various H.264 levels, ranging from Level 3
74
+ // through Level 5.1 (G4 Pro at maximum resolution). However, HomeKit only supports Level 3.1, 3.2,
75
+ // and 4.0 currently.
76
+ levels: [0 /* LEVEL3_1 */, 1 /* LEVEL3_2 */, 2 /* LEVEL4_0 */],
77
+ profiles: [1 /* MAIN */]
78
+ },
79
+ resolutions: resolutions,
80
+ type: 0 /* H264 */
81
+ }
82
+ }
83
+ },
84
+ // Our motion sensor.
85
+ sensors: !this.protectCamera.isHksv ? undefined : {
86
+ motion: this.protectCamera.accessory.getService(this.hap.Service.MotionSensor)
87
+ },
39
88
  streamingOptions: {
40
89
  audio: {
41
90
  codecs: [
@@ -91,7 +140,7 @@ class ProtectStreamingDelegate {
91
140
  // Check if audio support is enabled.
92
141
  const isAudioEnabled = this.protectCamera.nvr.optionEnabled(cameraConfig, "Audio", true, request.targetAddress);
93
142
  // We need to check for AAC support because it's going to determine whether we support audio.
94
- const hasLibFdk = isAudioEnabled && (await protect_ffmpeg_1.FfmpegProcess.codecEnabled(this.videoProcessor, "libfdk_aac", this.log));
143
+ const hasLibFdk = isAudioEnabled && (await protect_ffmpeg_1.FfmpegStreamingProcess.codecEnabled(this.videoProcessor, "libfdk_aac", this.log));
95
144
  // Setup our audio plumbing.
96
145
  const audioIncomingRtcpPort = (await (0, camera_utils_1.reservePorts)({ count: 1 }))[0];
97
146
  const audioIncomingPort = (hasLibFdk && this.protectCamera.twoWayAudio) ? (await (0, camera_utils_1.reservePorts)({ count: 1 }))[0] : -1;
@@ -107,30 +156,10 @@ class ProtectStreamingDelegate {
107
156
  rtpDemuxer = new protect_rtp_1.RtpDemuxer(this, request.addressVersion, audioIncomingPort, audioIncomingRtcpPort, audioIncomingRtpPort);
108
157
  // Request the talkback websocket from the controller.
109
158
  const params = new URLSearchParams({ camera: cameraConfig.id });
110
- const response = await this.protectCamera.nvr.nvrApi.fetch(this.protectCamera.nvr.nvrApi.wsUrl() + "/talkback?" + params.toString());
159
+ talkBack = await this.protectCamera.nvr.nvrApi.getWsEndpoint(this.protectCamera.nvr.nvrApi.wsUrl() + "/talkback?" + params.toString());
111
160
  // Something went wrong and we don't have a talkback websocket.
112
- if (!(response === null || response === void 0 ? void 0 : response.ok)) {
113
- this.log.error("%s: Unable to configure the return audio channel.%s", this.name(), response ? " " + response.status.toString() + " - " + response.statusText + "." : "");
114
- }
115
- else {
116
- try {
117
- const tb = await response.json();
118
- // Adjust the URL for our address.
119
- const tbUrl = new url_1.URL(tb.url);
120
- tbUrl.hostname = this.protectCamera.nvr.nvrAddress;
121
- talkBack = tbUrl.toString();
122
- }
123
- catch (error) {
124
- if (error instanceof unifi_protect_1.FetchError) {
125
- switch (error.code) {
126
- default:
127
- this.log.error("%s: Unknown error while preparing the return audio channel: %s", this.name(), error.message);
128
- break;
129
- }
130
- }
131
- this.log.error("%s: An error occurred while preparing the return audio channel: %s.", this.name(), error);
132
- talkBack = null;
133
- }
161
+ if (!talkBack) {
162
+ this.log.error("%s: Unable to open the return audio channel.", this.name());
134
163
  }
135
164
  }
136
165
  // Setup our video plumbing.
@@ -180,7 +209,7 @@ class ProtectStreamingDelegate {
180
209
  callback(undefined, response);
181
210
  }
182
211
  // Launch the Protect video (and audio) stream.
183
- startStream(request, callback) {
212
+ async startStream(request, callback) {
184
213
  var _a, _b, _c, _d, _e, _f;
185
214
  const cameraConfig = this.protectCamera.accessory.context.device;
186
215
  const sessionInfo = this.pendingSessions[request.sessionID];
@@ -193,13 +222,16 @@ class ProtectStreamingDelegate {
193
222
  return;
194
223
  }
195
224
  // Find the best RTSP stream based on what we're looking for.
196
- const rtspEntry = this.protectCamera.findRtsp(request.video.width, request.video.height, cameraConfig, sessionInfo.address);
197
- if (!rtspEntry) {
225
+ this.rtspEntry = this.protectCamera.findRtsp(request.video.width, request.video.height, cameraConfig, sessionInfo.address);
226
+ if (!this.rtspEntry) {
198
227
  const errorMessage = "Unable to start video stream: no valid RTSP stream profile was found.";
199
228
  this.log.error("%s: %s %sx%s, %s fps, %s kbps.", this.name(), errorMessage, request.video.width, request.video.height, request.video.fps, request.video.max_bit_rate);
200
229
  callback(new Error(this.name() + ": " + errorMessage));
201
230
  return;
202
231
  }
232
+ // Set the desired bitrate in Protect. We don't need to for this to return, because Protect
233
+ // will adapt the stream once it processes the configuration change.
234
+ await this.protectCamera.setBitrate(this.rtspEntry.channel.id, request.video.max_bit_rate * 1000);
203
235
  // Are we transcoding?
204
236
  const isTranscoding = this.protectCamera.nvr.optionEnabled(cameraConfig, "Video.Transcode", false, sessionInfo.address);
205
237
  // Set our packet size to be 564. Why? MPEG transport stream (TS) packets are 188 bytes in size each.
@@ -223,42 +255,37 @@ class ProtectStreamingDelegate {
223
255
  // a negative impact.
224
256
  const videomtu = 188 * 3;
225
257
  const audiomtu = 188 * 1;
226
- // -hide_banner: suppress printing the startup banner in FFmpeg.
227
- // -rtsp_transport tcp: tell the RTSP stream handler that we're looking for a TCP connection.
228
- // -map 0:v selects the first available video track from the stream. Protect actually maps audio
229
- // and video tracks in opposite locations from where FFmpeg typically expects them. This
230
- // setting is a more general solution than naming the track locations directly in case
231
- // Protect changes this in n the future.
232
- const ffmpegArgs = ["-hide_banner", "-rtsp_transport", "tcp", "-i", rtspEntry.url, "-map", "0:v"];
258
+ // -hide_banner suppress printing the startup banner in FFmpeg.
259
+ // -rtsp_transport tcp tell the RTSP stream handler that we're looking for a TCP connection.
260
+ // -i this.rtspEntry.url RTSPS URL to get our input stream from.
261
+ // -map 0:v selects the first available video track from the stream. Protect actually maps audio
262
+ // and video tracks in opposite locations from where FFmpeg typically expects them. This
263
+ // setting is a more general solution than naming the track locations directly in case
264
+ // Protect changes this in the future.
265
+ const ffmpegArgs = ["-hide_banner", "-rtsp_transport", "tcp", "-i", this.rtspEntry.url, "-map", "0:v"];
233
266
  // Inform the user.
234
- this.log.info("%s: Streaming request from %s: %sx%s@%sfps, %s kbps. %s RTSP stream profile: %s, %s kbps.", this.name(), sessionInfo.address, request.video.width, request.video.height, request.video.fps, request.video.max_bit_rate, isTranscoding ? "Transcoding" : "Using", rtspEntry.name, rtspEntry.channel.bitrate / 1000);
267
+ this.log.info("%s: Streaming request from %s: %sx%s@%sfps, %s kbps. %s RTSP stream profile: %s, %s kbps.", this.name(), sessionInfo.address, request.video.width, request.video.height, request.video.fps, request.video.max_bit_rate, isTranscoding ? "Transcoding" : "Using", this.rtspEntry.name, this.rtspEntry.channel.bitrate / 1000);
235
268
  // Check to see if we're transcoding. If we are, set the right FFmpeg encoder options. If not, copy the video stream.
236
269
  if (isTranscoding) {
237
270
  // Configure our video parameters for transcoding:
238
271
  //
239
- // -vcodec libx264 copy the stream withour reencoding it.
240
- // -pix_fmt yuvj420p use the yuvj420p pixel format, which is what Protect uses.
241
- // -profile:v high use the H.264 high profile when encoding, which provides for better stream quality and size efficiency.
242
- // -preset veryfast use the veryfast encoding preset in libx264, which provides a good balance of encoding speed and quality.
243
- // -bf 0 disable B-frames when encoding to increase compatibility against occasionally finicky HomeKit clients.
244
- // -b:v bitrate the average bitrate to use for this stream. This is specified by HomeKit.
245
- // -bufsize size this is the decoder buffer size, which drives the variability / quality of the output bitrate.
246
- // -maxrate bitrate the maximum bitrate tolerance, used with -bufsize. We set this to max_bit_rate to effectively
247
- // create a constant bitrate.
248
- // -filter:v fps=fps= use the fps filter to get to the frame rate requested by HomeKit. This has better performance characteristics
249
- // for Protect rather than using "-r".
272
+ // -vcodec libx264 Copy the stream withour reencoding it.
273
+ // -pix_fmt yuvj420p Use the yuvj420p pixel format, which is what Protect uses.
274
+ // -profile:v high Use the H.264 high profile when encoding, which provides for better stream quality and size efficiency.
275
+ // -preset veryfast Use the veryfast encoding preset in libx264, which provides a good balance of encoding speed and quality.
276
+ // -bf 0 Disable B-frames when encoding to increase compatibility against occasionally finicky HomeKit clients.
277
+ // -b:v bitrate The average bitrate to use for this stream. This is specified by HomeKit.
278
+ // -bufsize size This is the decoder buffer size, which drives the variability / quality of the output bitrate.
279
+ // -maxrate bitrate The maximum bitrate tolerance, used with -bufsize. We set this to max_bit_rate to effectively
280
+ // create a constant bitrate.
281
+ // -filter:v fps=fps= Use the fps filter to get to the frame rate requested by HomeKit. This has better performance characteristics
282
+ // for Protect rather than using "-r".
250
283
  ffmpegArgs.push("-vcodec", this.videoEncoder, "-pix_fmt", "yuvj420p", "-profile:v", "high", "-preset", "veryfast", "-bf", "0", "-b:v", request.video.max_bit_rate.toString() + "k", "-bufsize", (2 * request.video.max_bit_rate).toString() + "k", "-maxrate", request.video.max_bit_rate.toString() + "k", "-filter:v", "fps=fps=" + request.video.fps.toString());
251
284
  }
252
285
  else {
253
286
  // Configure our video parameters for just copying the input stream from Protect - it tends to be quite solid in most cases:
254
287
  //
255
- // -vcodec copy copy the stream withour reencoding it.
256
- // -pix_fmt yuvj420p use the yuvj420p pixel format, which is what Protect uses.
257
- // -r fps frame rate to use for this stream. This is specified by HomeKit.
258
- // -b:v bitrate the average bitrate to use for this stream. This is specified by HomeKit.
259
- // -bufsize size this is the decoder buffer size, which drives the variability / quality of the output bitrate.
260
- // -maxrate bitrate the maximum bitrate tolerance, used with -bufsize. We set this to max_bit_rate to effectively
261
- // create a constant bitrate.
288
+ // -vcodec copy Copy the stream withour reencoding it.
262
289
  ffmpegArgs.push("-vcodec", "copy");
263
290
  }
264
291
  // Add in any user-specified options for FFmpeg.
@@ -267,27 +294,27 @@ class ProtectStreamingDelegate {
267
294
  }
268
295
  // Configure our video parameters for SRTP streaming:
269
296
  //
270
- // -payload_type num payload type for the RTP stream. This is negotiated by HomeKit and is usually 99 for H.264 video.
271
- // -ssrc synchronization source stream identifier. Random number negotiated by HomeKit to identify this stream.
272
- // -f rtp specify that we're using the RTP protocol.
273
- // -srtp_out_suite enc specify the output encryption encoding suites.
274
- // -srtp_out_params params specify the output encoding parameters. This is negotiated by HomeKit.
297
+ // -payload_type num Payload type for the RTP stream. This is negotiated by HomeKit and is usually 99 for H.264 video.
298
+ // -ssrc Synchronization source stream identifier. Random number negotiated by HomeKit to identify this stream.
299
+ // -f rtp Specify that we're using the RTP protocol.
300
+ // -srtp_out_suite enc Specify the output encryption encoding suites.
301
+ // -srtp_out_params params Specify the output encoding parameters. This is negotiated by HomeKit.
275
302
  ffmpegArgs.push("-payload_type", request.video.pt.toString(), "-ssrc", sessionInfo.videoSSRC.toString(), "-f", "rtp", "-srtp_out_suite", "AES_CM_128_HMAC_SHA1_80", "-srtp_out_params", sessionInfo.videoSRTP.toString("base64"), "srtp://" + sessionInfo.address + ":" + sessionInfo.videoPort.toString() + "?rtcpport=" + sessionInfo.videoPort.toString() +
276
303
  "&localrtcpport=" + sessionInfo.videoPort.toString() + "&pkt_size=" + videomtu.toString());
277
304
  // Configure the audio portion of the command line, if we have a version of FFmpeg supports libfdk_aac. Options we use are:
278
305
  //
279
- // -map 0:a selects the first available audio track from the stream. Protect actually maps audio
280
- // and video tracks in opposite locations from where FFmpeg typically expects them. This
281
- // setting is a more general solution than naming the track locations directly in case
282
- // Protect changes this in the future.
283
- // -acodec libfdk_aac encode to AAC.
284
- // -profile:a aac_eld specify enhanced, low-delay AAC for HomeKit.
285
- // -flags +global_header sets the global header in the bitstream.
286
- // -f null null filter to pass the audio unchanged without running through a muxing operation.
287
- // -ar samplerate sample rate to use for this audio. This is specified by HomeKit.
288
- // -b:a bitrate bitrate to use for this audio. This is specified by HomeKit.
289
- // -bufsize size this is the decoder buffer size, which drives the variability / quality of the output bitrate.
290
- // -ac 1 set the number of audio channels to 1.
306
+ // -map 0:a Selects the first available audio track from the stream. Protect actually maps audio
307
+ // and video tracks in opposite locations from where FFmpeg typically expects them. This
308
+ // setting is a more general solution than naming the track locations directly in case
309
+ // Protect changes this in the future.
310
+ // -acodec libfdk_aac Encode to AAC.
311
+ // -profile:a aac_eld Specify enhanced, low-delay AAC for HomeKit.
312
+ // -flags +global_header Sets the global header in the bitstream.
313
+ // -f null Null filter to pass the audio unchanged without running through a muxing operation.
314
+ // -ar samplerate Sample rate to use for this audio. This is specified by HomeKit.
315
+ // -b:a bitrate Bitrate to use for this audio. This is specified by HomeKit.
316
+ // -bufsize size This is the decoder buffer size, which drives the variability / quality of the output bitrate.
317
+ // -ac 1 Set the number of audio channels to 1.
291
318
  if (sessionInfo.hasLibFdk) {
292
319
  // Configure our audio parameters.
293
320
  ffmpegArgs.push("-map", "0:a", "-acodec", "libfdk_aac", "-profile:a", "aac_eld", "-flags", "+global_header", "-f", "null", "-ar", request.audio.sample_rate.toString() + "k", "-b:a", request.audio.max_bit_rate.toString() + "k", "-bufsize", (2 * request.audio.max_bit_rate).toString() + "k", "-ac", "1");
@@ -310,11 +337,12 @@ class ProtectStreamingDelegate {
310
337
  ffmpegArgs.push("-af", "highpass=f=" + highpass.toString() + ",lowpass=f=" + lowpass.toString());
311
338
  }
312
339
  // Add the required RTP settings and encryption for the stream:
313
- // -payload_type num payload type for the RTP stream. This is negotiated by HomeKit and is usually 110 for AAC-ELD audio.
314
- // -ssrc synchronization source stream identifier. Random number negotiated by HomeKit to identify this stream.
315
- // -f rtp specify that we're using the RTP protocol.
316
- // -srtp_out_suite enc specify the output encryption encoding suites.
317
- // -srtp_out_params params specify the output encoding parameters. This is negotiated by HomeKit.
340
+ //
341
+ // -payload_type num Payload type for the RTP stream. This is negotiated by HomeKit and is usually 110 for AAC-ELD audio.
342
+ // -ssrc synchronization source stream identifier. Random number negotiated by HomeKit to identify this stream.
343
+ // -f rtp Specify that we're using the RTP protocol.
344
+ // -srtp_out_suite enc Specify the output encryption encoding suites.
345
+ // -srtp_out_params params Specify the output encoding parameters. This is negotiated by HomeKit.
318
346
  ffmpegArgs.push("-payload_type", request.audio.pt.toString(), "-ssrc", sessionInfo.audioSSRC.toString(), "-f", "rtp", "-srtp_out_suite", "AES_CM_128_HMAC_SHA1_80", "-srtp_out_params", sessionInfo.audioSRTP.toString("base64"), "srtp://" + sessionInfo.address + ":" + sessionInfo.audioPort.toString() + "?rtcpport=" + sessionInfo.audioPort.toString() +
319
347
  "&localrtcpport=" + sessionInfo.audioPort.toString() + "&pkt_size=" + audiomtu.toString());
320
348
  }
@@ -326,9 +354,9 @@ class ProtectStreamingDelegate {
326
354
  ffmpegArgs.push("-loglevel", "level+debug");
327
355
  }
328
356
  // Combine everything and start an instance of FFmpeg.
329
- const ffmpeg = new protect_ffmpeg_1.FfmpegProcess(this, request.sessionID, ffmpegArgs, (sessionInfo.hasLibFdk && this.protectCamera.twoWayAudio) ? undefined : { addressVersion: sessionInfo.addressVersion, port: sessionInfo.videoReturnPort }, callback);
357
+ const ffmpegStream = new protect_ffmpeg_1.FfmpegStreamingProcess(this, request.sessionID, ffmpegArgs, (sessionInfo.hasLibFdk && this.protectCamera.twoWayAudio) ? undefined : { addressVersion: sessionInfo.addressVersion, port: sessionInfo.videoReturnPort }, callback);
330
358
  // Some housekeeping for our FFmpeg and demuxer sessions.
331
- this.ongoingSessions[request.sessionID] = { ffmpeg: [ffmpeg], rtpDemuxer: sessionInfo.rtpDemuxer };
359
+ this.ongoingSessions[request.sessionID] = { ffmpeg: [ffmpegStream], rtpDemuxer: sessionInfo.rtpDemuxer };
332
360
  delete this.pendingSessions[request.sessionID];
333
361
  // If we aren't doing two-way audio, we're done here. For two-way audio...we have some more plumbing to do.
334
362
  if (!sessionInfo.hasLibFdk || !this.protectCamera.twoWayAudio) {
@@ -338,16 +366,17 @@ class ProtectStreamingDelegate {
338
366
  // SDP messages tell the other side of the connection what we're expecting to receive.
339
367
  //
340
368
  // Parameters are:
341
- // v protocol version - always 0.
342
- // o originator and session identifier.
343
- // s session description.
344
- // c connection information.
345
- // t timestamps for the start and end of the session.
346
- // m media type - audio, adhering to RTP/AVP, payload type 110.
347
- // b bandwidth information - application specific, 24k.
348
- // a=rtpmap payload type 110 corresponds to an MP4 stream.
349
- // a=fmtp for payload type 110, use these format parameters.
350
- // a=crypto crypto suite to use for this session.
369
+ //
370
+ // v Protocol version - always 0.
371
+ // o Originator and session identifier.
372
+ // s Session description.
373
+ // c Connection information.
374
+ // t Timestamps for the start and end of the session.
375
+ // m Media type - audio, adhering to RTP/AVP, payload type 110.
376
+ // b Bandwidth information - application specific, 24k.
377
+ // a=rtpmap Payload type 110 corresponds to an MP4 stream.
378
+ // a=fmtp For payload type 110, use these format parameters.
379
+ // a=crypto Crypto suite to use for this session.
351
380
  const sdpReturnAudio = [
352
381
  "v=0",
353
382
  "o=- 0 0 IN " + sdpIpVersion + " 127.0.0.1",
@@ -362,17 +391,18 @@ class ProtectStreamingDelegate {
362
391
  ].join("\n");
363
392
  // Configure the audio portion of the command line, if we have a version of FFmpeg supports libfdk_aac. Options we use are:
364
393
  //
365
- // -protocol_whitelist set the list of allowed protocols for this FFmpeg session.
366
- // -f sdp specify that our input will be an SDP file.
367
- // -acodec libfdk_aac decode AAC input.
368
- // -i pipe:0 read input from standard input.
369
- // -map 0:a selects the first available audio track from the stream.
370
- // -acodec aac encode to AAC. This is set by Protect.
371
- // -flags +global_header sets the global header in the bitstream.
372
- // -ar samplerate sample rate to use for this audio. This is specified by Protect.
373
- // -b:a bitrate bitrate to use for this audio. This is specified by Protect.
374
- // -ac 1 set the number of audio channels to 1. This is specified by Protect.
375
- // -f adts transmit an ADTS stream.
394
+ // -protocol_whitelist Set the list of allowed protocols for this FFmpeg session.
395
+ // -f sdp Specify that our input will be an SDP file.
396
+ // -acodec libfdk_aac Decode AAC input.
397
+ // -i pipe:0 Read input from standard input.
398
+ // -map 0:a Selects the first available audio track from the stream.
399
+ // -acodec aac Encode to AAC. This is set by Protect.
400
+ // -flags +global_header Sets the global header in the bitstream.
401
+ // -ar samplerate Sample rate to use for this audio. This is specified by Protect.
402
+ // -b:a bitrate Bitrate to use for this audio. This is specified by Protect.
403
+ // -ac 1 Set the number of audio channels to 1. This is specified by Protect.
404
+ // -f adts Transmit an ADTS stream.
405
+ // pipe:1 Output the ADTS stream to standard output.
376
406
  const ffmpegReturnAudioCmd = [
377
407
  "-hide_banner",
378
408
  "-protocol_whitelist", "pipe,udp,rtp,file,crypto",
@@ -385,7 +415,7 @@ class ProtectStreamingDelegate {
385
415
  "-ar", cameraConfig.talkbackSettings.samplingRate.toString(),
386
416
  "-b:a", "64k",
387
417
  "-f", "adts",
388
- "-"
418
+ "pipe:1"
389
419
  ];
390
420
  // Additional logging, but only if we're debugging.
391
421
  if (this.platform.verboseFfmpeg) {
@@ -397,12 +427,15 @@ class ProtectStreamingDelegate {
397
427
  try {
398
428
  // Now it's time to talkback.
399
429
  let ws = null;
430
+ let isTalkbackLive = false;
431
+ let dataListener;
432
+ let openListener;
400
433
  if (sessionInfo.talkBack) {
401
434
  // Open the talkback connection.
402
435
  ws = new ws_1.default(sessionInfo.talkBack, { rejectUnauthorized: false });
403
- this.isTalkbackLive = true;
436
+ isTalkbackLive = true;
404
437
  // Catch any errors and inform the user, if needed.
405
- ws === null || ws === void 0 ? void 0 : ws.on("error", (error) => {
438
+ ws === null || ws === void 0 ? void 0 : ws.once("error", (error) => {
406
439
  // Ignore timeout errors, but notify the user about anything else.
407
440
  if (error.code !== "ETIMEDOUT") {
408
441
  this.log.error("%s: Error in communicating with the return audio channel: %s", this.name(), error);
@@ -410,32 +443,44 @@ class ProtectStreamingDelegate {
410
443
  ws === null || ws === void 0 ? void 0 : ws.terminate();
411
444
  });
412
445
  // Catch any stray open events after we've closed.
413
- ws === null || ws === void 0 ? void 0 : ws.on("open", () => {
446
+ ws === null || ws === void 0 ? void 0 : ws.on("open", openListener = () => {
414
447
  // If we've somehow opened after we've wrapped up talkback, terminate the connection.
415
- if (!this.isTalkbackLive) {
448
+ if (!isTalkbackLive) {
416
449
  ws === null || ws === void 0 ? void 0 : ws.terminate();
417
450
  }
418
451
  });
452
+ // Cleanup after ourselves on close.
453
+ ws === null || ws === void 0 ? void 0 : ws.once("close", () => {
454
+ ws === null || ws === void 0 ? void 0 : ws.removeListener("open", openListener);
455
+ });
419
456
  }
420
457
  // Fire up FFmpeg.
421
- const ffmpegReturnAudio = new protect_ffmpeg_1.FfmpegProcess(this, request.sessionID, ffmpegReturnAudioCmd);
458
+ const ffmpegReturnAudio = new protect_ffmpeg_1.FfmpegStreamingProcess(this, request.sessionID, ffmpegReturnAudioCmd);
422
459
  // Make sure we terminate the talkback websocket when we're done.
423
- (_c = ffmpegReturnAudio.getStdout()) === null || _c === void 0 ? void 0 : _c.on("close", () => {
460
+ (_c = ffmpegReturnAudio.stdout) === null || _c === void 0 ? void 0 : _c.once("close", () => {
461
+ var _a;
424
462
  // Make sure we catch any stray connections that may be too slow to open.
425
- this.isTalkbackLive = false;
463
+ isTalkbackLive = false;
426
464
  // Close the websocket.
427
465
  if (((ws === null || ws === void 0 ? void 0 : ws.readyState) === ws_1.default.CLOSING) || ((ws === null || ws === void 0 ? void 0 : ws.readyState) === ws_1.default.OPEN)) {
428
466
  ws === null || ws === void 0 ? void 0 : ws.terminate();
429
467
  }
468
+ (_a = ffmpegReturnAudio.stdout) === null || _a === void 0 ? void 0 : _a.removeListener("data", dataListener);
430
469
  });
431
470
  // Setup housekeeping for the twoway FFmpeg session.
432
471
  this.ongoingSessions[request.sessionID].ffmpeg.push(ffmpegReturnAudio);
433
472
  // Feed the SDP session description to FFmpeg on stdin.
434
- (_d = ffmpegReturnAudio.getStdin()) === null || _d === void 0 ? void 0 : _d.write(sdpReturnAudio);
435
- (_e = ffmpegReturnAudio.getStdin()) === null || _e === void 0 ? void 0 : _e.end();
473
+ (_d = ffmpegReturnAudio.stdin) === null || _d === void 0 ? void 0 : _d.write(sdpReturnAudio);
474
+ (_e = ffmpegReturnAudio.stdin) === null || _e === void 0 ? void 0 : _e.end();
436
475
  // Send the audio.
437
- (_f = ffmpegReturnAudio.getStdout()) === null || _f === void 0 ? void 0 : _f.on("data", (data) => {
438
- ws === null || ws === void 0 ? void 0 : ws.send(data);
476
+ (_f = ffmpegReturnAudio.stdout) === null || _f === void 0 ? void 0 : _f.on("data", dataListener = (data) => {
477
+ ws === null || ws === void 0 ? void 0 : ws.send(data, error => {
478
+ // This happens when an error condition is encountered on sending data to the websocket.
479
+ // We assume the worst and close our talkback channel.
480
+ if (error) {
481
+ ws === null || ws === void 0 ? void 0 : ws.terminate();
482
+ }
483
+ });
439
484
  });
440
485
  }
441
486
  catch (error) {
@@ -443,19 +488,23 @@ class ProtectStreamingDelegate {
443
488
  }
444
489
  }
445
490
  // Process incoming stream requests.
446
- handleStreamRequest(request, callback) {
491
+ async handleStreamRequest(request, callback) {
447
492
  switch (request.type) {
448
493
  case "start" /* START */:
449
- this.startStream(request, callback);
494
+ await this.startStream(request, callback);
450
495
  break;
451
496
  case "reconfigure" /* RECONFIGURE */:
452
497
  // Once FFmpeg is updated to support this, we'll enable this one.
453
- this.debug("%s: Ignoring request to reconfigure: %sx%s, %s fps, %s kbps.", this.name(), request.video.width, request.video.height, request.video.fps, request.video.max_bit_rate);
498
+ this.log.info("%s: Streaming parameters adjustment requested by HomeKit: %sx%s, %s fps, %s kbps.", this.name(), request.video.width, request.video.height, request.video.fps, request.video.max_bit_rate);
499
+ // Set the desired bitrate in Protect.
500
+ if (this.rtspEntry) {
501
+ await this.protectCamera.setBitrate(this.rtspEntry.channel.id, request.video.max_bit_rate * 1000);
502
+ }
454
503
  callback();
455
504
  break;
456
505
  case "stop" /* STOP */:
457
506
  default:
458
- this.stopStream(request.sessionID);
507
+ await this.stopStream(request.sessionID);
459
508
  callback();
460
509
  break;
461
510
  }
@@ -526,8 +575,8 @@ class ProtectStreamingDelegate {
526
575
  }
527
576
  }
528
577
  // Close a video stream.
529
- stopStream(sessionId) {
530
- var _a;
578
+ async stopStream(sessionId) {
579
+ var _a, _b;
531
580
  try {
532
581
  // Stop any FFmpeg instances we have running.
533
582
  if (this.ongoingSessions[sessionId]) {
@@ -542,15 +591,20 @@ class ProtectStreamingDelegate {
542
591
  // Delete the entries.
543
592
  delete this.pendingSessions[sessionId];
544
593
  delete this.ongoingSessions[sessionId];
594
+ // If we've completed all streaming sessions, restore any changed settings, such as bitrate, for HomeKit Secure Video.
595
+ if (((_b = this.hksv) === null || _b === void 0 ? void 0 : _b.isRecording) && !this.ongoingSessions.length) {
596
+ await this.hksv.updateRecordingActive(this.hksv.isRecording);
597
+ }
545
598
  }
546
599
  catch (error) {
547
600
  this.log.error("%s: Error occurred while ending the FFmpeg video processes: %s.", this.name(), error);
548
601
  }
549
602
  }
550
603
  // Shutdown all our video streams.
551
- shutdown() {
604
+ async shutdown() {
552
605
  for (const session of Object.keys(this.ongoingSessions)) {
553
- this.stopStream(session);
606
+ // eslint-disable-next-line no-await-in-loop
607
+ await this.stopStream(session);
554
608
  }
555
609
  }
556
610
  // Temporarily increase the verbosity of FFmpeg output for end users.
@@ -1 +1 @@
1
- {"version":3,"file":"protect-stream.js","sourceRoot":"","sources":["../src/protect-stream.ts"],"names":[],"mappings":";;;;;;AA2BA,iDAAgE;AAChE,yCAIoB;AACpB,qDAAiD;AAIjD,+CAA2C;AAC3C,6BAA0B;AAC1B,4CAA2B;AAC3B,kFAA+C;AAC/C,2DAAwD;AAExD,gIAAgI;AAChI,0GAA0G;AAC1G,OAAO,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,mBAAmB,GAAG,GAAG,CAAC;AAuBzD,wDAAwD;AACxD,MAAa,wBAAwB;IAkBnC,YAAY,aAA4B,EAAE,WAAuC;QAE/E,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;QACjC,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC;QAC1D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,+BAAU,IAAI,QAAQ,CAAC;QAE3E,mCAAmC;QACnC,MAAM,OAAO,GAA4B;YACvC,iBAAiB,EAAE,EAAE;YACrB,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE;gBAChB,KAAK,EAAE;oBACL,MAAM,EAAE;wBACN;4BACE,UAAU,iBAAiC;4BAC3C,IAAI,yBAAiC;yBACtC;qBACF;oBAED,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW;iBAC5C;gBAED,qBAAqB,EAAE,iCAAmD;gBAE1E,KAAK,EAAE;oBACL,KAAK,EAAE;wBACL,mGAAmG;wBACnG,iGAAiG;wBACjG,mGAAmG;wBACnG,qBAAqB;wBACrB,MAAM,EAAE,sDAAuF;wBAC/F,QAAQ,EAAE,cAA6B;qBACxC;oBAED,mGAAmG;oBACnG,kGAAkG;oBAClG,2FAA2F;oBAC3F,sGAAsG;oBACtG,wEAAwE;oBACxE,WAAW,EAAE,WAAW;iBACzB;aACF;SACF,CAAC;QAEF,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,0CAA0C;IACnC,KAAK,CAAC,qBAAqB,CAAC,OAAyB,EAAE,QAAkC;;QAE9F,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEjD,8CAA8C;QAC9C,IAAG,CAAC,QAAQ,EAAE;YAEZ,IAAG,QAAQ,EAAE;gBACX,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,iCAAiC,CAAC,CAAC,CAAC;aACtE;YAED,OAAO;SACR;QAED,+BAA+B;QAC/B,IAAG,QAAQ,EAAE;YACX,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;SAC/B;QAED,6DAA6D;QAC7D,MAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,0CAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,yBAAyB,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1I,CAAC;IAED,sCAAsC;IAC/B,KAAK,CAAC,aAAa,CAAC,OAA6B,EAAE,QAA+B;QAEvF,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,MAA6B,CAAC;QAExF,qCAAqC;QACrC,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAEhH,6FAA6F;QAC7F,MAAM,SAAS,GAAG,cAAc,IAAI,CAAC,MAAM,8BAAa,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAEpH,4BAA4B;QAC5B,MAAM,qBAAqB,GAAG,CAAC,MAAM,IAAA,2BAAY,EAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,iBAAiB,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAA,2BAAY,EAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrH,MAAM,oBAAoB,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAA,2BAAY,EAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,6BAA6B,EAAE,CAAC;QAE5E,IAAG,CAAC,SAAS,EAAE;YACb,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE,IAAI,CAAC,IAAI,EAAE,EACxD,cAAc,CAAC,CAAC,CAAC,0FAA0F,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACrH;QAED,IAAI,UAAU,GAAG,IAAI,CAAC;QACtB,IAAI,QAAQ,GAAG,IAAI,CAAC;QAEpB,IAAG,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;YAE9C,qDAAqD;YACrD,UAAU,GAAG,IAAI,wBAAU,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;YAE1H,sDAAsD;YACtD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;YAEhE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,YAAY,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAErI,+DAA+D;YAC/D,IAAG,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,EAAE,CAAA,EAAE;gBAEhB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qDAAqD,EAClE,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,KAAK,GAAG,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAEtG;iBAAM;gBAEL,IAAI;oBAEF,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA4B,CAAC;oBAE3D,kCAAkC;oBAClC,MAAM,KAAK,GAAG,IAAI,SAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC9B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC;oBAEnD,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;iBAE7B;gBAAC,OAAM,KAAK,EAAE;oBAEb,IAAG,KAAK,YAAY,0BAAU,EAAE;wBAE9B,QAAO,KAAK,CAAC,IAAI,EAAE;4BAEjB;gCAEE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gEAAgE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gCAC7G,MAAM;yBACT;qBACF;oBAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qEAAqE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;oBAC1G,QAAQ,GAAG,IAAI,CAAC;iBACjB;aACF;SACF;QAED,4BAA4B;QAC5B,MAAM,eAAe,GAAG,CAAC,MAAM,IAAA,2BAAY,EAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,6BAA6B,EAAE,CAAC;QAE5E,MAAM,WAAW,GAAgB;YAC/B,OAAO,EAAE,OAAO,CAAC,aAAa;YAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;YAEtC,gBAAgB,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe;YAC/C,qBAAqB,EAAE,qBAAqB;YAC5C,oBAAoB,EAAE,oBAAoB;YAC1C,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI;YAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC3E,SAAS,EAAE,SAAS;YAEpB,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,QAAQ;YAElB,gBAAgB,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe;YAC/C,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI;YAC7B,eAAe,EAAE,eAAe;YAChC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC3E,SAAS,EAAE,SAAS;SACrB,CAAC;QAEF,kHAAkH;QAClH,oHAAoH;QACpH,qCAAqC;QACrC,MAAM,QAAQ,GAA0B;YACtC,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,qBAAqB;gBAC/F,qCAAqC;gBACrC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ;gBAChC,qCAAqC;gBACrC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS;gBAClC,IAAI,EAAE,SAAS;aAChB;YAED,KAAK,EAAE;gBACL,IAAI,EAAE,eAAe;gBACrB,qCAAqC;gBACrC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ;gBAChC,qCAAqC;gBACrC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS;gBAClC,IAAI,EAAE,SAAS;aAChB;SACF,CAAC;QAEF,sFAAsF;QACtF,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC;QACtD,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,+CAA+C;IACvC,WAAW,CAAC,OAA2B,EAAE,QAA+B;;QAE9E,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,MAA6B,CAAC;QACxF,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG,WAAW,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA,CAAC,CAAC,KAAK,CAAC;QAE3E,sCAAsC;QACtC,IAAG,YAAY,CAAC,KAAK,KAAK,WAAW,EAAE;YACrC,MAAM,YAAY,GAAG,qEAAqE,CAAC;YAE3F,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;YACpD,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC;YACvD,OAAO;SACR;QAED,6DAA6D;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QAE5H,IAAG,CAAC,SAAS,EAAE;YAEb,MAAM,YAAY,GAAG,uEAAuE,CAAC;YAE7F,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,YAAY,EACxE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAE5F,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC;YACvD,OAAO;SACR;QAED,sBAAsB;QACtB,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QAExH,qGAAqG;QACrG,yGAAyG;QACzG,sGAAsG;QACtG,0GAA0G;QAC1G,sGAAsG;QACtG,4GAA4G;QAC5G,2GAA2G;QAC3G,4GAA4G;QAC5G,uGAAuG;QACvG,oGAAoG;QACpG,2BAA2B;QAC3B,EAAE;QACF,8GAA8G;QAC9G,6GAA6G;QAC7G,8DAA8D;QAC9D,EAAE;QACF,iHAAiH;QACjH,mHAAmH;QACnH,qBAAqB;QACrB,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC;QAEzB,uEAAuE;QACvE,6FAA6F;QAC7F,4GAA4G;QAC5G,6GAA6G;QAC7G,2GAA2G;QAC3G,6DAA6D;QAC7D,MAAM,UAAU,GAAG,CAAE,cAAc,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAE,CAAC;QAEpG,mBAAmB;QACnB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,2FAA2F,EACvG,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,EAC1H,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAE7F,qHAAqH;QACrH,IAAG,aAAa,EAAE;YAEhB,kDAAkD;YAClD,EAAE;YACF,4DAA4D;YAC5D,gFAAgF;YAChF,6HAA6H;YAC7H,+HAA+H;YAC/H,4HAA4H;YAC5H,+FAA+F;YAC/F,oHAAoH;YACpH,mHAAmH;YACnH,gDAAgD;YAChD,mIAAmI;YACnI,yDAAyD;YACzD,UAAU,CAAC,IAAI,CACb,SAAS,EAAE,IAAI,CAAC,YAAY,EAC5B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,UAAU,EACrB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,GAAG,EACnD,UAAU,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,GAAG,GAAG,EAC7D,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,GAAG,EACvD,WAAW,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CACvD,CAAC;SAEH;aAAM;YAEL,4HAA4H;YAC5H,EAAE;YACF,4DAA4D;YAC5D,gFAAgF;YAChF,sFAAsF;YACtF,+FAA+F;YAC/F,oHAAoH;YACpH,mHAAmH;YACnH,gDAAgD;YAChD,UAAU,CAAC,IAAI,CACb,SAAS,EAAE,MAAM,CAClB,CAAC;SACH;QAED,gDAAgD;QAChD,IAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE;YACrC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;SACxD;QAED,qDAAqD;QACrD,EAAE;QACF,uHAAuH;QACvH,iIAAiI;QACjI,qEAAqE;QACrE,yEAAyE;QACzE,iGAAiG;QACjG,UAAU,CAAC,IAAI,CACb,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,EAC5C,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,EACzC,IAAI,EAAE,KAAK,EACX,iBAAiB,EAAE,yBAAyB,EAC5C,kBAAkB,EAAE,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC5D,SAAS,GAAG,WAAW,CAAC,OAAO,GAAG,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE;YAC1H,iBAAiB,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAC1F,CAAC;QAEF,2HAA2H;QAC3H,EAAE;QACF,6GAA6G;QAC7G,8GAA8G;QAC9G,4GAA4G;QAC5G,4DAA4D;QAC5D,uCAAuC;QACvC,qEAAqE;QACrE,iEAAiE;QACjE,4GAA4G;QAC5G,yFAAyF;QACzF,qFAAqF;QACrF,uHAAuH;QACvH,+DAA+D;QAC/D,IAAG,WAAW,CAAC,SAAS,EAAE;YAExB,kCAAkC;YAClC,UAAU,CAAC,IAAI,CACb,MAAM,EAAE,KAAK,EACb,SAAS,EAAE,YAAY,EACvB,YAAY,EAAE,SAAS,EACvB,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,GAAG,EACjD,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,GAAG,EACnD,UAAU,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,GAAG,GAAG,EAC7D,KAAK,EAAE,GAAG,CACX,CAAC;YAEF,8CAA8C;YAC9C,IAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE,oBAAoB,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE;gBACvG,IAAI,QAAQ,CAAC;gBACb,IAAI,OAAO,CAAC;gBAEZ,qEAAqE;gBACrE,QAAQ,GAAG,QAAQ,CAAC,MAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,6BAA6B,EAAE,WAAW,CAAC,OAAO,CAAC,mCAAI,EAAE,CAAC,CAAC;gBAE9H,mDAAmD;gBACnD,IAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE;oBAC5C,QAAQ,GAAG,+CAAoC,CAAC;iBACjD;gBAED,qEAAqE;gBACrE,OAAO,GAAG,QAAQ,CAAC,MAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,4BAA4B,EAAE,WAAW,CAAC,OAAO,CAAC,mCAAI,EAAE,CAAC,CAAC;gBAE5H,mDAAmD;gBACnD,IAAG,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE;oBACzC,OAAO,GAAG,8CAAmC,CAAC;iBAC/C;gBAED,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,aAAa,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;aAClG;YAED,+DAA+D;YAC/D,+HAA+H;YAC/H,iIAAiI;YACjI,qEAAqE;YACrE,yEAAyE;YACzE,iGAAiG;YACjG,UAAU,CAAC,IAAI,CACb,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,EAC5C,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,EACzC,IAAI,EAAE,KAAK,EACX,iBAAiB,EAAE,yBAAyB,EAC5C,kBAAkB,EAAE,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC5D,SAAS,GAAG,WAAW,CAAC,OAAO,GAAG,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE;gBAC1H,iBAAiB,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAC1F,CAAC;SACH;QAED,mDAAmD;QACnD,IAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;YAC9B,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;SAC/C;QAED,IAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE;YAChC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;SAC7C;QAED,sDAAsD;QACtD,MAAM,MAAM,GAAG,IAAI,8BAAa,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,UAAU,EAClE,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,cAAc,EAAE,IAAI,EAAE,WAAW,CAAC,eAAe,EAAE,EACzJ,QAAQ,CAAC,CAAC;QAEZ,yDAAyD;QACzD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,CAAE,MAAM,CAAE,EAAE,UAAU,EAAE,WAAW,CAAC,UAAU,EAAE,CAAC;QACrG,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE/C,2GAA2G;QAC3G,IAAG,CAAC,WAAW,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;YAC5D,OAAO;SACR;QAED,4EAA4E;QAC5E,sFAAsF;QACtF,EAAE;QACF,kBAAkB;QAClB,6CAA6C;QAC7C,mDAAmD;QACnD,qCAAqC;QACrC,wCAAwC;QACxC,iEAAiE;QACjE,2EAA2E;QAC3E,mEAAmE;QACnE,+DAA+D;QAC/D,mEAAmE;QACnE,sDAAsD;QACtD,MAAM,cAAc,GAAG;YACrB,KAAK;YACL,aAAa,GAAG,YAAY,GAAG,YAAY;YAC3C,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,iBAAiB;YACtC,OAAO,GAAG,YAAY,GAAG,GAAG,GAAG,WAAW,CAAC,OAAO;YAClD,OAAO;YACP,UAAU,GAAG,WAAW,CAAC,oBAAoB,CAAC,QAAQ,EAAE,GAAG,cAAc;YACzE,SAAS;YACT,oCAAoC;YACpC,kHAAkH;YAClH,4CAA4C,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;SACxF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,2HAA2H;QAC3H,EAAE;QACF,mFAAmF;QACnF,oEAAoE;QACpE,0CAA0C;QAC1C,wDAAwD;QACxD,iFAAiF;QACjF,+DAA+D;QAC/D,iEAAiE;QACjE,yFAAyF;QACzF,qFAAqF;QACrF,6FAA6F;QAC7F,iDAAiD;QACjD,MAAM,oBAAoB,GAAG;YAC3B,cAAc;YACd,qBAAqB,EAAE,0BAA0B;YACjD,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,YAAY;YACvB,KAAK,EAAE,YAAY,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE;YACxD,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,YAAY,CAAC,gBAAgB,CAAC,OAAO;YAChD,QAAQ,EAAE,gBAAgB;YAC1B,KAAK,EAAE,YAAY,CAAC,gBAAgB,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC5D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,MAAM;YACZ,GAAG;SACJ,CAAC;QAEF,mDAAmD;QACnD,IAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;YAC9B,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;SACzD;QAED,IAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE;YAChC,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;SACvD;QAED,IAAI;YAEF,6BAA6B;YAC7B,IAAI,EAAE,GAAqB,IAAI,CAAC;YAEhC,IAAG,WAAW,CAAC,QAAQ,EAAE;gBAEvB,gCAAgC;gBAChC,EAAE,GAAG,IAAI,YAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC;gBACxE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAE3B,mDAAmD;gBACnD,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAExB,kEAAkE;oBAClE,IAAI,KAA+B,CAAC,IAAI,KAAK,WAAW,EAAE;wBACxD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8DAA8D,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;qBACpG;oBAED,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,SAAS,EAAE,CAAC;gBAClB,CAAC,CAAC,CAAC;gBAEH,kDAAkD;gBAClD,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;oBAElB,qFAAqF;oBACrF,IAAG,CAAC,IAAI,CAAC,cAAc,EAAE;wBACvB,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,SAAS,EAAE,CAAC;qBACjB;gBACH,CAAC,CAAC,CAAC;aACJ;YAED,kBAAkB;YAClB,MAAM,iBAAiB,GAAG,IAAI,8BAAa,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;YAE3F,iEAAiE;YACjE,MAAA,iBAAiB,CAAC,SAAS,EAAE,0CAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAE9C,yEAAyE;gBACzE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAE5B,uBAAuB;gBACvB,IAAG,CAAC,CAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,UAAU,MAAK,YAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,UAAU,MAAK,YAAS,CAAC,IAAI,CAAC,EAAE;oBAEhF,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,SAAS,EAAE,CAAC;iBACjB;YACH,CAAC,CAAC,CAAC;YAEH,oDAAoD;YACpD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAEvE,uDAAuD;YACvD,MAAA,iBAAiB,CAAC,QAAQ,EAAE,0CAAE,KAAK,CAAC,cAAc,CAAC,CAAC;YACpD,MAAA,iBAAiB,CAAC,QAAQ,EAAE,0CAAE,GAAG,EAAE,CAAC;YAEpC,kBAAkB;YAClB,MAAA,iBAAiB,CAAC,SAAS,EAAE,0CAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACzD,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;SAEJ;QAAC,OAAM,KAAK,EAAE;YAEb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uDAAuD,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;SAC7F;IACH,CAAC;IAED,oCAAoC;IAC7B,mBAAmB,CAAC,OAAyB,EAAE,QAA+B;QAEnF,QAAO,OAAO,CAAC,IAAI,EAAE;YACnB;gBACE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACpC,MAAM;YAER;gBACE,iEAAiE;gBACjE,IAAI,CAAC,KAAK,CAAC,8DAA8D,EACvE,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACzG,QAAQ,EAAE,CAAC;gBACX,MAAM;YAER,uBAA6B;YAC7B;gBACE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnC,QAAQ,EAAE,CAAC;gBACX,MAAM;SACT;IACH,CAAC;IAED,4CAA4C;IACpC,iBAAiB,CAAC,SAAiB;QAEzC,uFAAuF;QACvF,IAAG,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE;YACtG,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;SACb;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC;IAC7C,CAAC;IAED,mBAAmB;IACX,KAAK,CAAC,WAAW,CAAC,OAAyB;QAEjD,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,MAA6B,CAAC;QACxF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAEtD,sCAAsC;QACtC,IAAG,YAAY,CAAC,KAAK,KAAK,WAAW,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,0EAA0E,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACxG,OAAO,IAAI,CAAC;SACb;QAED,gFAAgF;QAChF,IAAG,OAAO,EAAE;YACV,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;SACpD;QAED,yCAAyC;QACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAErJ,iGAAiG;QACjG,iFAAiF;QACjF,IAAG,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,EAAE,CAAA,EAAE;YAEhB,0DAA0D;YAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAEhE,IAAG,cAAc,EAAE;gBACjB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mFAAmF,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjH,OAAO,cAAc,CAAC;aACvB;YAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sCAAsC,EACnD,IAAI,CAAC,IAAI,EAAE,EACX,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,KAAK,GAAG,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAExF,OAAO,IAAI,CAAC;SACb;QAED,IAAI;YAEF,sBAAsB;YACtB,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC9G,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;SAEnD;QAAC,OAAM,KAAK,EAAE;YAEb,IAAG,KAAK,YAAY,0BAAU,EAAE;gBAC9B,IAAI,cAAc,CAAC;gBAEnB,QAAO,KAAK,CAAC,IAAI,EAAE;oBACjB,KAAK,4BAA4B;wBAE/B,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;wBAE1D,IAAG,cAAc,EAAE;4BACjB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qEAAqE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;4BACnG,OAAO,cAAc,CAAC;yBACvB;wBAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8FAA8F,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;wBAC5H,OAAO,IAAI,CAAC;wBACZ,MAAM;oBAER;wBACE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;wBACpE,OAAO,IAAI,CAAC;wBACZ,MAAM;iBACT;aACF;YAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4DAA4D,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;YACjG,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED,wBAAwB;IACjB,UAAU,CAAC,SAAiB;;QAEjC,IAAI;YAEF,6CAA6C;YAC7C,IAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE;gBAElC,KAAI,MAAM,aAAa,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;oBACjE,aAAa,CAAC,IAAI,EAAE,CAAC;iBACtB;gBAED,qCAAqC;gBACrC,MAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,UAAU,0CAAE,KAAK,EAAE,CAAC;gBAEpD,mBAAmB;gBACnB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sCAAsC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;aACpE;YAED,sBAAsB;YACtB,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;SAExC;QAAC,OAAM,KAAK,EAAE;YAEb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iEAAiE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;SACvG;IACH,CAAC;IAED,kCAAkC;IAC3B,QAAQ;QACb,KAAI,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;YACtD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;SAC1B;IACH,CAAC;IAED,qEAAqE;IAC9D,gBAAgB;QAErB,sDAAsD;QACtD,IAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,IAAI,CAAC,kBAAkB,EAAE;YACzD,OAAO;SACR;QAED,iDAAiD;QACjD,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,GAAG,EAAE;YACxC,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;YAEnE,2BAA2B;YAC3B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,EAAE,0CAA+B,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAEhD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA6B;YACzC,gIAAgI,EAAE,0CAA+B,CAAC,CAAC;QAErK,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;IACrC,CAAC;CACF;AAjvBD,4DAivBC"}
1
+ {"version":3,"file":"protect-stream.js","sourceRoot":"","sources":["../src/protect-stream.ts"],"names":[],"mappings":"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"}