webcodecs-examples 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../node_modules/uuid/dist/esm-browser/rng.js","../../../node_modules/uuid/dist/esm-browser/native.js","../../../node_modules/uuid/dist/esm-browser/v4.js","../src/utils/WorkerController.ts","../node_modules/mp4-muxer/build/mp4-muxer.mjs","../src/player/renderers/audio/audio.ts","../src/utils/EventEmitter.ts","../src/player/renderers/video/video.ts","../src/player/clock.ts","../src/player/player.ts"],"sourcesContent":["import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random || (options.rng || rng)();\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import { v4 as uuidv4 } from 'uuid';\n\n\nexport interface WorkerMessage {\n cmd: string;\n data: any;\n request_id: string;\n}\n\nexport interface WorkerResponse {\n request_id: string;\n res: any;\n}\n\ninterface GenericObject {\n [key: string]: any;\n}\n\n\n\nexport type WorkerEventHandler = (data: any) => void;\n\nexport class WorkerController {\n private worker: Worker;\n private listeners: Record<string, WorkerEventHandler>;\n private persistentEvents: string[];\n private port?: MessagePort;\n\n constructor(workerUrlOrConstructor: string | URL | (new () => Worker), persistentEvents: string[] = [], port?: MessagePort) {\n // Support both Worker constructor (from ?worker) and URL (from ?worker&url)\n this.worker = typeof workerUrlOrConstructor === 'function'\n ? new workerUrlOrConstructor()\n : new Worker(workerUrlOrConstructor, { type: 'module' });\n this.listeners = {};\n this.persistentEvents = persistentEvents;\n\n this.worker.onmessage = this.handleWorkerMessage.bind(this);\n\n if(port){\n this.port = port;\n this.worker.postMessage({cmd: 'port', data: port}, {transfer: [port]});\n }\n }\n\n\n setupPort(port: MessagePort){\n this.port = port;\n this.worker.postMessage({cmd: 'port', data: port}, {transfer: [port]});\n }\n\n private handleWorkerMessage(event: MessageEvent<WorkerResponse>): void {\n\n if (this.listeners[event.data.request_id]) {\n this.listeners[event.data.request_id](event.data.res);\n\n // Clean up non-persistent listeners\n if (!this.persistentEvents.includes(event.data.request_id)) {\n delete this.listeners[event.data.request_id];\n }\n }\n }\n\n public addPersistentListener(eventName: string, handler: WorkerEventHandler): void {\n if (!this.persistentEvents.includes(eventName)) {\n this.persistentEvents.push(eventName);\n }\n this.listeners[eventName] = handler;\n }\n\n public async sendMessage<T>(\n cmd: string, \n data: any = {}, \n transfer: Transferable[] = [],\n sanitize: boolean = true\n ): Promise<T> {\n const request_id = uuidv4();\n const sanitizedData = sanitize ? sanitizeForWorker(data) : data;\n\n return new Promise((resolve, reject) => {\n try {\n const message: WorkerMessage = {\n cmd,\n request_id,\n data: sanitizedData\n };\n\n\n \n\n\n this.worker.postMessage(message, transfer);\n \n this.listeners[request_id] = (response: T) => {\n resolve(response);\n };\n } catch (error) {\n reject(new Error('Failed to send message to worker: ' + error));\n }\n });\n }\n\n public terminate(): void {\n this.worker.terminate();\n this.listeners = {};\n }\n} \n\n\n\nfunction sanitizeForWorker(obj: GenericObject): GenericObject {\n // Handle null or primitive values\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n\n const special_types = [\n ArrayBuffer,\n Blob,\n EncodedVideoChunk,\n ImageBitmap,\n EncodedAudioChunk,\n OffscreenCanvas,\n Uint8Array,\n VideoFrame,\n FileSystemFileHandle,\n MessageChannel,\n MessagePort\n ]\n\n // Handle special cases\n\n for (const type of special_types) {\n if(obj instanceof type) {\n return obj;\n }\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map(item => sanitizeForWorker(item));\n }\n\n // Get raw object if it's a Vue Proxy\n const rawObj = obj && obj.__v_raw ? obj.__v_raw : obj;\n\n // Create a new object to store sanitized properties\n const sanitized: GenericObject = {};\n\n // Process each property\n for (const key in rawObj) {\n // Skip Vue internal properties\n if (key.startsWith('__v_')) {\n continue;\n }\n\n const value = rawObj[key];\n\n // Skip functions\n if (typeof value === 'function') {\n continue;\n }\n\n // Recursively sanitize nested objects\n sanitized[key ] = sanitizeForWorker(value);\n }\n\n return sanitized;\n}\n","var __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n __accessCheck(obj, member, \"read from private field\");\n return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n __accessCheck(obj, member, \"write to private field\");\n setter ? setter.call(obj, value) : member.set(obj, value);\n return value;\n};\nvar __privateWrapper = (obj, member, setter, getter) => ({\n set _(value) {\n __privateSet(obj, member, value, setter);\n },\n get _() {\n return __privateGet(obj, member, getter);\n }\n});\nvar __privateMethod = (obj, member, method) => {\n __accessCheck(obj, member, \"access private method\");\n return method;\n};\n\n// src/misc.ts\nvar bytes = new Uint8Array(8);\nvar view = new DataView(bytes.buffer);\nvar u8 = (value) => {\n return [(value % 256 + 256) % 256];\n};\nvar u16 = (value) => {\n view.setUint16(0, value, false);\n return [bytes[0], bytes[1]];\n};\nvar i16 = (value) => {\n view.setInt16(0, value, false);\n return [bytes[0], bytes[1]];\n};\nvar u24 = (value) => {\n view.setUint32(0, value, false);\n return [bytes[1], bytes[2], bytes[3]];\n};\nvar u32 = (value) => {\n view.setUint32(0, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar i32 = (value) => {\n view.setInt32(0, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar u64 = (value) => {\n view.setUint32(0, Math.floor(value / 2 ** 32), false);\n view.setUint32(4, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7]];\n};\nvar fixed_8_8 = (value) => {\n view.setInt16(0, 2 ** 8 * value, false);\n return [bytes[0], bytes[1]];\n};\nvar fixed_16_16 = (value) => {\n view.setInt32(0, 2 ** 16 * value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar fixed_2_30 = (value) => {\n view.setInt32(0, 2 ** 30 * value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar ascii = (text, nullTerminated = false) => {\n let bytes2 = Array(text.length).fill(null).map((_, i) => text.charCodeAt(i));\n if (nullTerminated)\n bytes2.push(0);\n return bytes2;\n};\nvar last = (arr) => {\n return arr && arr[arr.length - 1];\n};\nvar lastPresentedSample = (samples) => {\n let result = void 0;\n for (let sample of samples) {\n if (!result || sample.presentationTimestamp > result.presentationTimestamp) {\n result = sample;\n }\n }\n return result;\n};\nvar intoTimescale = (timeInSeconds, timescale, round = true) => {\n let value = timeInSeconds * timescale;\n return round ? Math.round(value) : value;\n};\nvar rotationMatrix = (rotationInDegrees) => {\n let theta = rotationInDegrees * (Math.PI / 180);\n let cosTheta = Math.cos(theta);\n let sinTheta = Math.sin(theta);\n return [\n cosTheta,\n sinTheta,\n 0,\n -sinTheta,\n cosTheta,\n 0,\n 0,\n 0,\n 1\n ];\n};\nvar IDENTITY_MATRIX = rotationMatrix(0);\nvar matrixToBytes = (matrix) => {\n return [\n fixed_16_16(matrix[0]),\n fixed_16_16(matrix[1]),\n fixed_2_30(matrix[2]),\n fixed_16_16(matrix[3]),\n fixed_16_16(matrix[4]),\n fixed_2_30(matrix[5]),\n fixed_16_16(matrix[6]),\n fixed_16_16(matrix[7]),\n fixed_2_30(matrix[8])\n ];\n};\nvar deepClone = (x) => {\n if (!x)\n return x;\n if (typeof x !== \"object\")\n return x;\n if (Array.isArray(x))\n return x.map(deepClone);\n return Object.fromEntries(Object.entries(x).map(([key, value]) => [key, deepClone(value)]));\n};\nvar isU32 = (value) => {\n return value >= 0 && value < 2 ** 32;\n};\n\n// src/box.ts\nvar box = (type, contents, children) => ({\n type,\n contents: contents && new Uint8Array(contents.flat(10)),\n children\n});\nvar fullBox = (type, version, flags, contents, children) => box(\n type,\n [u8(version), u24(flags), contents ?? []],\n children\n);\nvar ftyp = (details) => {\n let minorVersion = 512;\n if (details.fragmented)\n return box(\"ftyp\", [\n ascii(\"iso5\"),\n // Major brand\n u32(minorVersion),\n // Minor version\n // Compatible brands\n ascii(\"iso5\"),\n ascii(\"iso6\"),\n ascii(\"mp41\")\n ]);\n return box(\"ftyp\", [\n ascii(\"isom\"),\n // Major brand\n u32(minorVersion),\n // Minor version\n // Compatible brands\n ascii(\"isom\"),\n details.holdsAvc ? ascii(\"avc1\") : [],\n ascii(\"mp41\")\n ]);\n};\nvar mdat = (reserveLargeSize) => ({ type: \"mdat\", largeSize: reserveLargeSize });\nvar free = (size) => ({ type: \"free\", size });\nvar moov = (tracks, creationTime, fragmented = false) => box(\"moov\", null, [\n mvhd(creationTime, tracks),\n ...tracks.map((x) => trak(x, creationTime)),\n fragmented ? mvex(tracks) : null\n]);\nvar mvhd = (creationTime, tracks) => {\n let duration = intoTimescale(Math.max(\n 0,\n ...tracks.filter((x) => x.samples.length > 0).map((x) => {\n const lastSample = lastPresentedSample(x.samples);\n return lastSample.presentationTimestamp + lastSample.duration;\n })\n ), GLOBAL_TIMESCALE);\n let nextTrackId = Math.max(...tracks.map((x) => x.id)) + 1;\n let needsU64 = !isU32(creationTime) || !isU32(duration);\n let u32OrU64 = needsU64 ? u64 : u32;\n return fullBox(\"mvhd\", +needsU64, 0, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(GLOBAL_TIMESCALE),\n // Timescale\n u32OrU64(duration),\n // Duration\n fixed_16_16(1),\n // Preferred rate\n fixed_8_8(1),\n // Preferred volume\n Array(10).fill(0),\n // Reserved\n matrixToBytes(IDENTITY_MATRIX),\n // Matrix\n Array(24).fill(0),\n // Pre-defined\n u32(nextTrackId)\n // Next track ID\n ]);\n};\nvar trak = (track, creationTime) => box(\"trak\", null, [\n tkhd(track, creationTime),\n mdia(track, creationTime)\n]);\nvar tkhd = (track, creationTime) => {\n let lastSample = lastPresentedSample(track.samples);\n let durationInGlobalTimescale = intoTimescale(\n lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0,\n GLOBAL_TIMESCALE\n );\n let needsU64 = !isU32(creationTime) || !isU32(durationInGlobalTimescale);\n let u32OrU64 = needsU64 ? u64 : u32;\n let matrix;\n if (track.info.type === \"video\") {\n matrix = typeof track.info.rotation === \"number\" ? rotationMatrix(track.info.rotation) : track.info.rotation;\n } else {\n matrix = IDENTITY_MATRIX;\n }\n return fullBox(\"tkhd\", +needsU64, 3, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(track.id),\n // Track ID\n u32(0),\n // Reserved\n u32OrU64(durationInGlobalTimescale),\n // Duration\n Array(8).fill(0),\n // Reserved\n u16(0),\n // Layer\n u16(0),\n // Alternate group\n fixed_8_8(track.info.type === \"audio\" ? 1 : 0),\n // Volume\n u16(0),\n // Reserved\n matrixToBytes(matrix),\n // Matrix\n fixed_16_16(track.info.type === \"video\" ? track.info.width : 0),\n // Track width\n fixed_16_16(track.info.type === \"video\" ? track.info.height : 0)\n // Track height\n ]);\n};\nvar mdia = (track, creationTime) => box(\"mdia\", null, [\n mdhd(track, creationTime),\n hdlr(track.info.type === \"video\" ? \"vide\" : \"soun\"),\n minf(track)\n]);\nvar mdhd = (track, creationTime) => {\n let lastSample = lastPresentedSample(track.samples);\n let localDuration = intoTimescale(\n lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0,\n track.timescale\n );\n let needsU64 = !isU32(creationTime) || !isU32(localDuration);\n let u32OrU64 = needsU64 ? u64 : u32;\n return fullBox(\"mdhd\", +needsU64, 0, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(track.timescale),\n // Timescale\n u32OrU64(localDuration),\n // Duration\n u16(21956),\n // Language (\"und\", undetermined)\n u16(0)\n // Quality\n ]);\n};\nvar hdlr = (componentSubtype) => fullBox(\"hdlr\", 0, 0, [\n ascii(\"mhlr\"),\n // Component type\n ascii(componentSubtype),\n // Component subtype\n u32(0),\n // Component manufacturer\n u32(0),\n // Component flags\n u32(0),\n // Component flags mask\n ascii(\"mp4-muxer-hdlr\", true)\n // Component name\n]);\nvar minf = (track) => box(\"minf\", null, [\n track.info.type === \"video\" ? vmhd() : smhd(),\n dinf(),\n stbl(track)\n]);\nvar vmhd = () => fullBox(\"vmhd\", 0, 1, [\n u16(0),\n // Graphics mode\n u16(0),\n // Opcolor R\n u16(0),\n // Opcolor G\n u16(0)\n // Opcolor B\n]);\nvar smhd = () => fullBox(\"smhd\", 0, 0, [\n u16(0),\n // Balance\n u16(0)\n // Reserved\n]);\nvar dinf = () => box(\"dinf\", null, [\n dref()\n]);\nvar dref = () => fullBox(\"dref\", 0, 0, [\n u32(1)\n // Entry count\n], [\n url()\n]);\nvar url = () => fullBox(\"url \", 0, 1);\nvar stbl = (track) => {\n const needsCtts = track.compositionTimeOffsetTable.length > 1 || track.compositionTimeOffsetTable.some((x) => x.sampleCompositionTimeOffset !== 0);\n return box(\"stbl\", null, [\n stsd(track),\n stts(track),\n stss(track),\n stsc(track),\n stsz(track),\n stco(track),\n needsCtts ? ctts(track) : null\n ]);\n};\nvar stsd = (track) => fullBox(\"stsd\", 0, 0, [\n u32(1)\n // Entry count\n], [\n track.info.type === \"video\" ? videoSampleDescription(\n VIDEO_CODEC_TO_BOX_NAME[track.info.codec],\n track\n ) : soundSampleDescription(\n AUDIO_CODEC_TO_BOX_NAME[track.info.codec],\n track\n )\n]);\nvar videoSampleDescription = (compressionType, track) => box(compressionType, [\n Array(6).fill(0),\n // Reserved\n u16(1),\n // Data reference index\n u16(0),\n // Pre-defined\n u16(0),\n // Reserved\n Array(12).fill(0),\n // Pre-defined\n u16(track.info.width),\n // Width\n u16(track.info.height),\n // Height\n u32(4718592),\n // Horizontal resolution\n u32(4718592),\n // Vertical resolution\n u32(0),\n // Reserved\n u16(1),\n // Frame count\n Array(32).fill(0),\n // Compressor name\n u16(24),\n // Depth\n i16(65535)\n // Pre-defined\n], [\n VIDEO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track),\n track.info.decoderConfig.colorSpace ? colr(track) : null\n]);\nvar COLOR_PRIMARIES_MAP = {\n \"bt709\": 1,\n // ITU-R BT.709\n \"bt470bg\": 5,\n // ITU-R BT.470BG\n \"smpte170m\": 6\n // ITU-R BT.601 525 - SMPTE 170M\n};\nvar TRANSFER_CHARACTERISTICS_MAP = {\n \"bt709\": 1,\n // ITU-R BT.709\n \"smpte170m\": 6,\n // SMPTE 170M\n \"iec61966-2-1\": 13\n // IEC 61966-2-1\n};\nvar MATRIX_COEFFICIENTS_MAP = {\n \"rgb\": 0,\n // Identity\n \"bt709\": 1,\n // ITU-R BT.709\n \"bt470bg\": 5,\n // ITU-R BT.470BG\n \"smpte170m\": 6\n // SMPTE 170M\n};\nvar colr = (track) => box(\"colr\", [\n ascii(\"nclx\"),\n // Colour type\n u16(COLOR_PRIMARIES_MAP[track.info.decoderConfig.colorSpace.primaries]),\n // Colour primaries\n u16(TRANSFER_CHARACTERISTICS_MAP[track.info.decoderConfig.colorSpace.transfer]),\n // Transfer characteristics\n u16(MATRIX_COEFFICIENTS_MAP[track.info.decoderConfig.colorSpace.matrix]),\n // Matrix coefficients\n u8((track.info.decoderConfig.colorSpace.fullRange ? 1 : 0) << 7)\n // Full range flag\n]);\nvar avcC = (track) => track.info.decoderConfig && box(\"avcC\", [\n // For AVC, description is an AVCDecoderConfigurationRecord, so nothing else to do here\n ...new Uint8Array(track.info.decoderConfig.description)\n]);\nvar hvcC = (track) => track.info.decoderConfig && box(\"hvcC\", [\n // For HEVC, description is a HEVCDecoderConfigurationRecord, so nothing else to do here\n ...new Uint8Array(track.info.decoderConfig.description)\n]);\nvar vpcC = (track) => {\n if (!track.info.decoderConfig) {\n return null;\n }\n let decoderConfig = track.info.decoderConfig;\n if (!decoderConfig.colorSpace) {\n throw new Error(`'colorSpace' is required in the decoder config for VP9.`);\n }\n let parts = decoderConfig.codec.split(\".\");\n let profile = Number(parts[1]);\n let level = Number(parts[2]);\n let bitDepth = Number(parts[3]);\n let chromaSubsampling = 0;\n let thirdByte = (bitDepth << 4) + (chromaSubsampling << 1) + Number(decoderConfig.colorSpace.fullRange);\n let colourPrimaries = 2;\n let transferCharacteristics = 2;\n let matrixCoefficients = 2;\n return fullBox(\"vpcC\", 1, 0, [\n u8(profile),\n // Profile\n u8(level),\n // Level\n u8(thirdByte),\n // Bit depth, chroma subsampling, full range\n u8(colourPrimaries),\n // Colour primaries\n u8(transferCharacteristics),\n // Transfer characteristics\n u8(matrixCoefficients),\n // Matrix coefficients\n u16(0)\n // Codec initialization data size\n ]);\n};\nvar av1C = () => {\n let marker = 1;\n let version = 1;\n let firstByte = (marker << 7) + version;\n return box(\"av1C\", [\n firstByte,\n 0,\n 0,\n 0\n ]);\n};\nvar soundSampleDescription = (compressionType, track) => box(compressionType, [\n Array(6).fill(0),\n // Reserved\n u16(1),\n // Data reference index\n u16(0),\n // Version\n u16(0),\n // Revision level\n u32(0),\n // Vendor\n u16(track.info.numberOfChannels),\n // Number of channels\n u16(16),\n // Sample size (bits)\n u16(0),\n // Compression ID\n u16(0),\n // Packet size\n fixed_16_16(track.info.sampleRate)\n // Sample rate\n], [\n AUDIO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track)\n]);\nvar esds = (track) => {\n let description = new Uint8Array(track.info.decoderConfig.description);\n return fullBox(\"esds\", 0, 0, [\n // https://stackoverflow.com/a/54803118\n u32(58753152),\n // TAG(3) = Object Descriptor ([2])\n u8(32 + description.byteLength),\n // length of this OD (which includes the next 2 tags)\n u16(1),\n // ES_ID = 1\n u8(0),\n // flags etc = 0\n u32(75530368),\n // TAG(4) = ES Descriptor ([2]) embedded in above OD\n u8(18 + description.byteLength),\n // length of this ESD\n u8(64),\n // MPEG-4 Audio\n u8(21),\n // stream type(6bits)=5 audio, flags(2bits)=1\n u24(0),\n // 24bit buffer size\n u32(130071),\n // max bitrate\n u32(130071),\n // avg bitrate\n u32(92307584),\n // TAG(5) = ASC ([2],[3]) embedded in above OD\n u8(description.byteLength),\n // length\n ...description,\n u32(109084800),\n // TAG(6)\n u8(1),\n // length\n u8(2)\n // data\n ]);\n};\nvar dOps = (track) => {\n let preskip = 3840;\n let gain = 0;\n const description = track.info.decoderConfig?.description;\n if (description) {\n if (description.byteLength < 18) {\n throw new TypeError(\"Invalid decoder description provided for Opus; must be at least 18 bytes long.\");\n }\n const view2 = ArrayBuffer.isView(description) ? new DataView(description.buffer, description.byteOffset, description.byteLength) : new DataView(description);\n preskip = view2.getUint16(10, true);\n gain = view2.getInt16(14, true);\n }\n return box(\"dOps\", [\n u8(0),\n // Version\n u8(track.info.numberOfChannels),\n // OutputChannelCount\n u16(preskip),\n u32(track.info.sampleRate),\n // InputSampleRate\n fixed_8_8(gain),\n // OutputGain\n u8(0)\n // ChannelMappingFamily\n ]);\n};\nvar stts = (track) => {\n return fullBox(\"stts\", 0, 0, [\n u32(track.timeToSampleTable.length),\n // Number of entries\n track.timeToSampleTable.map((x) => [\n // Time-to-sample table\n u32(x.sampleCount),\n // Sample count\n u32(x.sampleDelta)\n // Sample duration\n ])\n ]);\n};\nvar stss = (track) => {\n if (track.samples.every((x) => x.type === \"key\"))\n return null;\n let keySamples = [...track.samples.entries()].filter(([, sample]) => sample.type === \"key\");\n return fullBox(\"stss\", 0, 0, [\n u32(keySamples.length),\n // Number of entries\n keySamples.map(([index]) => u32(index + 1))\n // Sync sample table\n ]);\n};\nvar stsc = (track) => {\n return fullBox(\"stsc\", 0, 0, [\n u32(track.compactlyCodedChunkTable.length),\n // Number of entries\n track.compactlyCodedChunkTable.map((x) => [\n // Sample-to-chunk table\n u32(x.firstChunk),\n // First chunk\n u32(x.samplesPerChunk),\n // Samples per chunk\n u32(1)\n // Sample description index\n ])\n ]);\n};\nvar stsz = (track) => fullBox(\"stsz\", 0, 0, [\n u32(0),\n // Sample size (0 means non-constant size)\n u32(track.samples.length),\n // Number of entries\n track.samples.map((x) => u32(x.size))\n // Sample size table\n]);\nvar stco = (track) => {\n if (track.finalizedChunks.length > 0 && last(track.finalizedChunks).offset >= 2 ** 32) {\n return fullBox(\"co64\", 0, 0, [\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((x) => u64(x.offset))\n // Chunk offset table\n ]);\n }\n return fullBox(\"stco\", 0, 0, [\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((x) => u32(x.offset))\n // Chunk offset table\n ]);\n};\nvar ctts = (track) => {\n return fullBox(\"ctts\", 0, 0, [\n u32(track.compositionTimeOffsetTable.length),\n // Number of entries\n track.compositionTimeOffsetTable.map((x) => [\n // Time-to-sample table\n u32(x.sampleCount),\n // Sample count\n u32(x.sampleCompositionTimeOffset)\n // Sample offset\n ])\n ]);\n};\nvar mvex = (tracks) => {\n return box(\"mvex\", null, tracks.map(trex));\n};\nvar trex = (track) => {\n return fullBox(\"trex\", 0, 0, [\n u32(track.id),\n // Track ID\n u32(1),\n // Default sample description index\n u32(0),\n // Default sample duration\n u32(0),\n // Default sample size\n u32(0)\n // Default sample flags\n ]);\n};\nvar moof = (sequenceNumber, tracks) => {\n return box(\"moof\", null, [\n mfhd(sequenceNumber),\n ...tracks.map(traf)\n ]);\n};\nvar mfhd = (sequenceNumber) => {\n return fullBox(\"mfhd\", 0, 0, [\n u32(sequenceNumber)\n // Sequence number\n ]);\n};\nvar fragmentSampleFlags = (sample) => {\n let byte1 = 0;\n let byte2 = 0;\n let byte3 = 0;\n let byte4 = 0;\n let sampleIsDifferenceSample = sample.type === \"delta\";\n byte2 |= +sampleIsDifferenceSample;\n if (sampleIsDifferenceSample) {\n byte1 |= 1;\n } else {\n byte1 |= 2;\n }\n return byte1 << 24 | byte2 << 16 | byte3 << 8 | byte4;\n};\nvar traf = (track) => {\n return box(\"traf\", null, [\n tfhd(track),\n tfdt(track),\n trun(track)\n ]);\n};\nvar tfhd = (track) => {\n let tfFlags = 0;\n tfFlags |= 8;\n tfFlags |= 16;\n tfFlags |= 32;\n tfFlags |= 131072;\n let referenceSample = track.currentChunk.samples[1] ?? track.currentChunk.samples[0];\n let referenceSampleInfo = {\n duration: referenceSample.timescaleUnitsToNextSample,\n size: referenceSample.size,\n flags: fragmentSampleFlags(referenceSample)\n };\n return fullBox(\"tfhd\", 0, tfFlags, [\n u32(track.id),\n // Track ID\n u32(referenceSampleInfo.duration),\n // Default sample duration\n u32(referenceSampleInfo.size),\n // Default sample size\n u32(referenceSampleInfo.flags)\n // Default sample flags\n ]);\n};\nvar tfdt = (track) => {\n return fullBox(\"tfdt\", 1, 0, [\n u64(intoTimescale(track.currentChunk.startTimestamp, track.timescale))\n // Base Media Decode Time\n ]);\n};\nvar trun = (track) => {\n let allSampleDurations = track.currentChunk.samples.map((x) => x.timescaleUnitsToNextSample);\n let allSampleSizes = track.currentChunk.samples.map((x) => x.size);\n let allSampleFlags = track.currentChunk.samples.map(fragmentSampleFlags);\n let allSampleCompositionTimeOffsets = track.currentChunk.samples.map((x) => intoTimescale(x.presentationTimestamp - x.decodeTimestamp, track.timescale));\n let uniqueSampleDurations = new Set(allSampleDurations);\n let uniqueSampleSizes = new Set(allSampleSizes);\n let uniqueSampleFlags = new Set(allSampleFlags);\n let uniqueSampleCompositionTimeOffsets = new Set(allSampleCompositionTimeOffsets);\n let firstSampleFlagsPresent = uniqueSampleFlags.size === 2 && allSampleFlags[0] !== allSampleFlags[1];\n let sampleDurationPresent = uniqueSampleDurations.size > 1;\n let sampleSizePresent = uniqueSampleSizes.size > 1;\n let sampleFlagsPresent = !firstSampleFlagsPresent && uniqueSampleFlags.size > 1;\n let sampleCompositionTimeOffsetsPresent = uniqueSampleCompositionTimeOffsets.size > 1 || [...uniqueSampleCompositionTimeOffsets].some((x) => x !== 0);\n let flags = 0;\n flags |= 1;\n flags |= 4 * +firstSampleFlagsPresent;\n flags |= 256 * +sampleDurationPresent;\n flags |= 512 * +sampleSizePresent;\n flags |= 1024 * +sampleFlagsPresent;\n flags |= 2048 * +sampleCompositionTimeOffsetsPresent;\n return fullBox(\"trun\", 1, flags, [\n u32(track.currentChunk.samples.length),\n // Sample count\n u32(track.currentChunk.offset - track.currentChunk.moofOffset || 0),\n // Data offset\n firstSampleFlagsPresent ? u32(allSampleFlags[0]) : [],\n track.currentChunk.samples.map((_, i) => [\n sampleDurationPresent ? u32(allSampleDurations[i]) : [],\n // Sample duration\n sampleSizePresent ? u32(allSampleSizes[i]) : [],\n // Sample size\n sampleFlagsPresent ? u32(allSampleFlags[i]) : [],\n // Sample flags\n // Sample composition time offsets\n sampleCompositionTimeOffsetsPresent ? i32(allSampleCompositionTimeOffsets[i]) : []\n ])\n ]);\n};\nvar mfra = (tracks) => {\n return box(\"mfra\", null, [\n ...tracks.map(tfra),\n mfro()\n ]);\n};\nvar tfra = (track, trackIndex) => {\n let version = 1;\n return fullBox(\"tfra\", version, 0, [\n u32(track.id),\n // Track ID\n u32(63),\n // This specifies that traf number, trun number and sample number are 32-bit ints\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((chunk) => [\n u64(intoTimescale(chunk.startTimestamp, track.timescale)),\n // Time\n u64(chunk.moofOffset),\n // moof offset\n u32(trackIndex + 1),\n // traf number\n u32(1),\n // trun number\n u32(1)\n // Sample number\n ])\n ]);\n};\nvar mfro = () => {\n return fullBox(\"mfro\", 0, 0, [\n // This value needs to be overwritten manually from the outside, where the actual size of the enclosing mfra box\n // is known\n u32(0)\n // Size\n ]);\n};\nvar VIDEO_CODEC_TO_BOX_NAME = {\n \"avc\": \"avc1\",\n \"hevc\": \"hvc1\",\n \"vp9\": \"vp09\",\n \"av1\": \"av01\"\n};\nvar VIDEO_CODEC_TO_CONFIGURATION_BOX = {\n \"avc\": avcC,\n \"hevc\": hvcC,\n \"vp9\": vpcC,\n \"av1\": av1C\n};\nvar AUDIO_CODEC_TO_BOX_NAME = {\n \"aac\": \"mp4a\",\n \"opus\": \"Opus\"\n};\nvar AUDIO_CODEC_TO_CONFIGURATION_BOX = {\n \"aac\": esds,\n \"opus\": dOps\n};\n\n// src/target.ts\nvar isTarget = Symbol(\"isTarget\");\nvar Target = class {\n};\nisTarget;\nvar ArrayBufferTarget = class extends Target {\n constructor() {\n super(...arguments);\n this.buffer = null;\n }\n};\nvar StreamTarget = class extends Target {\n constructor(options) {\n super();\n this.options = options;\n if (typeof options !== \"object\") {\n throw new TypeError(\"StreamTarget requires an options object to be passed to its constructor.\");\n }\n if (options.onData) {\n if (typeof options.onData !== \"function\") {\n throw new TypeError(\"options.onData, when provided, must be a function.\");\n }\n if (options.onData.length < 2) {\n throw new TypeError(\n \"options.onData, when provided, must be a function that takes in at least two arguments (data and position). Ignoring the position argument, which specifies the byte offset at which the data is to be written, can lead to broken outputs.\"\n );\n }\n }\n if (options.chunked !== void 0 && typeof options.chunked !== \"boolean\") {\n throw new TypeError(\"options.chunked, when provided, must be a boolean.\");\n }\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize < 1024)) {\n throw new TypeError(\"options.chunkSize, when provided, must be an integer and not smaller than 1024.\");\n }\n }\n};\nvar FileSystemWritableFileStreamTarget = class extends Target {\n constructor(stream, options) {\n super();\n this.stream = stream;\n this.options = options;\n if (!(stream instanceof FileSystemWritableFileStream)) {\n throw new TypeError(\"FileSystemWritableFileStreamTarget requires a FileSystemWritableFileStream instance.\");\n }\n if (options !== void 0 && typeof options !== \"object\") {\n throw new TypeError(\"FileSystemWritableFileStreamTarget's options, when provided, must be an object.\");\n }\n if (options) {\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize <= 0)) {\n throw new TypeError(\"options.chunkSize, when provided, must be a positive integer\");\n }\n }\n }\n};\n\n// src/writer.ts\nvar _helper, _helperView;\nvar Writer = class {\n constructor() {\n this.pos = 0;\n __privateAdd(this, _helper, new Uint8Array(8));\n __privateAdd(this, _helperView, new DataView(__privateGet(this, _helper).buffer));\n /**\n * Stores the position from the start of the file to where boxes elements have been written. This is used to\n * rewrite/edit elements that were already added before, and to measure sizes of things.\n */\n this.offsets = /* @__PURE__ */ new WeakMap();\n }\n /** Sets the current position for future writes to a new one. */\n seek(newPos) {\n this.pos = newPos;\n }\n writeU32(value) {\n __privateGet(this, _helperView).setUint32(0, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 4));\n }\n writeU64(value) {\n __privateGet(this, _helperView).setUint32(0, Math.floor(value / 2 ** 32), false);\n __privateGet(this, _helperView).setUint32(4, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 8));\n }\n writeAscii(text) {\n for (let i = 0; i < text.length; i++) {\n __privateGet(this, _helperView).setUint8(i % 8, text.charCodeAt(i));\n if (i % 8 === 7)\n this.write(__privateGet(this, _helper));\n }\n if (text.length % 8 !== 0) {\n this.write(__privateGet(this, _helper).subarray(0, text.length % 8));\n }\n }\n writeBox(box2) {\n this.offsets.set(box2, this.pos);\n if (box2.contents && !box2.children) {\n this.writeBoxHeader(box2, box2.size ?? box2.contents.byteLength + 8);\n this.write(box2.contents);\n } else {\n let startPos = this.pos;\n this.writeBoxHeader(box2, 0);\n if (box2.contents)\n this.write(box2.contents);\n if (box2.children) {\n for (let child of box2.children)\n if (child)\n this.writeBox(child);\n }\n let endPos = this.pos;\n let size = box2.size ?? endPos - startPos;\n this.seek(startPos);\n this.writeBoxHeader(box2, size);\n this.seek(endPos);\n }\n }\n writeBoxHeader(box2, size) {\n this.writeU32(box2.largeSize ? 1 : size);\n this.writeAscii(box2.type);\n if (box2.largeSize)\n this.writeU64(size);\n }\n measureBoxHeader(box2) {\n return 8 + (box2.largeSize ? 8 : 0);\n }\n patchBox(box2) {\n let endPos = this.pos;\n this.seek(this.offsets.get(box2));\n this.writeBox(box2);\n this.seek(endPos);\n }\n measureBox(box2) {\n if (box2.contents && !box2.children) {\n let headerSize = this.measureBoxHeader(box2);\n return headerSize + box2.contents.byteLength;\n } else {\n let result = this.measureBoxHeader(box2);\n if (box2.contents)\n result += box2.contents.byteLength;\n if (box2.children) {\n for (let child of box2.children)\n if (child)\n result += this.measureBox(child);\n }\n return result;\n }\n }\n};\n_helper = new WeakMap();\n_helperView = new WeakMap();\nvar _target, _buffer, _bytes, _maxPos, _ensureSize, ensureSize_fn;\nvar ArrayBufferTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _ensureSize);\n __privateAdd(this, _target, void 0);\n __privateAdd(this, _buffer, new ArrayBuffer(2 ** 16));\n __privateAdd(this, _bytes, new Uint8Array(__privateGet(this, _buffer)));\n __privateAdd(this, _maxPos, 0);\n __privateSet(this, _target, target);\n }\n write(data) {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos + data.byteLength);\n __privateGet(this, _bytes).set(data, this.pos);\n this.pos += data.byteLength;\n __privateSet(this, _maxPos, Math.max(__privateGet(this, _maxPos), this.pos));\n }\n finalize() {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos);\n __privateGet(this, _target).buffer = __privateGet(this, _buffer).slice(0, Math.max(__privateGet(this, _maxPos), this.pos));\n }\n};\n_target = new WeakMap();\n_buffer = new WeakMap();\n_bytes = new WeakMap();\n_maxPos = new WeakMap();\n_ensureSize = new WeakSet();\nensureSize_fn = function(size) {\n let newLength = __privateGet(this, _buffer).byteLength;\n while (newLength < size)\n newLength *= 2;\n if (newLength === __privateGet(this, _buffer).byteLength)\n return;\n let newBuffer = new ArrayBuffer(newLength);\n let newBytes = new Uint8Array(newBuffer);\n newBytes.set(__privateGet(this, _bytes), 0);\n __privateSet(this, _buffer, newBuffer);\n __privateSet(this, _bytes, newBytes);\n};\nvar DEFAULT_CHUNK_SIZE = 2 ** 24;\nvar MAX_CHUNKS_AT_ONCE = 2;\nvar _target2, _sections, _chunked, _chunkSize, _chunks, _writeDataIntoChunks, writeDataIntoChunks_fn, _insertSectionIntoChunk, insertSectionIntoChunk_fn, _createChunk, createChunk_fn, _flushChunks, flushChunks_fn;\nvar StreamTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _writeDataIntoChunks);\n __privateAdd(this, _insertSectionIntoChunk);\n __privateAdd(this, _createChunk);\n __privateAdd(this, _flushChunks);\n __privateAdd(this, _target2, void 0);\n __privateAdd(this, _sections, []);\n __privateAdd(this, _chunked, void 0);\n __privateAdd(this, _chunkSize, void 0);\n /**\n * The data is divided up into fixed-size chunks, whose contents are first filled in RAM and then flushed out.\n * A chunk is flushed if all of its contents have been written.\n */\n __privateAdd(this, _chunks, []);\n __privateSet(this, _target2, target);\n __privateSet(this, _chunked, target.options?.chunked ?? false);\n __privateSet(this, _chunkSize, target.options?.chunkSize ?? DEFAULT_CHUNK_SIZE);\n }\n write(data) {\n __privateGet(this, _sections).push({\n data: data.slice(),\n start: this.pos\n });\n this.pos += data.byteLength;\n }\n flush() {\n if (__privateGet(this, _sections).length === 0)\n return;\n let chunks = [];\n let sorted = [...__privateGet(this, _sections)].sort((a, b) => a.start - b.start);\n chunks.push({\n start: sorted[0].start,\n size: sorted[0].data.byteLength\n });\n for (let i = 1; i < sorted.length; i++) {\n let lastChunk = chunks[chunks.length - 1];\n let section = sorted[i];\n if (section.start <= lastChunk.start + lastChunk.size) {\n lastChunk.size = Math.max(lastChunk.size, section.start + section.data.byteLength - lastChunk.start);\n } else {\n chunks.push({\n start: section.start,\n size: section.data.byteLength\n });\n }\n }\n for (let chunk of chunks) {\n chunk.data = new Uint8Array(chunk.size);\n for (let section of __privateGet(this, _sections)) {\n if (chunk.start <= section.start && section.start < chunk.start + chunk.size) {\n chunk.data.set(section.data, section.start - chunk.start);\n }\n }\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, chunk.data, chunk.start);\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n } else {\n __privateGet(this, _target2).options.onData?.(chunk.data, chunk.start);\n }\n }\n __privateGet(this, _sections).length = 0;\n }\n finalize() {\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this, true);\n }\n }\n};\n_target2 = new WeakMap();\n_sections = new WeakMap();\n_chunked = new WeakMap();\n_chunkSize = new WeakMap();\n_chunks = new WeakMap();\n_writeDataIntoChunks = new WeakSet();\nwriteDataIntoChunks_fn = function(data, position) {\n let chunkIndex = __privateGet(this, _chunks).findIndex((x) => x.start <= position && position < x.start + __privateGet(this, _chunkSize));\n if (chunkIndex === -1)\n chunkIndex = __privateMethod(this, _createChunk, createChunk_fn).call(this, position);\n let chunk = __privateGet(this, _chunks)[chunkIndex];\n let relativePosition = position - chunk.start;\n let toWrite = data.subarray(0, Math.min(__privateGet(this, _chunkSize) - relativePosition, data.byteLength));\n chunk.data.set(toWrite, relativePosition);\n let section = {\n start: relativePosition,\n end: relativePosition + toWrite.byteLength\n };\n __privateMethod(this, _insertSectionIntoChunk, insertSectionIntoChunk_fn).call(this, chunk, section);\n if (chunk.written[0].start === 0 && chunk.written[0].end === __privateGet(this, _chunkSize)) {\n chunk.shouldFlush = true;\n }\n if (__privateGet(this, _chunks).length > MAX_CHUNKS_AT_ONCE) {\n for (let i = 0; i < __privateGet(this, _chunks).length - 1; i++) {\n __privateGet(this, _chunks)[i].shouldFlush = true;\n }\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n }\n if (toWrite.byteLength < data.byteLength) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, data.subarray(toWrite.byteLength), position + toWrite.byteLength);\n }\n};\n_insertSectionIntoChunk = new WeakSet();\ninsertSectionIntoChunk_fn = function(chunk, section) {\n let low = 0;\n let high = chunk.written.length - 1;\n let index = -1;\n while (low <= high) {\n let mid = Math.floor(low + (high - low + 1) / 2);\n if (chunk.written[mid].start <= section.start) {\n low = mid + 1;\n index = mid;\n } else {\n high = mid - 1;\n }\n }\n chunk.written.splice(index + 1, 0, section);\n if (index === -1 || chunk.written[index].end < section.start)\n index++;\n while (index < chunk.written.length - 1 && chunk.written[index].end >= chunk.written[index + 1].start) {\n chunk.written[index].end = Math.max(chunk.written[index].end, chunk.written[index + 1].end);\n chunk.written.splice(index + 1, 1);\n }\n};\n_createChunk = new WeakSet();\ncreateChunk_fn = function(includesPosition) {\n let start = Math.floor(includesPosition / __privateGet(this, _chunkSize)) * __privateGet(this, _chunkSize);\n let chunk = {\n start,\n data: new Uint8Array(__privateGet(this, _chunkSize)),\n written: [],\n shouldFlush: false\n };\n __privateGet(this, _chunks).push(chunk);\n __privateGet(this, _chunks).sort((a, b) => a.start - b.start);\n return __privateGet(this, _chunks).indexOf(chunk);\n};\n_flushChunks = new WeakSet();\nflushChunks_fn = function(force = false) {\n for (let i = 0; i < __privateGet(this, _chunks).length; i++) {\n let chunk = __privateGet(this, _chunks)[i];\n if (!chunk.shouldFlush && !force)\n continue;\n for (let section of chunk.written) {\n __privateGet(this, _target2).options.onData?.(\n chunk.data.subarray(section.start, section.end),\n chunk.start + section.start\n );\n }\n __privateGet(this, _chunks).splice(i--, 1);\n }\n};\nvar FileSystemWritableFileStreamTargetWriter = class extends StreamTargetWriter {\n constructor(target) {\n super(new StreamTarget({\n onData: (data, position) => target.stream.write({\n type: \"write\",\n data,\n position\n }),\n chunked: true,\n chunkSize: target.options?.chunkSize\n }));\n }\n};\n\n// src/muxer.ts\nvar GLOBAL_TIMESCALE = 1e3;\nvar SUPPORTED_VIDEO_CODECS = [\"avc\", \"hevc\", \"vp9\", \"av1\"];\nvar SUPPORTED_AUDIO_CODECS = [\"aac\", \"opus\"];\nvar TIMESTAMP_OFFSET = 2082844800;\nvar FIRST_TIMESTAMP_BEHAVIORS = [\"strict\", \"offset\", \"cross-track-offset\"];\nvar _options, _writer, _ftypSize, _mdat, _videoTrack, _audioTrack, _creationTime, _finalizedChunks, _nextFragmentNumber, _videoSampleQueue, _audioSampleQueue, _finalized, _validateOptions, validateOptions_fn, _writeHeader, writeHeader_fn, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn, _prepareTracks, prepareTracks_fn, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn, _createSampleForTrack, createSampleForTrack_fn, _addSampleToTrack, addSampleToTrack_fn, _validateTimestamp, validateTimestamp_fn, _finalizeCurrentChunk, finalizeCurrentChunk_fn, _finalizeFragment, finalizeFragment_fn, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn, _ensureNotFinalized, ensureNotFinalized_fn;\nvar Muxer = class {\n constructor(options) {\n __privateAdd(this, _validateOptions);\n __privateAdd(this, _writeHeader);\n __privateAdd(this, _computeMoovSizeUpperBound);\n __privateAdd(this, _prepareTracks);\n // https://wiki.multimedia.cx/index.php/MPEG-4_Audio\n __privateAdd(this, _generateMpeg4AudioSpecificConfig);\n __privateAdd(this, _createSampleForTrack);\n __privateAdd(this, _addSampleToTrack);\n __privateAdd(this, _validateTimestamp);\n __privateAdd(this, _finalizeCurrentChunk);\n __privateAdd(this, _finalizeFragment);\n __privateAdd(this, _maybeFlushStreamingTargetWriter);\n __privateAdd(this, _ensureNotFinalized);\n __privateAdd(this, _options, void 0);\n __privateAdd(this, _writer, void 0);\n __privateAdd(this, _ftypSize, void 0);\n __privateAdd(this, _mdat, void 0);\n __privateAdd(this, _videoTrack, null);\n __privateAdd(this, _audioTrack, null);\n __privateAdd(this, _creationTime, Math.floor(Date.now() / 1e3) + TIMESTAMP_OFFSET);\n __privateAdd(this, _finalizedChunks, []);\n // Fields for fragmented MP4:\n __privateAdd(this, _nextFragmentNumber, 1);\n __privateAdd(this, _videoSampleQueue, []);\n __privateAdd(this, _audioSampleQueue, []);\n __privateAdd(this, _finalized, false);\n __privateMethod(this, _validateOptions, validateOptions_fn).call(this, options);\n options.video = deepClone(options.video);\n options.audio = deepClone(options.audio);\n options.fastStart = deepClone(options.fastStart);\n this.target = options.target;\n __privateSet(this, _options, {\n firstTimestampBehavior: \"strict\",\n ...options\n });\n if (options.target instanceof ArrayBufferTarget) {\n __privateSet(this, _writer, new ArrayBufferTargetWriter(options.target));\n } else if (options.target instanceof StreamTarget) {\n __privateSet(this, _writer, new StreamTargetWriter(options.target));\n } else if (options.target instanceof FileSystemWritableFileStreamTarget) {\n __privateSet(this, _writer, new FileSystemWritableFileStreamTargetWriter(options.target));\n } else {\n throw new Error(`Invalid target: ${options.target}`);\n }\n __privateMethod(this, _prepareTracks, prepareTracks_fn).call(this);\n __privateMethod(this, _writeHeader, writeHeader_fn).call(this);\n }\n addVideoChunk(sample, meta, timestamp, compositionTimeOffset) {\n if (!(sample instanceof EncodedVideoChunk)) {\n throw new TypeError(\"addVideoChunk's first argument (sample) must be of type EncodedVideoChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addVideoChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n if (compositionTimeOffset !== void 0 && !Number.isFinite(compositionTimeOffset)) {\n throw new TypeError(\n \"addVideoChunk's fourth argument (compositionTimeOffset), when provided, must be a real number.\"\n );\n }\n let data = new Uint8Array(sample.byteLength);\n sample.copyTo(data);\n this.addVideoChunkRaw(\n data,\n sample.type,\n timestamp ?? sample.timestamp,\n sample.duration,\n meta,\n compositionTimeOffset\n );\n }\n addVideoChunkRaw(data, type, timestamp, duration, meta, compositionTimeOffset) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addVideoChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addVideoChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addVideoChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError(\"addVideoChunkRaw's fourth argument (duration) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunkRaw's fifth argument (meta), when provided, must be an object.\");\n }\n if (compositionTimeOffset !== void 0 && !Number.isFinite(compositionTimeOffset)) {\n throw new TypeError(\n \"addVideoChunkRaw's sixth argument (compositionTimeOffset), when provided, must be a real number.\"\n );\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).video)\n throw new Error(\"No video track declared.\");\n if (typeof __privateGet(this, _options).fastStart === \"object\" && __privateGet(this, _videoTrack).samples.length === __privateGet(this, _options).fastStart.expectedVideoChunks) {\n throw new Error(`Cannot add more video chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedVideoChunks}).`);\n }\n let videoSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _videoTrack), data, type, timestamp, duration, meta, compositionTimeOffset);\n if (__privateGet(this, _options).fastStart === \"fragmented\" && __privateGet(this, _audioTrack)) {\n while (__privateGet(this, _audioSampleQueue).length > 0 && __privateGet(this, _audioSampleQueue)[0].decodeTimestamp <= videoSample.decodeTimestamp) {\n let audioSample = __privateGet(this, _audioSampleQueue).shift();\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n }\n if (videoSample.decodeTimestamp <= __privateGet(this, _audioTrack).lastDecodeTimestamp) {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n } else {\n __privateGet(this, _videoSampleQueue).push(videoSample);\n }\n } else {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n }\n }\n addAudioChunk(sample, meta, timestamp) {\n if (!(sample instanceof EncodedAudioChunk)) {\n throw new TypeError(\"addAudioChunk's first argument (sample) must be of type EncodedAudioChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addAudioChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n let data = new Uint8Array(sample.byteLength);\n sample.copyTo(data);\n this.addAudioChunkRaw(data, sample.type, timestamp ?? sample.timestamp, sample.duration, meta);\n }\n addAudioChunkRaw(data, type, timestamp, duration, meta) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addAudioChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addAudioChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addAudioChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError(\"addAudioChunkRaw's fourth argument (duration) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunkRaw's fifth argument (meta), when provided, must be an object.\");\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).audio)\n throw new Error(\"No audio track declared.\");\n if (typeof __privateGet(this, _options).fastStart === \"object\" && __privateGet(this, _audioTrack).samples.length === __privateGet(this, _options).fastStart.expectedAudioChunks) {\n throw new Error(`Cannot add more audio chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedAudioChunks}).`);\n }\n let audioSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _audioTrack), data, type, timestamp, duration, meta);\n if (__privateGet(this, _options).fastStart === \"fragmented\" && __privateGet(this, _videoTrack)) {\n while (__privateGet(this, _videoSampleQueue).length > 0 && __privateGet(this, _videoSampleQueue)[0].decodeTimestamp <= audioSample.decodeTimestamp) {\n let videoSample = __privateGet(this, _videoSampleQueue).shift();\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n }\n if (audioSample.decodeTimestamp <= __privateGet(this, _videoTrack).lastDecodeTimestamp) {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n } else {\n __privateGet(this, _audioSampleQueue).push(audioSample);\n }\n } else {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n }\n }\n /** Finalizes the file, making it ready for use. Must be called after all video and audio chunks have been added. */\n finalize() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot finalize a muxer more than once.\");\n }\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n for (let videoSample of __privateGet(this, _videoSampleQueue))\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n for (let audioSample of __privateGet(this, _audioSampleQueue))\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this, false);\n } else {\n if (__privateGet(this, _videoTrack))\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _videoTrack));\n if (__privateGet(this, _audioTrack))\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _audioTrack));\n }\n let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter(Boolean);\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n let mdatSize;\n for (let i = 0; i < 2; i++) {\n let movieBox2 = moov(tracks, __privateGet(this, _creationTime));\n let movieBoxSize = __privateGet(this, _writer).measureBox(movieBox2);\n mdatSize = __privateGet(this, _writer).measureBox(__privateGet(this, _mdat));\n let currentChunkPos = __privateGet(this, _writer).pos + movieBoxSize + mdatSize;\n for (let chunk of __privateGet(this, _finalizedChunks)) {\n chunk.offset = currentChunkPos;\n for (let { data } of chunk.samples) {\n currentChunkPos += data.byteLength;\n mdatSize += data.byteLength;\n }\n }\n if (currentChunkPos < 2 ** 32)\n break;\n if (mdatSize >= 2 ** 32)\n __privateGet(this, _mdat).largeSize = true;\n }\n let movieBox = moov(tracks, __privateGet(this, _creationTime));\n __privateGet(this, _writer).writeBox(movieBox);\n __privateGet(this, _mdat).size = mdatSize;\n __privateGet(this, _writer).writeBox(__privateGet(this, _mdat));\n for (let chunk of __privateGet(this, _finalizedChunks)) {\n for (let sample of chunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n }\n } else if (__privateGet(this, _options).fastStart === \"fragmented\") {\n let startPos = __privateGet(this, _writer).pos;\n let mfraBox = mfra(tracks);\n __privateGet(this, _writer).writeBox(mfraBox);\n let mfraBoxSize = __privateGet(this, _writer).pos - startPos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).pos - 4);\n __privateGet(this, _writer).writeU32(mfraBoxSize);\n } else {\n let mdatPos = __privateGet(this, _writer).offsets.get(__privateGet(this, _mdat));\n let mdatSize = __privateGet(this, _writer).pos - mdatPos;\n __privateGet(this, _mdat).size = mdatSize;\n __privateGet(this, _mdat).largeSize = mdatSize >= 2 ** 32;\n __privateGet(this, _writer).patchBox(__privateGet(this, _mdat));\n let movieBox = moov(tracks, __privateGet(this, _creationTime));\n if (typeof __privateGet(this, _options).fastStart === \"object\") {\n __privateGet(this, _writer).seek(__privateGet(this, _ftypSize));\n __privateGet(this, _writer).writeBox(movieBox);\n let remainingBytes = mdatPos - __privateGet(this, _writer).pos;\n __privateGet(this, _writer).writeBox(free(remainingBytes));\n } else {\n __privateGet(this, _writer).writeBox(movieBox);\n }\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n __privateGet(this, _writer).finalize();\n __privateSet(this, _finalized, true);\n }\n};\n_options = new WeakMap();\n_writer = new WeakMap();\n_ftypSize = new WeakMap();\n_mdat = new WeakMap();\n_videoTrack = new WeakMap();\n_audioTrack = new WeakMap();\n_creationTime = new WeakMap();\n_finalizedChunks = new WeakMap();\n_nextFragmentNumber = new WeakMap();\n_videoSampleQueue = new WeakMap();\n_audioSampleQueue = new WeakMap();\n_finalized = new WeakMap();\n_validateOptions = new WeakSet();\nvalidateOptions_fn = function(options) {\n if (typeof options !== \"object\") {\n throw new TypeError(\"The muxer requires an options object to be passed to its constructor.\");\n }\n if (!(options.target instanceof Target)) {\n throw new TypeError(\"The target must be provided and an instance of Target.\");\n }\n if (options.video) {\n if (!SUPPORTED_VIDEO_CODECS.includes(options.video.codec)) {\n throw new TypeError(`Unsupported video codec: ${options.video.codec}`);\n }\n if (!Number.isInteger(options.video.width) || options.video.width <= 0) {\n throw new TypeError(`Invalid video width: ${options.video.width}. Must be a positive integer.`);\n }\n if (!Number.isInteger(options.video.height) || options.video.height <= 0) {\n throw new TypeError(`Invalid video height: ${options.video.height}. Must be a positive integer.`);\n }\n const videoRotation = options.video.rotation;\n if (typeof videoRotation === \"number\" && ![0, 90, 180, 270].includes(videoRotation)) {\n throw new TypeError(`Invalid video rotation: ${videoRotation}. Has to be 0, 90, 180 or 270.`);\n } else if (Array.isArray(videoRotation) && (videoRotation.length !== 9 || videoRotation.some((value) => typeof value !== \"number\"))) {\n throw new TypeError(`Invalid video transformation matrix: ${videoRotation.join()}`);\n }\n if (options.video.frameRate !== void 0 && (!Number.isInteger(options.video.frameRate) || options.video.frameRate <= 0)) {\n throw new TypeError(\n `Invalid video frame rate: ${options.video.frameRate}. Must be a positive integer.`\n );\n }\n }\n if (options.audio) {\n if (!SUPPORTED_AUDIO_CODECS.includes(options.audio.codec)) {\n throw new TypeError(`Unsupported audio codec: ${options.audio.codec}`);\n }\n if (!Number.isInteger(options.audio.numberOfChannels) || options.audio.numberOfChannels <= 0) {\n throw new TypeError(\n `Invalid number of audio channels: ${options.audio.numberOfChannels}. Must be a positive integer.`\n );\n }\n if (!Number.isInteger(options.audio.sampleRate) || options.audio.sampleRate <= 0) {\n throw new TypeError(\n `Invalid audio sample rate: ${options.audio.sampleRate}. Must be a positive integer.`\n );\n }\n }\n if (options.firstTimestampBehavior && !FIRST_TIMESTAMP_BEHAVIORS.includes(options.firstTimestampBehavior)) {\n throw new TypeError(`Invalid first timestamp behavior: ${options.firstTimestampBehavior}`);\n }\n if (typeof options.fastStart === \"object\") {\n if (options.video) {\n if (options.fastStart.expectedVideoChunks === void 0) {\n throw new TypeError(`'fastStart' is an object but is missing property 'expectedVideoChunks'.`);\n } else if (!Number.isInteger(options.fastStart.expectedVideoChunks) || options.fastStart.expectedVideoChunks < 0) {\n throw new TypeError(`'expectedVideoChunks' must be a non-negative integer.`);\n }\n }\n if (options.audio) {\n if (options.fastStart.expectedAudioChunks === void 0) {\n throw new TypeError(`'fastStart' is an object but is missing property 'expectedAudioChunks'.`);\n } else if (!Number.isInteger(options.fastStart.expectedAudioChunks) || options.fastStart.expectedAudioChunks < 0) {\n throw new TypeError(`'expectedAudioChunks' must be a non-negative integer.`);\n }\n }\n } else if (![false, \"in-memory\", \"fragmented\"].includes(options.fastStart)) {\n throw new TypeError(`'fastStart' option must be false, 'in-memory', 'fragmented' or an object.`);\n }\n if (options.minFragmentDuration !== void 0 && (!Number.isFinite(options.minFragmentDuration) || options.minFragmentDuration < 0)) {\n throw new TypeError(`'minFragmentDuration' must be a non-negative number.`);\n }\n};\n_writeHeader = new WeakSet();\nwriteHeader_fn = function() {\n __privateGet(this, _writer).writeBox(ftyp({\n holdsAvc: __privateGet(this, _options).video?.codec === \"avc\",\n fragmented: __privateGet(this, _options).fastStart === \"fragmented\"\n }));\n __privateSet(this, _ftypSize, __privateGet(this, _writer).pos);\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n __privateSet(this, _mdat, mdat(false));\n } else if (__privateGet(this, _options).fastStart === \"fragmented\") {\n } else {\n if (typeof __privateGet(this, _options).fastStart === \"object\") {\n let moovSizeUpperBound = __privateMethod(this, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn).call(this);\n __privateGet(this, _writer).seek(__privateGet(this, _writer).pos + moovSizeUpperBound);\n }\n __privateSet(this, _mdat, mdat(true));\n __privateGet(this, _writer).writeBox(__privateGet(this, _mdat));\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_computeMoovSizeUpperBound = new WeakSet();\ncomputeMoovSizeUpperBound_fn = function() {\n if (typeof __privateGet(this, _options).fastStart !== \"object\")\n return;\n let upperBound = 0;\n let sampleCounts = [\n __privateGet(this, _options).fastStart.expectedVideoChunks,\n __privateGet(this, _options).fastStart.expectedAudioChunks\n ];\n for (let n of sampleCounts) {\n if (!n)\n continue;\n upperBound += (4 + 4) * Math.ceil(2 / 3 * n);\n upperBound += 4 * n;\n upperBound += (4 + 4 + 4) * Math.ceil(2 / 3 * n);\n upperBound += 4 * n;\n upperBound += 8 * n;\n }\n upperBound += 4096;\n return upperBound;\n};\n_prepareTracks = new WeakSet();\nprepareTracks_fn = function() {\n if (__privateGet(this, _options).video) {\n __privateSet(this, _videoTrack, {\n id: 1,\n info: {\n type: \"video\",\n codec: __privateGet(this, _options).video.codec,\n width: __privateGet(this, _options).video.width,\n height: __privateGet(this, _options).video.height,\n rotation: __privateGet(this, _options).video.rotation ?? 0,\n decoderConfig: null\n },\n // The fallback contains many common frame rates as factors\n timescale: __privateGet(this, _options).video.frameRate ?? 57600,\n samples: [],\n finalizedChunks: [],\n currentChunk: null,\n firstDecodeTimestamp: void 0,\n lastDecodeTimestamp: -1,\n timeToSampleTable: [],\n compositionTimeOffsetTable: [],\n lastTimescaleUnits: null,\n lastSample: null,\n compactlyCodedChunkTable: []\n });\n }\n if (__privateGet(this, _options).audio) {\n __privateSet(this, _audioTrack, {\n id: __privateGet(this, _options).video ? 2 : 1,\n info: {\n type: \"audio\",\n codec: __privateGet(this, _options).audio.codec,\n numberOfChannels: __privateGet(this, _options).audio.numberOfChannels,\n sampleRate: __privateGet(this, _options).audio.sampleRate,\n decoderConfig: null\n },\n timescale: __privateGet(this, _options).audio.sampleRate,\n samples: [],\n finalizedChunks: [],\n currentChunk: null,\n firstDecodeTimestamp: void 0,\n lastDecodeTimestamp: -1,\n timeToSampleTable: [],\n compositionTimeOffsetTable: [],\n lastTimescaleUnits: null,\n lastSample: null,\n compactlyCodedChunkTable: []\n });\n if (__privateGet(this, _options).audio.codec === \"aac\") {\n let guessedCodecPrivate = __privateMethod(this, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn).call(\n this,\n 2,\n // Object type for AAC-LC, since it's the most common\n __privateGet(this, _options).audio.sampleRate,\n __privateGet(this, _options).audio.numberOfChannels\n );\n __privateGet(this, _audioTrack).info.decoderConfig = {\n codec: __privateGet(this, _options).audio.codec,\n description: guessedCodecPrivate,\n numberOfChannels: __privateGet(this, _options).audio.numberOfChannels,\n sampleRate: __privateGet(this, _options).audio.sampleRate\n };\n }\n }\n};\n_generateMpeg4AudioSpecificConfig = new WeakSet();\ngenerateMpeg4AudioSpecificConfig_fn = function(objectType, sampleRate, numberOfChannels) {\n let frequencyIndices = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350];\n let frequencyIndex = frequencyIndices.indexOf(sampleRate);\n let channelConfig = numberOfChannels;\n let configBits = \"\";\n configBits += objectType.toString(2).padStart(5, \"0\");\n configBits += frequencyIndex.toString(2).padStart(4, \"0\");\n if (frequencyIndex === 15)\n configBits += sampleRate.toString(2).padStart(24, \"0\");\n configBits += channelConfig.toString(2).padStart(4, \"0\");\n let paddingLength = Math.ceil(configBits.length / 8) * 8;\n configBits = configBits.padEnd(paddingLength, \"0\");\n let configBytes = new Uint8Array(configBits.length / 8);\n for (let i = 0; i < configBits.length; i += 8) {\n configBytes[i / 8] = parseInt(configBits.slice(i, i + 8), 2);\n }\n return configBytes;\n};\n_createSampleForTrack = new WeakSet();\ncreateSampleForTrack_fn = function(track, data, type, timestamp, duration, meta, compositionTimeOffset) {\n let presentationTimestampInSeconds = timestamp / 1e6;\n let decodeTimestampInSeconds = (timestamp - (compositionTimeOffset ?? 0)) / 1e6;\n let durationInSeconds = duration / 1e6;\n let adjusted = __privateMethod(this, _validateTimestamp, validateTimestamp_fn).call(this, presentationTimestampInSeconds, decodeTimestampInSeconds, track);\n presentationTimestampInSeconds = adjusted.presentationTimestamp;\n decodeTimestampInSeconds = adjusted.decodeTimestamp;\n if (meta?.decoderConfig) {\n if (track.info.decoderConfig === null) {\n track.info.decoderConfig = meta.decoderConfig;\n } else {\n Object.assign(track.info.decoderConfig, meta.decoderConfig);\n }\n }\n let sample = {\n presentationTimestamp: presentationTimestampInSeconds,\n decodeTimestamp: decodeTimestampInSeconds,\n duration: durationInSeconds,\n data,\n size: data.byteLength,\n type,\n // Will be refined once the next sample comes in\n timescaleUnitsToNextSample: intoTimescale(durationInSeconds, track.timescale)\n };\n return sample;\n};\n_addSampleToTrack = new WeakSet();\naddSampleToTrack_fn = function(track, sample) {\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n track.samples.push(sample);\n }\n const sampleCompositionTimeOffset = intoTimescale(sample.presentationTimestamp - sample.decodeTimestamp, track.timescale);\n if (track.lastTimescaleUnits !== null) {\n let timescaleUnits = intoTimescale(sample.decodeTimestamp, track.timescale, false);\n let delta = Math.round(timescaleUnits - track.lastTimescaleUnits);\n track.lastTimescaleUnits += delta;\n track.lastSample.timescaleUnitsToNextSample = delta;\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n let lastTableEntry = last(track.timeToSampleTable);\n if (lastTableEntry.sampleCount === 1) {\n lastTableEntry.sampleDelta = delta;\n lastTableEntry.sampleCount++;\n } else if (lastTableEntry.sampleDelta === delta) {\n lastTableEntry.sampleCount++;\n } else {\n lastTableEntry.sampleCount--;\n track.timeToSampleTable.push({\n sampleCount: 2,\n sampleDelta: delta\n });\n }\n const lastCompositionTimeOffsetTableEntry = last(track.compositionTimeOffsetTable);\n if (lastCompositionTimeOffsetTableEntry.sampleCompositionTimeOffset === sampleCompositionTimeOffset) {\n lastCompositionTimeOffsetTableEntry.sampleCount++;\n } else {\n track.compositionTimeOffsetTable.push({\n sampleCount: 1,\n sampleCompositionTimeOffset\n });\n }\n }\n } else {\n track.lastTimescaleUnits = 0;\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n track.timeToSampleTable.push({\n sampleCount: 1,\n sampleDelta: intoTimescale(sample.duration, track.timescale)\n });\n track.compositionTimeOffsetTable.push({\n sampleCount: 1,\n sampleCompositionTimeOffset\n });\n }\n }\n track.lastSample = sample;\n let beginNewChunk = false;\n if (!track.currentChunk) {\n beginNewChunk = true;\n } else {\n let currentChunkDuration = sample.presentationTimestamp - track.currentChunk.startTimestamp;\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n let mostImportantTrack = __privateGet(this, _videoTrack) ?? __privateGet(this, _audioTrack);\n const chunkDuration = __privateGet(this, _options).minFragmentDuration ?? 1;\n if (track === mostImportantTrack && sample.type === \"key\" && currentChunkDuration >= chunkDuration) {\n beginNewChunk = true;\n __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this);\n }\n } else {\n beginNewChunk = currentChunkDuration >= 0.5;\n }\n }\n if (beginNewChunk) {\n if (track.currentChunk) {\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, track);\n }\n track.currentChunk = {\n startTimestamp: sample.presentationTimestamp,\n samples: []\n };\n }\n track.currentChunk.samples.push(sample);\n};\n_validateTimestamp = new WeakSet();\nvalidateTimestamp_fn = function(presentationTimestamp, decodeTimestamp, track) {\n const strictTimestampBehavior = __privateGet(this, _options).firstTimestampBehavior === \"strict\";\n const noLastDecodeTimestamp = track.lastDecodeTimestamp === -1;\n const timestampNonZero = decodeTimestamp !== 0;\n if (strictTimestampBehavior && noLastDecodeTimestamp && timestampNonZero) {\n throw new Error(\n `The first chunk for your media track must have a timestamp of 0 (received DTS=${decodeTimestamp}).Non-zero first timestamps are often caused by directly piping frames or audio data from a MediaStreamTrack into the encoder. Their timestamps are typically relative to the age of thedocument, which is probably what you want.\n\nIf you want to offset all timestamps of a track such that the first one is zero, set firstTimestampBehavior: 'offset' in the options.\n`\n );\n } else if (__privateGet(this, _options).firstTimestampBehavior === \"offset\" || __privateGet(this, _options).firstTimestampBehavior === \"cross-track-offset\") {\n if (track.firstDecodeTimestamp === void 0) {\n track.firstDecodeTimestamp = decodeTimestamp;\n }\n let baseDecodeTimestamp;\n if (__privateGet(this, _options).firstTimestampBehavior === \"offset\") {\n baseDecodeTimestamp = track.firstDecodeTimestamp;\n } else {\n baseDecodeTimestamp = Math.min(\n __privateGet(this, _videoTrack)?.firstDecodeTimestamp ?? Infinity,\n __privateGet(this, _audioTrack)?.firstDecodeTimestamp ?? Infinity\n );\n }\n decodeTimestamp -= baseDecodeTimestamp;\n presentationTimestamp -= baseDecodeTimestamp;\n }\n if (decodeTimestamp < track.lastDecodeTimestamp) {\n throw new Error(\n `Timestamps must be monotonically increasing (DTS went from ${track.lastDecodeTimestamp * 1e6} to ${decodeTimestamp * 1e6}).`\n );\n }\n track.lastDecodeTimestamp = decodeTimestamp;\n return { presentationTimestamp, decodeTimestamp };\n};\n_finalizeCurrentChunk = new WeakSet();\nfinalizeCurrentChunk_fn = function(track) {\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n throw new Error(\"Can't finalize individual chunks if 'fastStart' is set to 'fragmented'.\");\n }\n if (!track.currentChunk)\n return;\n track.finalizedChunks.push(track.currentChunk);\n __privateGet(this, _finalizedChunks).push(track.currentChunk);\n if (track.compactlyCodedChunkTable.length === 0 || last(track.compactlyCodedChunkTable).samplesPerChunk !== track.currentChunk.samples.length) {\n track.compactlyCodedChunkTable.push({\n firstChunk: track.finalizedChunks.length,\n // 1-indexed\n samplesPerChunk: track.currentChunk.samples.length\n });\n }\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n track.currentChunk.offset = 0;\n return;\n }\n track.currentChunk.offset = __privateGet(this, _writer).pos;\n for (let sample of track.currentChunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_finalizeFragment = new WeakSet();\nfinalizeFragment_fn = function(flushStreamingWriter = true) {\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n throw new Error(\"Can't finalize a fragment unless 'fastStart' is set to 'fragmented'.\");\n }\n let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter((track) => track && track.currentChunk);\n if (tracks.length === 0)\n return;\n let fragmentNumber = __privateWrapper(this, _nextFragmentNumber)._++;\n if (fragmentNumber === 1) {\n let movieBox = moov(tracks, __privateGet(this, _creationTime), true);\n __privateGet(this, _writer).writeBox(movieBox);\n }\n let moofOffset = __privateGet(this, _writer).pos;\n let moofBox = moof(fragmentNumber, tracks);\n __privateGet(this, _writer).writeBox(moofBox);\n {\n let mdatBox = mdat(false);\n let totalTrackSampleSize = 0;\n for (let track of tracks) {\n for (let sample of track.currentChunk.samples) {\n totalTrackSampleSize += sample.size;\n }\n }\n let mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize;\n if (mdatSize >= 2 ** 32) {\n mdatBox.largeSize = true;\n mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize;\n }\n mdatBox.size = mdatSize;\n __privateGet(this, _writer).writeBox(mdatBox);\n }\n for (let track of tracks) {\n track.currentChunk.offset = __privateGet(this, _writer).pos;\n track.currentChunk.moofOffset = moofOffset;\n for (let sample of track.currentChunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n }\n let endPos = __privateGet(this, _writer).pos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(moofBox));\n let newMoofBox = moof(fragmentNumber, tracks);\n __privateGet(this, _writer).writeBox(newMoofBox);\n __privateGet(this, _writer).seek(endPos);\n for (let track of tracks) {\n track.finalizedChunks.push(track.currentChunk);\n __privateGet(this, _finalizedChunks).push(track.currentChunk);\n track.currentChunk = null;\n }\n if (flushStreamingWriter) {\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n }\n};\n_maybeFlushStreamingTargetWriter = new WeakSet();\nmaybeFlushStreamingTargetWriter_fn = function() {\n if (__privateGet(this, _writer) instanceof StreamTargetWriter) {\n __privateGet(this, _writer).flush();\n }\n};\n_ensureNotFinalized = new WeakSet();\nensureNotFinalized_fn = function() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot add new video or audio chunks after the file has been finalized.\");\n }\n};\nexport {\n ArrayBufferTarget,\n FileSystemWritableFileStreamTarget,\n Muxer,\n StreamTarget\n};\n","import {ArrayBufferTarget, Muxer} from \"mp4-muxer\";\nimport EventEmitter from \"../../../utils/EventEmitter\";\nimport { WorkerController } from \"../../../utils/WorkerController\";\nimport { VideoWorker } from \"../video/video\";\nexport interface AudioTrackData {\n codec: string,\n sampleRate: number ,\n numberOfChannels: number\n}\n\n// Duration of each audio segment (time-based blocks that contain multiple EncodedAudioChunks)\nconst SEGMENT_DURATION = 30; // seconds\n\n\nexport interface AudioPlayerArgs {\n\n audioConfig: AudioTrackData;\n duration: number;\n worker: WorkerController;\n file: File;\n}\n\n\nexport class WebAudioPlayer {\n\n\n audioContext: AudioContext | null;\n sourceNode: AudioBufferSourceNode | null;\n isPlaying: boolean;\n startTime: number;\n pauseTime: number;\n duration: number;\n encodedChunks: EncodedAudioChunk[]; // EncodedAudioChunks from current segment\n audioSegments: Map<number, AudioBuffer>; // Decoded audio segments (segmentIndex -> AudioBuffer)\n scheduledNodes: Map<number, AudioBufferSourceNode>;\n preloadThreshold: number; // Seconds before segment end to trigger preload\n file: File;\n\n worker: WorkerController;\n isPreloading: boolean;\n audioConfig: AudioTrackData | null;\n constructor(args: AudioPlayerArgs) {\n this.audioContext = null;\n this.sourceNode = null;\n this.isPlaying = false;\n this.startTime = 0;\n this.pauseTime = 0;\n this.duration = args.duration;\n this.audioConfig = args.audioConfig;\n\n this.encodedChunks = [];\n this.audioSegments = new Map(); // Cache for decoded audio segments\n this.scheduledNodes = new Map(); // Track scheduled audio nodes\n this.preloadThreshold = 5; // Seconds before segment end to trigger preload\n this.isPreloading = false;\n\n //Audio Renderer gets its own worker to avoid using the video worker to get audio chunks while the video renderer is running / fetching video chunks\n this.worker = args.worker;\n this.file = args.file;\n\n\n this.init();\n }\n\n init() {\n this.audioContext = new AudioContext();\n\n this.seek(0);\n \n }\n\n /**\n * Mux EncodedAudioChunks to an ArrayBuffer for Web Audio API decoding\n * @param chunks - Array of EncodedAudioChunks from a segment\n */\n async muxEncodedChunksToBuffer(chunks: EncodedAudioChunk[], config: AudioTrackData) {\n // Create MP4 muxer\n const muxer = new Muxer({\n target: new ArrayBufferTarget(),\n fastStart: 'in-memory',\n firstTimestampBehavior: 'offset',\n audio: {\n codec: 'aac',\n sampleRate: config.sampleRate,\n numberOfChannels: config.numberOfChannels\n }\n });\n\n // Add EncodedAudioChunks to muxer\n for (const chunk of chunks) {\n muxer.addAudioChunk(chunk);\n }\n\n // Finalize and get array buffer\n await muxer.finalize();\n return muxer.target.buffer;\n }\n\n /**\n * Fetch EncodedAudioChunks for a specific time segment from the file worker\n * @param time - Time in seconds\n * @returns Array of EncodedAudioChunks\n */\n async getEncodedChunksForTime(time: number) {\n const segmentIndex = Math.floor(time / SEGMENT_DURATION);\n\n const chunks = <EncodedAudioChunk[]> await this.worker.sendMessage('get-audio-segment', {\n start: segmentIndex * SEGMENT_DURATION,\n end: segmentIndex * SEGMENT_DURATION + SEGMENT_DURATION,\n file: this.file\n });\n\n this.encodedChunks = chunks;\n\n return chunks;\n }\n\n /**\n * Load and decode an audio segment\n * @param time - Time in seconds\n * @returns Decoded AudioBuffer for the segment\n */\n async loadSegment(time: number) {\n const segmentIndex = Math.floor(time / SEGMENT_DURATION);\n\n // Check cache first\n if (this.audioSegments.has(segmentIndex)) {\n return this.audioSegments.get(segmentIndex);\n }\n\n // Fetch EncodedAudioChunks for this segment\n const encodedChunks = await this.getEncodedChunksForTime(segmentIndex * SEGMENT_DURATION);\n if (encodedChunks.length === 0) return null;\n\n try {\n const a = performance.now();\n\n // Mux EncodedAudioChunks to AAC buffer\n const muxedBuffer = await this.muxEncodedChunksToBuffer(encodedChunks, this.audioConfig!);\n\n const b = performance.now();\n\n // Decode to AudioBuffer for Web Audio API\n const audioBuffer = await this.audioContext!.decodeAudioData(muxedBuffer);\n\n const c = performance.now();\n console.log(`Segment ${segmentIndex}: Muxing took ${b - a}ms, Decoding took ${c - b}ms`);\n\n // Cache the decoded segment\n this.audioSegments.set(segmentIndex, audioBuffer);\n\n return audioBuffer;\n } catch (error) {\n console.error('Error loading audio segment:', error);\n return null;\n }\n }\n\n\n\n async startPlayback(startFrom = this.pauseTime) {\n // Clear any previously scheduled nodes\n this.clearScheduledNodes();\n\n const currentSegment = await this.loadSegment(startFrom);\n\n if (!currentSegment) return;\n\n const segmentOffset = startFrom % SEGMENT_DURATION;\n const timeUntilEnd = SEGMENT_DURATION - segmentOffset;\n\n // Schedule current segment\n this.scheduleSegment(currentSegment, startFrom, segmentOffset);\n\n // Pre-load and schedule next segment\n this.preloadNextSegment(startFrom + timeUntilEnd);\n }\n\n clearScheduledNodes() {\n // Clear both audio nodes and preload timeouts\n for (const node of this.scheduledNodes.values()) {\n node.stop();\n node.disconnect();\n }\n this.scheduledNodes.clear();\n }\n\n getCurrentSegmentIndex() {\n return Math.floor(this.getCurrentTime() / SEGMENT_DURATION);\n }\n\n async preloadNextSegment(startTime: number) {\n if (this.isPreloading || startTime >= this.duration) return;\n\n const nextSegmentIndex = Math.floor(startTime / SEGMENT_DURATION);\n\n // Check if we already have this segment cached\n if (this.audioSegments.has(nextSegmentIndex)) {\n this.scheduleSegment(this.audioSegments.get(nextSegmentIndex), startTime, 0);\n return;\n }\n this.isPreloading = true;\n try {\n const nextSegment = await this.loadSegment(startTime);\n if (!nextSegment || !this.isPlaying) return;\n\n this.scheduleSegment(nextSegment, startTime, 0);\n\n // Instead of setTimeout, we'll check during playback updates\n } finally {\n this.isPreloading = false;\n }\n }\n\n scheduleSegment(audioBuffer: AudioBuffer, startTime: number, offset: number) {\n const sourceNode = this.audioContext!.createBufferSource();\n sourceNode.buffer = audioBuffer;\n sourceNode.connect(this.audioContext!.destination);\n const playbackTime = this.startTime + (startTime - this.pauseTime);\n sourceNode.start(playbackTime, offset);\n this.scheduledNodes.set(startTime, sourceNode);\n\n // Clean up completed nodes\n sourceNode.onended = () => {\n sourceNode.disconnect();\n this.scheduledNodes.delete(startTime);\n };\n }\n\n async play() {\n this.startTime = this.audioContext!.currentTime;\n await this.startPlayback();\n this.isPlaying = true;\n }\n\n async pause() {\n this.clearScheduledNodes();\n this.pauseTime = this.getCurrentTime();\n this.isPlaying = false;\n }\n\n \n async seek(time: number) {\n const wasPlaying = this.isPlaying; \n if (wasPlaying) {\n this.clearScheduledNodes();\n this.isPlaying = false;\n }\n this.pauseTime = time;\n if (wasPlaying) {\n this.startTime = this.audioContext!.currentTime;\n this.isPlaying = true;\n await this.startPlayback(time);\n\n }\n }\n\n\n checkForPreLoad() {\n if (!this.isPlaying) return;\n const currentTime = this.getCurrentTime();\n // Check if we need to preload the next segment\n const currentSegmentIndex = this.getCurrentSegmentIndex();\n const timeInCurrentSegment = currentTime % SEGMENT_DURATION;\n\n if (timeInCurrentSegment >= (SEGMENT_DURATION - this.preloadThreshold) &&\n !this.isPreloading &&\n !this.audioSegments.has(currentSegmentIndex + 1)) {\n this.preloadNextSegment((currentSegmentIndex + 1) * SEGMENT_DURATION);\n } \n }\n\n getCurrentTime() {\n if (!this.isPlaying) return this.pauseTime;\n return this.pauseTime + (this.audioContext!.currentTime - this.startTime);\n }\n\n\n}\n\n","import { v4 as uuidv4 } from 'uuid';\n\ntype Listener = (args?: any) => void;\n\nexport default class EventEmitter {\n listeners: Record<string, Record<string, Listener>> = {};\n\n /**\n * Add an event listener and return its unique ID\n */\n on(event: string, listener: Listener): string {\n\n if (!this.listeners[event]) {\n this.listeners[event] = {};\n }\n\n const id = uuidv4();\n this.listeners[event][id] = listener;\n return id;\n }\n\n /**\n * Remove a specific listener by its ID\n */\n off(event: string, listenerId: string): void {\n if (this.listeners[event]) {\n delete this.listeners[event][listenerId];\n }\n }\n\n /**\n * Emit an event to all registered listeners\n */\n emit(event: string, args?: any): void {\n if (this.listeners[event]) {\n Object.values(this.listeners[event]).forEach(listener => {\n listener(args);\n });\n }\n }\n\n /**\n * Remove all listeners for a specific event\n */\n removeAllListeners(event: string): void {\n if (this.listeners[event]) {\n this.listeners[event] = {};\n }\n }\n} ","import EventEmitter from \"../../../utils/EventEmitter\";\nimport VideoWorkerConstructor from './video.worker.ts?worker';\nimport { WorkerController } from \"../../../utils/WorkerController\";\n\nexport interface VideoWorkerParams {\n src: File;\n canvas: HTMLCanvasElement;\n fileWorkerPort: MessagePort;\n}\n\n\n\n/**\n * OffscreenVideoWorker is a wrapper around the video.worker.ts\n * It handles communication with the worker and provides a simple interface.\n */\nexport class VideoWorker extends EventEmitter {\n private canvas: HTMLCanvasElement;\n private offscreenCanvas: OffscreenCanvas | null = null;\n public duration: number = 0;\n private worker: WorkerController;\n private fileWorkerPort: MessagePort;\n\n constructor(params: VideoWorkerParams) {\n super();\n this.canvas = params.canvas;\n this.fileWorkerPort = params.fileWorkerPort;\n this.worker = new WorkerController(VideoWorkerConstructor);\n }\n \n\n /**\n * Send a message to the worker and wait for a response\n */\n\n\n /**\n * Initialize the video player\n */\n async initialize(): Promise<void> {\n // Create the offscreen canvas\n this.offscreenCanvas = this.canvas.transferControlToOffscreen();\n\n // Initialize the worker with the offscreen canvas and file worker port\n const initialized = await this.worker.sendMessage('init', {\n canvas: this.offscreenCanvas,\n fileWorkerPort: this.fileWorkerPort\n }, [this.offscreenCanvas, this.fileWorkerPort]);\n\n\n // Emit initialization event\n this.emit('initialized', initialized);\n }\n\n\n\n /**\n * Seek to a specific time\n */\n async seek(time: number): Promise<void> {\n // Send seek command to worker\n await this.worker.sendMessage('seek', { time });\n }\n\n /**\n * Get debug information from the video worker\n */\n async getDebugInfo(): Promise<any> {\n return await this.worker.sendMessage('get-debug-info', {});\n }\n\n\n async setTrackData(videoMetadata: any, duration: number): Promise<void> {\n await this.worker.sendMessage('set-track-data', {\n videoMetadata,\n duration\n });\n }\n /**\n * Clean up resources\n */\n terminate(): void {\n\n // Terminate the worker\n this.worker.sendMessage('terminate').catch(console.error);\n \n // Clean up\n this.worker.terminate();\n this.offscreenCanvas = null;\n \n // Emit terminate event\n this.emit('terminated');\n }\n\n /**\n\n /**\n * Update the current frame (animation loop)\n */\n\n\n render(time: number): void {\n\n // Send render command to worker\n this.worker.sendMessage('render', { time: time });\n }\n}","import EventEmitter from '../utils/EventEmitter';\nimport { WebAudioPlayer } from './renderers/audio/audio';\nimport { VideoWorker } from './renderers/video/video';\n\n/**\n * Clock - Time Management for Video Playback\n *\n * The Clock is the central coordinator for playback timing. It:\n * - Uses the audio timeline as the source of truth (Web Audio API currentTime)\n * - Manages the requestAnimationFrame loop\n * - Emits tick events for UI updates\n * - Coordinates video rendering at the correct time\n * - Provides getCurrentTime() for on-demand queries\n *\n * Architecture:\n *\n * Clock (this class)\n * │\n * ├─> Queries audioPlayer.getCurrentTime() ← Audio timeline is source of truth\n * ├─> Emits 'tick' events with current time\n * ├─> Calls videoWorker.render(time) passively\n * └─> Provides getCurrentTime() for external queries\n *\n * Why use the audio timeline?\n * - Web Audio API provides high-precision timing via AudioContext.currentTime\n * - Hardware accelerated and synchronized with audio output\n * - More reliable than performance.now() for A/V sync\n */\nexport class Clock extends EventEmitter {\n\n private audioPlayer: WebAudioPlayer;\n private videoWorker: VideoWorker;\n private isPlaying: boolean = false;\n private animationFrame: number | null = null;\n private duration: number;\n\n // Frame rate management\n private readonly TARGET_FPS = 30; // Target 30fps for smooth playback\n private readonly FRAME_INTERVAL: number;\n private lastFrameTime = 0;\n\n /**\n * Create a new Clock\n * @param audioPlayer - Audio player with Web Audio timeline\n * @param videoWorker - Video worker for passive rendering\n * @param duration - Total video duration in seconds\n */\n constructor(audioPlayer: WebAudioPlayer, videoWorker: VideoWorker, duration: number) {\n super();\n\n this.audioPlayer = audioPlayer;\n this.videoWorker = videoWorker;\n this.duration = duration;\n this.FRAME_INTERVAL = 1000 / this.TARGET_FPS;\n }\n\n /**\n * Start playback\n *\n * Starts the audio player and begins the tick loop.\n * The tick loop queries the audio timeline and drives video rendering.\n */\n async play(): Promise<void> {\n if (this.isPlaying) return;\n\n this.isPlaying = true;\n\n // Start audio playback (this starts the timeline)\n await this.audioPlayer.play();\n\n // Start the tick loop\n this.lastFrameTime = performance.now();\n this.tick();\n\n this.emit('play');\n }\n\n /**\n * Pause playback\n *\n * Pauses audio and stops the tick loop.\n */\n pause(): void {\n if (!this.isPlaying) return;\n\n this.isPlaying = false;\n\n // Pause audio\n this.audioPlayer.pause();\n\n // Stop the tick loop\n if (this.animationFrame) {\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = null;\n }\n\n this.emit('pause');\n }\n\n /**\n * Seek to a specific time\n *\n * @param time - Time in seconds\n */\n async seek(time: number): Promise<void> {\n const clampedTime = Math.max(0, Math.min(time, this.duration));\n\n // Seek both video and audio\n this.videoWorker.seek(clampedTime);\n await this.audioPlayer.seek(clampedTime);\n\n this.emit('seek', clampedTime);\n }\n\n /**\n * Get the current playback time\n *\n * Queries the audio player's timeline, which is the source of truth.\n *\n * @returns Current time in seconds\n */\n getCurrentTime(): number {\n return this.audioPlayer.getCurrentTime();\n }\n\n /**\n * Check if currently playing\n */\n playing(): boolean {\n return this.isPlaying;\n }\n\n /**\n * Main tick loop\n *\n * This runs at TARGET_FPS and:\n * 1. Queries the current time from audio timeline\n * 2. Emits tick event for UI updates\n * 3. Tells video worker to render at this time\n * 4. Checks for end of video\n *\n * The video worker is passive - it just renders whatever time we tell it.\n * The audio timeline is the source of truth for the current time.\n */\n private tick(): void {\n if (!this.isPlaying) return;\n\n const now = performance.now();\n const elapsed = now - this.lastFrameTime;\n\n // Frame rate throttling: only update at TARGET_FPS\n // This prevents unnecessary rendering and saves CPU/battery\n if (elapsed < this.FRAME_INTERVAL) {\n this.animationFrame = requestAnimationFrame(() => this.tick());\n return;\n }\n\n this.lastFrameTime = now;\n\n // Get current time from audio timeline (source of truth)\n const currentTime = this.audioPlayer.getCurrentTime();\n\n // Check if we've reached the end\n if (currentTime >= this.duration - 0.1) {\n this.pause();\n this.emit('ended');\n return;\n }\n\n // Emit tick event for UI updates\n // UI should listen to this rather than polling getCurrentTime()\n this.emit('tick', currentTime);\n\n // Tell video worker to render at this time (passive)\n // Video worker doesn't track time itself - it just renders whatever we tell it\n this.videoWorker.render(currentTime);\n this.audioPlayer.checkForPreLoad();\n\n // Schedule next tick\n this.animationFrame = requestAnimationFrame(() => this.tick());\n }\n\n /**\n * Update duration (if needed after initialization)\n */\n setDuration(duration: number): void {\n this.duration = duration;\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.animationFrame) {\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = null;\n }\n this.isPlaying = false;\n }\n}\n","import { VideoTrackData } from \"./renderers/video/decoder\";\nimport EventEmitter from \"../utils/EventEmitter\";\nimport { WorkerController } from '../utils/WorkerController';\nimport { AudioTrackData, WebAudioPlayer } from \"./renderers/audio/audio\";\nimport { VideoWorker } from \"./renderers/video/video\";\nimport { Clock } from \"./clock\";\nimport FileWorker from './file.ts?worker';\n// Note to Claude: Do not edit this file or make suggestions unless I specifically ask you to.\n\nexport interface WebCodecsPlayerParams {\n src: File;\n canvas: HTMLCanvasElement;\n}\n\n\nexport interface TrackData {\n duration: number,\n audio?: AudioTrackData\n video?: VideoTrackData\n}\n\n\n\n\n\nexport class WebCodecsPlayer {\n private canvas: HTMLCanvasElement | null = null;\n private params: WebCodecsPlayerParams;\n private file: File;\n duration: number = 0;\n private renderer: VideoWorker | null = null;\n private audioPlayer: WebAudioPlayer | null = null;\n private worker: WorkerController | null = null;\n private clock: Clock | null = null;\n private trackData: TrackData | null = null;\n\n constructor(params: WebCodecsPlayerParams) {\n\n this.params = params;\n this.worker = new WorkerController(FileWorker);\n this.file = params.src;\n this.canvas = params.canvas;\n this.duration = 0;\n }\n\n\n\n async play() {\n if (!this.clock) {\n throw new Error('Player not initialized. Call initialize() first.');\n }\n\n await this.clock.play();\n }\n\n async pause() {\n if (!this.clock) {\n throw new Error('Player not initialized. Call initialize() first.');\n }\n\n this.clock.pause();\n }\n\n async seek(time: number) {\n if (!this.clock) {\n throw new Error('Player not initialized. Call initialize() first.');\n }\n\n await this.clock.seek(time);\n }\n\n getCurrentTime(): number {\n return this.clock?.getCurrentTime() || 0;\n }\n\n async getDebugInfo() {\n const videoDebugInfo = this.renderer ? await this.renderer.getDebugInfo() : null;\n\n return {\n trackData: {\n duration: this.duration,\n audio: this.audioPlayer ? {\n codec: this.audioPlayer.audioConfig?.codec,\n sampleRate: this.audioPlayer.audioConfig?.sampleRate,\n numberOfChannels: this.audioPlayer.audioConfig?.numberOfChannels,\n startTime: this.audioPlayer.startTime,\n pauseTime: this.audioPlayer.pauseTime,\n isPlaying: this.audioPlayer.isPlaying,\n loadedSegments: this.audioPlayer.audioSegments.size,\n scheduledNodeCount: this.audioPlayer.scheduledNodes.size\n } : null,\n video: videoDebugInfo ? {\n duration: this.renderer?.duration,\n codec: this.trackData?.video?.codec,\n width: this.trackData?.video?.codedWidth,\n height: this.trackData?.video?.codedHeight,\n frameRate: this.trackData?.video?.frameRate,\n ...videoDebugInfo\n } : null\n },\n clock: {\n isPlaying: this.clock?.playing(),\n currentTime: this.getCurrentTime()\n }\n };\n }\n\n terminate(){\n // Clean up clock\n if (this.clock) {\n this.clock.destroy();\n this.clock = null;\n }\n\n // Clean up audio resources\n if (this.audioPlayer) {\n this.audioPlayer.pause();\n // Any additional cleanup for audio...\n }\n\n // Clean up renderer resources\n if (this.renderer) {\n if (this.renderer instanceof VideoWorker) {\n this.renderer.terminate();\n } \n this.renderer = null;\n }\n\n }\n\n async initialize(): Promise<void> {\n\n console.log(\"Initializing\");\n\n // Create file demuxer worker\n this.worker = new WorkerController(FileWorker);\n\n // Create MessageChannel for file worker <-> video worker communication\n const videoChannel = new MessageChannel();\n\n // Initialize file worker with video port\n await this.worker.sendMessage('init', {\n file: this.file,\n videoPort: videoChannel.port1\n }, [videoChannel.port1]);\n\n // Get track metadata from file worker\n const trackData = <TrackData> await this.worker.sendMessage('get-tracks', {});\n console.log(\"Track data\", trackData);\n\n this.trackData = trackData;\n this.duration = trackData.duration;\n\n // Initialize video worker with port to file worker\n this.renderer = new VideoWorker({\n src: this.file,\n canvas: this.canvas!,\n fileWorkerPort: videoChannel.port2\n });\n\n await this.renderer.initialize();\n\n // Send track metadata to video worker\n await this.renderer.setTrackData(trackData.video!, trackData.duration);\n\n // Initialize audio player with file worker\n this.audioPlayer = new WebAudioPlayer({\n worker: this.worker,\n audioConfig: trackData.audio!,\n duration: trackData.duration,\n file: this.file\n });\n\n // Create clock to manage playback timing\n // The clock coordinates audio and video using the audio timeline as source of truth\n this.clock = new Clock(this.audioPlayer, this.renderer, this.duration);\n\n // Forward clock events to external listeners\n\n }\n\n on(event, listener){\n this.clock.on(event, listener)\n }\n\n // Add more methods as needed\n}\n\nexport default WebCodecsPlayer; "],"names":["byteToHex","i","unsafeStringify","arr","offset","getRandomValues","rnds8","rng","randomUUID","native","v4","options","buf","rnds","WorkerController","workerUrlOrConstructor","persistentEvents","port","event","eventName","handler","cmd","data","transfer","sanitize","request_id","uuidv4","sanitizedData","sanitizeForWorker","resolve","reject","message","response","error","obj","special_types","type","item","rawObj","sanitized","key","value","__accessCheck","member","msg","__privateGet","getter","__privateAdd","__privateSet","setter","__privateWrapper","__privateMethod","method","bytes","view","u8","u16","i16","u24","u32","i32","u64","fixed_8_8","fixed_16_16","fixed_2_30","ascii","text","nullTerminated","bytes2","_","last","lastPresentedSample","samples","result","sample","intoTimescale","timeInSeconds","timescale","round","rotationMatrix","rotationInDegrees","theta","cosTheta","sinTheta","IDENTITY_MATRIX","matrixToBytes","matrix","deepClone","x","isU32","box","contents","children","fullBox","version","flags","ftyp","details","minorVersion","mdat","reserveLargeSize","free","size","moov","tracks","creationTime","fragmented","mvhd","trak","mvex","duration","lastSample","GLOBAL_TIMESCALE","nextTrackId","needsU64","u32OrU64","track","tkhd","mdia","durationInGlobalTimescale","mdhd","hdlr","minf","localDuration","componentSubtype","vmhd","smhd","dinf","stbl","dref","url","needsCtts","stsd","stts","stss","stsc","stsz","stco","ctts","videoSampleDescription","VIDEO_CODEC_TO_BOX_NAME","soundSampleDescription","AUDIO_CODEC_TO_BOX_NAME","compressionType","VIDEO_CODEC_TO_CONFIGURATION_BOX","colr","COLOR_PRIMARIES_MAP","TRANSFER_CHARACTERISTICS_MAP","MATRIX_COEFFICIENTS_MAP","avcC","hvcC","vpcC","decoderConfig","parts","profile","level","thirdByte","av1C","firstByte","AUDIO_CODEC_TO_CONFIGURATION_BOX","esds","description","dOps","_a","preskip","gain","view2","keySamples","index","trex","moof","sequenceNumber","mfhd","traf","fragmentSampleFlags","byte1","byte2","byte3","byte4","sampleIsDifferenceSample","tfhd","tfdt","trun","tfFlags","referenceSample","referenceSampleInfo","allSampleDurations","allSampleSizes","allSampleFlags","allSampleCompositionTimeOffsets","uniqueSampleDurations","uniqueSampleSizes","uniqueSampleFlags","uniqueSampleCompositionTimeOffsets","firstSampleFlagsPresent","sampleDurationPresent","sampleSizePresent","sampleFlagsPresent","sampleCompositionTimeOffsetsPresent","mfra","tfra","mfro","trackIndex","chunk","Target","ArrayBufferTarget","StreamTarget","FileSystemWritableFileStreamTarget","stream","_helper","_helperView","Writer","newPos","box2","startPos","child","endPos","_target","_buffer","_bytes","_maxPos","_ensureSize","ensureSize_fn","ArrayBufferTargetWriter","target","newLength","newBuffer","newBytes","DEFAULT_CHUNK_SIZE","MAX_CHUNKS_AT_ONCE","_target2","_sections","_chunked","_chunkSize","_chunks","_writeDataIntoChunks","writeDataIntoChunks_fn","_insertSectionIntoChunk","insertSectionIntoChunk_fn","_createChunk","createChunk_fn","_flushChunks","flushChunks_fn","StreamTargetWriter","_b","chunks","sorted","b","lastChunk","section","position","chunkIndex","relativePosition","toWrite","low","high","mid","includesPosition","a","force","FileSystemWritableFileStreamTargetWriter","SUPPORTED_VIDEO_CODECS","SUPPORTED_AUDIO_CODECS","TIMESTAMP_OFFSET","FIRST_TIMESTAMP_BEHAVIORS","_options","_writer","_ftypSize","_mdat","_videoTrack","_audioTrack","_creationTime","_finalizedChunks","_nextFragmentNumber","_videoSampleQueue","_audioSampleQueue","_finalized","_validateOptions","validateOptions_fn","_writeHeader","writeHeader_fn","_computeMoovSizeUpperBound","computeMoovSizeUpperBound_fn","_prepareTracks","prepareTracks_fn","_generateMpeg4AudioSpecificConfig","generateMpeg4AudioSpecificConfig_fn","_createSampleForTrack","createSampleForTrack_fn","_addSampleToTrack","addSampleToTrack_fn","_validateTimestamp","validateTimestamp_fn","_finalizeCurrentChunk","finalizeCurrentChunk_fn","_finalizeFragment","finalizeFragment_fn","_maybeFlushStreamingTargetWriter","maybeFlushStreamingTargetWriter_fn","_ensureNotFinalized","ensureNotFinalized_fn","Muxer","meta","timestamp","compositionTimeOffset","videoSample","audioSample","mdatSize","movieBox2","movieBoxSize","currentChunkPos","movieBox","mfraBox","mfraBoxSize","mdatPos","remainingBytes","videoRotation","moovSizeUpperBound","upperBound","sampleCounts","n","guessedCodecPrivate","objectType","sampleRate","numberOfChannels","frequencyIndex","channelConfig","configBits","paddingLength","configBytes","presentationTimestampInSeconds","decodeTimestampInSeconds","durationInSeconds","adjusted","sampleCompositionTimeOffset","timescaleUnits","delta","lastTableEntry","lastCompositionTimeOffsetTableEntry","beginNewChunk","currentChunkDuration","mostImportantTrack","chunkDuration","presentationTimestamp","decodeTimestamp","strictTimestampBehavior","noLastDecodeTimestamp","baseDecodeTimestamp","flushStreamingWriter","fragmentNumber","moofOffset","moofBox","mdatBox","totalTrackSampleSize","newMoofBox","SEGMENT_DURATION","WebAudioPlayer","args","config","muxer","time","segmentIndex","encodedChunks","muxedBuffer","audioBuffer","c","startFrom","currentSegment","segmentOffset","timeUntilEnd","node","startTime","nextSegmentIndex","nextSegment","sourceNode","playbackTime","wasPlaying","currentTime","currentSegmentIndex","EventEmitter","listener","id","listenerId","VideoWorker","params","VideoWorkerConstructor","initialized","videoMetadata","Clock","audioPlayer","videoWorker","clampedTime","now","WebCodecsPlayer","FileWorker","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","videoDebugInfo","videoChannel","trackData"],"mappings":"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","x_google_ignoreList":[0,1,2,3,5]}
1
+ {"version":3,"file":"index.js","sources":["../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../node_modules/uuid/dist/esm-browser/rng.js","../../../node_modules/uuid/dist/esm-browser/native.js","../../../node_modules/uuid/dist/esm-browser/v4.js","../src/utils/WorkerController.ts","../node_modules/mp4-muxer/build/mp4-muxer.mjs","../src/player/renderers/audio/audio.ts","../src/utils/EventEmitter.ts","../src/player/renderers/video/video.ts","../src/player/clock.ts","../src/player/player.ts"],"sourcesContent":["import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random || (options.rng || rng)();\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import { v4 as uuidv4 } from 'uuid';\n\n\nexport interface WorkerMessage {\n cmd: string;\n data: any;\n request_id: string;\n}\n\nexport interface WorkerResponse {\n request_id: string;\n res: any;\n}\n\ninterface GenericObject {\n [key: string]: any;\n}\n\n\n\nexport type WorkerEventHandler = (data: any) => void;\n\nexport class WorkerController {\n private worker: Worker;\n private listeners: Record<string, WorkerEventHandler>;\n private persistentEvents: string[];\n private port?: MessagePort;\n\n constructor(workerUrlOrConstructor: string | URL | (new () => Worker), persistentEvents: string[] = [], port?: MessagePort) {\n // Support both Worker constructor (from ?worker) and URL (from ?worker&url)\n this.worker = typeof workerUrlOrConstructor === 'function'\n ? new workerUrlOrConstructor()\n : new Worker(workerUrlOrConstructor, { type: 'module' });\n this.listeners = {};\n this.persistentEvents = persistentEvents;\n\n this.worker.onmessage = this.handleWorkerMessage.bind(this);\n\n if(port){\n this.port = port;\n this.worker.postMessage({cmd: 'port', data: port}, {transfer: [port]});\n }\n }\n\n\n setupPort(port: MessagePort){\n this.port = port;\n this.worker.postMessage({cmd: 'port', data: port}, {transfer: [port]});\n }\n\n private handleWorkerMessage(event: MessageEvent<WorkerResponse>): void {\n\n if (this.listeners[event.data.request_id]) {\n this.listeners[event.data.request_id](event.data.res);\n\n // Clean up non-persistent listeners\n if (!this.persistentEvents.includes(event.data.request_id)) {\n delete this.listeners[event.data.request_id];\n }\n }\n }\n\n public addPersistentListener(eventName: string, handler: WorkerEventHandler): void {\n if (!this.persistentEvents.includes(eventName)) {\n this.persistentEvents.push(eventName);\n }\n this.listeners[eventName] = handler;\n }\n\n public async sendMessage<T>(\n cmd: string, \n data: any = {}, \n transfer: Transferable[] = [],\n sanitize: boolean = true\n ): Promise<T> {\n const request_id = uuidv4();\n const sanitizedData = sanitize ? sanitizeForWorker(data) : data;\n\n return new Promise((resolve, reject) => {\n try {\n const message: WorkerMessage = {\n cmd,\n request_id,\n data: sanitizedData\n };\n\n\n \n\n\n this.worker.postMessage(message, transfer);\n \n this.listeners[request_id] = (response: T) => {\n resolve(response);\n };\n } catch (error) {\n reject(new Error('Failed to send message to worker: ' + error));\n }\n });\n }\n\n public terminate(): void {\n this.worker.terminate();\n this.listeners = {};\n }\n} \n\n\n\nfunction sanitizeForWorker(obj: GenericObject): GenericObject {\n // Handle null or primitive values\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n\n const special_types = [\n ArrayBuffer,\n Blob,\n EncodedVideoChunk,\n ImageBitmap,\n EncodedAudioChunk,\n OffscreenCanvas,\n Uint8Array,\n VideoFrame,\n FileSystemFileHandle,\n MessageChannel,\n MessagePort\n ]\n\n // Handle special cases\n\n for (const type of special_types) {\n if(obj instanceof type) {\n return obj;\n }\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map(item => sanitizeForWorker(item));\n }\n\n // Get raw object if it's a Vue Proxy\n const rawObj = obj && obj.__v_raw ? obj.__v_raw : obj;\n\n // Create a new object to store sanitized properties\n const sanitized: GenericObject = {};\n\n // Process each property\n for (const key in rawObj) {\n // Skip Vue internal properties\n if (key.startsWith('__v_')) {\n continue;\n }\n\n const value = rawObj[key];\n\n // Skip functions\n if (typeof value === 'function') {\n continue;\n }\n\n // Recursively sanitize nested objects\n sanitized[key ] = sanitizeForWorker(value);\n }\n\n return sanitized;\n}\n","var __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n __accessCheck(obj, member, \"read from private field\");\n return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n __accessCheck(obj, member, \"write to private field\");\n setter ? setter.call(obj, value) : member.set(obj, value);\n return value;\n};\nvar __privateWrapper = (obj, member, setter, getter) => ({\n set _(value) {\n __privateSet(obj, member, value, setter);\n },\n get _() {\n return __privateGet(obj, member, getter);\n }\n});\nvar __privateMethod = (obj, member, method) => {\n __accessCheck(obj, member, \"access private method\");\n return method;\n};\n\n// src/misc.ts\nvar bytes = new Uint8Array(8);\nvar view = new DataView(bytes.buffer);\nvar u8 = (value) => {\n return [(value % 256 + 256) % 256];\n};\nvar u16 = (value) => {\n view.setUint16(0, value, false);\n return [bytes[0], bytes[1]];\n};\nvar i16 = (value) => {\n view.setInt16(0, value, false);\n return [bytes[0], bytes[1]];\n};\nvar u24 = (value) => {\n view.setUint32(0, value, false);\n return [bytes[1], bytes[2], bytes[3]];\n};\nvar u32 = (value) => {\n view.setUint32(0, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar i32 = (value) => {\n view.setInt32(0, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar u64 = (value) => {\n view.setUint32(0, Math.floor(value / 2 ** 32), false);\n view.setUint32(4, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7]];\n};\nvar fixed_8_8 = (value) => {\n view.setInt16(0, 2 ** 8 * value, false);\n return [bytes[0], bytes[1]];\n};\nvar fixed_16_16 = (value) => {\n view.setInt32(0, 2 ** 16 * value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar fixed_2_30 = (value) => {\n view.setInt32(0, 2 ** 30 * value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar ascii = (text, nullTerminated = false) => {\n let bytes2 = Array(text.length).fill(null).map((_, i) => text.charCodeAt(i));\n if (nullTerminated)\n bytes2.push(0);\n return bytes2;\n};\nvar last = (arr) => {\n return arr && arr[arr.length - 1];\n};\nvar lastPresentedSample = (samples) => {\n let result = void 0;\n for (let sample of samples) {\n if (!result || sample.presentationTimestamp > result.presentationTimestamp) {\n result = sample;\n }\n }\n return result;\n};\nvar intoTimescale = (timeInSeconds, timescale, round = true) => {\n let value = timeInSeconds * timescale;\n return round ? Math.round(value) : value;\n};\nvar rotationMatrix = (rotationInDegrees) => {\n let theta = rotationInDegrees * (Math.PI / 180);\n let cosTheta = Math.cos(theta);\n let sinTheta = Math.sin(theta);\n return [\n cosTheta,\n sinTheta,\n 0,\n -sinTheta,\n cosTheta,\n 0,\n 0,\n 0,\n 1\n ];\n};\nvar IDENTITY_MATRIX = rotationMatrix(0);\nvar matrixToBytes = (matrix) => {\n return [\n fixed_16_16(matrix[0]),\n fixed_16_16(matrix[1]),\n fixed_2_30(matrix[2]),\n fixed_16_16(matrix[3]),\n fixed_16_16(matrix[4]),\n fixed_2_30(matrix[5]),\n fixed_16_16(matrix[6]),\n fixed_16_16(matrix[7]),\n fixed_2_30(matrix[8])\n ];\n};\nvar deepClone = (x) => {\n if (!x)\n return x;\n if (typeof x !== \"object\")\n return x;\n if (Array.isArray(x))\n return x.map(deepClone);\n return Object.fromEntries(Object.entries(x).map(([key, value]) => [key, deepClone(value)]));\n};\nvar isU32 = (value) => {\n return value >= 0 && value < 2 ** 32;\n};\n\n// src/box.ts\nvar box = (type, contents, children) => ({\n type,\n contents: contents && new Uint8Array(contents.flat(10)),\n children\n});\nvar fullBox = (type, version, flags, contents, children) => box(\n type,\n [u8(version), u24(flags), contents ?? []],\n children\n);\nvar ftyp = (details) => {\n let minorVersion = 512;\n if (details.fragmented)\n return box(\"ftyp\", [\n ascii(\"iso5\"),\n // Major brand\n u32(minorVersion),\n // Minor version\n // Compatible brands\n ascii(\"iso5\"),\n ascii(\"iso6\"),\n ascii(\"mp41\")\n ]);\n return box(\"ftyp\", [\n ascii(\"isom\"),\n // Major brand\n u32(minorVersion),\n // Minor version\n // Compatible brands\n ascii(\"isom\"),\n details.holdsAvc ? ascii(\"avc1\") : [],\n ascii(\"mp41\")\n ]);\n};\nvar mdat = (reserveLargeSize) => ({ type: \"mdat\", largeSize: reserveLargeSize });\nvar free = (size) => ({ type: \"free\", size });\nvar moov = (tracks, creationTime, fragmented = false) => box(\"moov\", null, [\n mvhd(creationTime, tracks),\n ...tracks.map((x) => trak(x, creationTime)),\n fragmented ? mvex(tracks) : null\n]);\nvar mvhd = (creationTime, tracks) => {\n let duration = intoTimescale(Math.max(\n 0,\n ...tracks.filter((x) => x.samples.length > 0).map((x) => {\n const lastSample = lastPresentedSample(x.samples);\n return lastSample.presentationTimestamp + lastSample.duration;\n })\n ), GLOBAL_TIMESCALE);\n let nextTrackId = Math.max(...tracks.map((x) => x.id)) + 1;\n let needsU64 = !isU32(creationTime) || !isU32(duration);\n let u32OrU64 = needsU64 ? u64 : u32;\n return fullBox(\"mvhd\", +needsU64, 0, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(GLOBAL_TIMESCALE),\n // Timescale\n u32OrU64(duration),\n // Duration\n fixed_16_16(1),\n // Preferred rate\n fixed_8_8(1),\n // Preferred volume\n Array(10).fill(0),\n // Reserved\n matrixToBytes(IDENTITY_MATRIX),\n // Matrix\n Array(24).fill(0),\n // Pre-defined\n u32(nextTrackId)\n // Next track ID\n ]);\n};\nvar trak = (track, creationTime) => box(\"trak\", null, [\n tkhd(track, creationTime),\n mdia(track, creationTime)\n]);\nvar tkhd = (track, creationTime) => {\n let lastSample = lastPresentedSample(track.samples);\n let durationInGlobalTimescale = intoTimescale(\n lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0,\n GLOBAL_TIMESCALE\n );\n let needsU64 = !isU32(creationTime) || !isU32(durationInGlobalTimescale);\n let u32OrU64 = needsU64 ? u64 : u32;\n let matrix;\n if (track.info.type === \"video\") {\n matrix = typeof track.info.rotation === \"number\" ? rotationMatrix(track.info.rotation) : track.info.rotation;\n } else {\n matrix = IDENTITY_MATRIX;\n }\n return fullBox(\"tkhd\", +needsU64, 3, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(track.id),\n // Track ID\n u32(0),\n // Reserved\n u32OrU64(durationInGlobalTimescale),\n // Duration\n Array(8).fill(0),\n // Reserved\n u16(0),\n // Layer\n u16(0),\n // Alternate group\n fixed_8_8(track.info.type === \"audio\" ? 1 : 0),\n // Volume\n u16(0),\n // Reserved\n matrixToBytes(matrix),\n // Matrix\n fixed_16_16(track.info.type === \"video\" ? track.info.width : 0),\n // Track width\n fixed_16_16(track.info.type === \"video\" ? track.info.height : 0)\n // Track height\n ]);\n};\nvar mdia = (track, creationTime) => box(\"mdia\", null, [\n mdhd(track, creationTime),\n hdlr(track.info.type === \"video\" ? \"vide\" : \"soun\"),\n minf(track)\n]);\nvar mdhd = (track, creationTime) => {\n let lastSample = lastPresentedSample(track.samples);\n let localDuration = intoTimescale(\n lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0,\n track.timescale\n );\n let needsU64 = !isU32(creationTime) || !isU32(localDuration);\n let u32OrU64 = needsU64 ? u64 : u32;\n return fullBox(\"mdhd\", +needsU64, 0, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(track.timescale),\n // Timescale\n u32OrU64(localDuration),\n // Duration\n u16(21956),\n // Language (\"und\", undetermined)\n u16(0)\n // Quality\n ]);\n};\nvar hdlr = (componentSubtype) => fullBox(\"hdlr\", 0, 0, [\n ascii(\"mhlr\"),\n // Component type\n ascii(componentSubtype),\n // Component subtype\n u32(0),\n // Component manufacturer\n u32(0),\n // Component flags\n u32(0),\n // Component flags mask\n ascii(\"mp4-muxer-hdlr\", true)\n // Component name\n]);\nvar minf = (track) => box(\"minf\", null, [\n track.info.type === \"video\" ? vmhd() : smhd(),\n dinf(),\n stbl(track)\n]);\nvar vmhd = () => fullBox(\"vmhd\", 0, 1, [\n u16(0),\n // Graphics mode\n u16(0),\n // Opcolor R\n u16(0),\n // Opcolor G\n u16(0)\n // Opcolor B\n]);\nvar smhd = () => fullBox(\"smhd\", 0, 0, [\n u16(0),\n // Balance\n u16(0)\n // Reserved\n]);\nvar dinf = () => box(\"dinf\", null, [\n dref()\n]);\nvar dref = () => fullBox(\"dref\", 0, 0, [\n u32(1)\n // Entry count\n], [\n url()\n]);\nvar url = () => fullBox(\"url \", 0, 1);\nvar stbl = (track) => {\n const needsCtts = track.compositionTimeOffsetTable.length > 1 || track.compositionTimeOffsetTable.some((x) => x.sampleCompositionTimeOffset !== 0);\n return box(\"stbl\", null, [\n stsd(track),\n stts(track),\n stss(track),\n stsc(track),\n stsz(track),\n stco(track),\n needsCtts ? ctts(track) : null\n ]);\n};\nvar stsd = (track) => fullBox(\"stsd\", 0, 0, [\n u32(1)\n // Entry count\n], [\n track.info.type === \"video\" ? videoSampleDescription(\n VIDEO_CODEC_TO_BOX_NAME[track.info.codec],\n track\n ) : soundSampleDescription(\n AUDIO_CODEC_TO_BOX_NAME[track.info.codec],\n track\n )\n]);\nvar videoSampleDescription = (compressionType, track) => box(compressionType, [\n Array(6).fill(0),\n // Reserved\n u16(1),\n // Data reference index\n u16(0),\n // Pre-defined\n u16(0),\n // Reserved\n Array(12).fill(0),\n // Pre-defined\n u16(track.info.width),\n // Width\n u16(track.info.height),\n // Height\n u32(4718592),\n // Horizontal resolution\n u32(4718592),\n // Vertical resolution\n u32(0),\n // Reserved\n u16(1),\n // Frame count\n Array(32).fill(0),\n // Compressor name\n u16(24),\n // Depth\n i16(65535)\n // Pre-defined\n], [\n VIDEO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track),\n track.info.decoderConfig.colorSpace ? colr(track) : null\n]);\nvar COLOR_PRIMARIES_MAP = {\n \"bt709\": 1,\n // ITU-R BT.709\n \"bt470bg\": 5,\n // ITU-R BT.470BG\n \"smpte170m\": 6\n // ITU-R BT.601 525 - SMPTE 170M\n};\nvar TRANSFER_CHARACTERISTICS_MAP = {\n \"bt709\": 1,\n // ITU-R BT.709\n \"smpte170m\": 6,\n // SMPTE 170M\n \"iec61966-2-1\": 13\n // IEC 61966-2-1\n};\nvar MATRIX_COEFFICIENTS_MAP = {\n \"rgb\": 0,\n // Identity\n \"bt709\": 1,\n // ITU-R BT.709\n \"bt470bg\": 5,\n // ITU-R BT.470BG\n \"smpte170m\": 6\n // SMPTE 170M\n};\nvar colr = (track) => box(\"colr\", [\n ascii(\"nclx\"),\n // Colour type\n u16(COLOR_PRIMARIES_MAP[track.info.decoderConfig.colorSpace.primaries]),\n // Colour primaries\n u16(TRANSFER_CHARACTERISTICS_MAP[track.info.decoderConfig.colorSpace.transfer]),\n // Transfer characteristics\n u16(MATRIX_COEFFICIENTS_MAP[track.info.decoderConfig.colorSpace.matrix]),\n // Matrix coefficients\n u8((track.info.decoderConfig.colorSpace.fullRange ? 1 : 0) << 7)\n // Full range flag\n]);\nvar avcC = (track) => track.info.decoderConfig && box(\"avcC\", [\n // For AVC, description is an AVCDecoderConfigurationRecord, so nothing else to do here\n ...new Uint8Array(track.info.decoderConfig.description)\n]);\nvar hvcC = (track) => track.info.decoderConfig && box(\"hvcC\", [\n // For HEVC, description is a HEVCDecoderConfigurationRecord, so nothing else to do here\n ...new Uint8Array(track.info.decoderConfig.description)\n]);\nvar vpcC = (track) => {\n if (!track.info.decoderConfig) {\n return null;\n }\n let decoderConfig = track.info.decoderConfig;\n if (!decoderConfig.colorSpace) {\n throw new Error(`'colorSpace' is required in the decoder config for VP9.`);\n }\n let parts = decoderConfig.codec.split(\".\");\n let profile = Number(parts[1]);\n let level = Number(parts[2]);\n let bitDepth = Number(parts[3]);\n let chromaSubsampling = 0;\n let thirdByte = (bitDepth << 4) + (chromaSubsampling << 1) + Number(decoderConfig.colorSpace.fullRange);\n let colourPrimaries = 2;\n let transferCharacteristics = 2;\n let matrixCoefficients = 2;\n return fullBox(\"vpcC\", 1, 0, [\n u8(profile),\n // Profile\n u8(level),\n // Level\n u8(thirdByte),\n // Bit depth, chroma subsampling, full range\n u8(colourPrimaries),\n // Colour primaries\n u8(transferCharacteristics),\n // Transfer characteristics\n u8(matrixCoefficients),\n // Matrix coefficients\n u16(0)\n // Codec initialization data size\n ]);\n};\nvar av1C = () => {\n let marker = 1;\n let version = 1;\n let firstByte = (marker << 7) + version;\n return box(\"av1C\", [\n firstByte,\n 0,\n 0,\n 0\n ]);\n};\nvar soundSampleDescription = (compressionType, track) => box(compressionType, [\n Array(6).fill(0),\n // Reserved\n u16(1),\n // Data reference index\n u16(0),\n // Version\n u16(0),\n // Revision level\n u32(0),\n // Vendor\n u16(track.info.numberOfChannels),\n // Number of channels\n u16(16),\n // Sample size (bits)\n u16(0),\n // Compression ID\n u16(0),\n // Packet size\n fixed_16_16(track.info.sampleRate)\n // Sample rate\n], [\n AUDIO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track)\n]);\nvar esds = (track) => {\n let description = new Uint8Array(track.info.decoderConfig.description);\n return fullBox(\"esds\", 0, 0, [\n // https://stackoverflow.com/a/54803118\n u32(58753152),\n // TAG(3) = Object Descriptor ([2])\n u8(32 + description.byteLength),\n // length of this OD (which includes the next 2 tags)\n u16(1),\n // ES_ID = 1\n u8(0),\n // flags etc = 0\n u32(75530368),\n // TAG(4) = ES Descriptor ([2]) embedded in above OD\n u8(18 + description.byteLength),\n // length of this ESD\n u8(64),\n // MPEG-4 Audio\n u8(21),\n // stream type(6bits)=5 audio, flags(2bits)=1\n u24(0),\n // 24bit buffer size\n u32(130071),\n // max bitrate\n u32(130071),\n // avg bitrate\n u32(92307584),\n // TAG(5) = ASC ([2],[3]) embedded in above OD\n u8(description.byteLength),\n // length\n ...description,\n u32(109084800),\n // TAG(6)\n u8(1),\n // length\n u8(2)\n // data\n ]);\n};\nvar dOps = (track) => {\n let preskip = 3840;\n let gain = 0;\n const description = track.info.decoderConfig?.description;\n if (description) {\n if (description.byteLength < 18) {\n throw new TypeError(\"Invalid decoder description provided for Opus; must be at least 18 bytes long.\");\n }\n const view2 = ArrayBuffer.isView(description) ? new DataView(description.buffer, description.byteOffset, description.byteLength) : new DataView(description);\n preskip = view2.getUint16(10, true);\n gain = view2.getInt16(14, true);\n }\n return box(\"dOps\", [\n u8(0),\n // Version\n u8(track.info.numberOfChannels),\n // OutputChannelCount\n u16(preskip),\n u32(track.info.sampleRate),\n // InputSampleRate\n fixed_8_8(gain),\n // OutputGain\n u8(0)\n // ChannelMappingFamily\n ]);\n};\nvar stts = (track) => {\n return fullBox(\"stts\", 0, 0, [\n u32(track.timeToSampleTable.length),\n // Number of entries\n track.timeToSampleTable.map((x) => [\n // Time-to-sample table\n u32(x.sampleCount),\n // Sample count\n u32(x.sampleDelta)\n // Sample duration\n ])\n ]);\n};\nvar stss = (track) => {\n if (track.samples.every((x) => x.type === \"key\"))\n return null;\n let keySamples = [...track.samples.entries()].filter(([, sample]) => sample.type === \"key\");\n return fullBox(\"stss\", 0, 0, [\n u32(keySamples.length),\n // Number of entries\n keySamples.map(([index]) => u32(index + 1))\n // Sync sample table\n ]);\n};\nvar stsc = (track) => {\n return fullBox(\"stsc\", 0, 0, [\n u32(track.compactlyCodedChunkTable.length),\n // Number of entries\n track.compactlyCodedChunkTable.map((x) => [\n // Sample-to-chunk table\n u32(x.firstChunk),\n // First chunk\n u32(x.samplesPerChunk),\n // Samples per chunk\n u32(1)\n // Sample description index\n ])\n ]);\n};\nvar stsz = (track) => fullBox(\"stsz\", 0, 0, [\n u32(0),\n // Sample size (0 means non-constant size)\n u32(track.samples.length),\n // Number of entries\n track.samples.map((x) => u32(x.size))\n // Sample size table\n]);\nvar stco = (track) => {\n if (track.finalizedChunks.length > 0 && last(track.finalizedChunks).offset >= 2 ** 32) {\n return fullBox(\"co64\", 0, 0, [\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((x) => u64(x.offset))\n // Chunk offset table\n ]);\n }\n return fullBox(\"stco\", 0, 0, [\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((x) => u32(x.offset))\n // Chunk offset table\n ]);\n};\nvar ctts = (track) => {\n return fullBox(\"ctts\", 0, 0, [\n u32(track.compositionTimeOffsetTable.length),\n // Number of entries\n track.compositionTimeOffsetTable.map((x) => [\n // Time-to-sample table\n u32(x.sampleCount),\n // Sample count\n u32(x.sampleCompositionTimeOffset)\n // Sample offset\n ])\n ]);\n};\nvar mvex = (tracks) => {\n return box(\"mvex\", null, tracks.map(trex));\n};\nvar trex = (track) => {\n return fullBox(\"trex\", 0, 0, [\n u32(track.id),\n // Track ID\n u32(1),\n // Default sample description index\n u32(0),\n // Default sample duration\n u32(0),\n // Default sample size\n u32(0)\n // Default sample flags\n ]);\n};\nvar moof = (sequenceNumber, tracks) => {\n return box(\"moof\", null, [\n mfhd(sequenceNumber),\n ...tracks.map(traf)\n ]);\n};\nvar mfhd = (sequenceNumber) => {\n return fullBox(\"mfhd\", 0, 0, [\n u32(sequenceNumber)\n // Sequence number\n ]);\n};\nvar fragmentSampleFlags = (sample) => {\n let byte1 = 0;\n let byte2 = 0;\n let byte3 = 0;\n let byte4 = 0;\n let sampleIsDifferenceSample = sample.type === \"delta\";\n byte2 |= +sampleIsDifferenceSample;\n if (sampleIsDifferenceSample) {\n byte1 |= 1;\n } else {\n byte1 |= 2;\n }\n return byte1 << 24 | byte2 << 16 | byte3 << 8 | byte4;\n};\nvar traf = (track) => {\n return box(\"traf\", null, [\n tfhd(track),\n tfdt(track),\n trun(track)\n ]);\n};\nvar tfhd = (track) => {\n let tfFlags = 0;\n tfFlags |= 8;\n tfFlags |= 16;\n tfFlags |= 32;\n tfFlags |= 131072;\n let referenceSample = track.currentChunk.samples[1] ?? track.currentChunk.samples[0];\n let referenceSampleInfo = {\n duration: referenceSample.timescaleUnitsToNextSample,\n size: referenceSample.size,\n flags: fragmentSampleFlags(referenceSample)\n };\n return fullBox(\"tfhd\", 0, tfFlags, [\n u32(track.id),\n // Track ID\n u32(referenceSampleInfo.duration),\n // Default sample duration\n u32(referenceSampleInfo.size),\n // Default sample size\n u32(referenceSampleInfo.flags)\n // Default sample flags\n ]);\n};\nvar tfdt = (track) => {\n return fullBox(\"tfdt\", 1, 0, [\n u64(intoTimescale(track.currentChunk.startTimestamp, track.timescale))\n // Base Media Decode Time\n ]);\n};\nvar trun = (track) => {\n let allSampleDurations = track.currentChunk.samples.map((x) => x.timescaleUnitsToNextSample);\n let allSampleSizes = track.currentChunk.samples.map((x) => x.size);\n let allSampleFlags = track.currentChunk.samples.map(fragmentSampleFlags);\n let allSampleCompositionTimeOffsets = track.currentChunk.samples.map((x) => intoTimescale(x.presentationTimestamp - x.decodeTimestamp, track.timescale));\n let uniqueSampleDurations = new Set(allSampleDurations);\n let uniqueSampleSizes = new Set(allSampleSizes);\n let uniqueSampleFlags = new Set(allSampleFlags);\n let uniqueSampleCompositionTimeOffsets = new Set(allSampleCompositionTimeOffsets);\n let firstSampleFlagsPresent = uniqueSampleFlags.size === 2 && allSampleFlags[0] !== allSampleFlags[1];\n let sampleDurationPresent = uniqueSampleDurations.size > 1;\n let sampleSizePresent = uniqueSampleSizes.size > 1;\n let sampleFlagsPresent = !firstSampleFlagsPresent && uniqueSampleFlags.size > 1;\n let sampleCompositionTimeOffsetsPresent = uniqueSampleCompositionTimeOffsets.size > 1 || [...uniqueSampleCompositionTimeOffsets].some((x) => x !== 0);\n let flags = 0;\n flags |= 1;\n flags |= 4 * +firstSampleFlagsPresent;\n flags |= 256 * +sampleDurationPresent;\n flags |= 512 * +sampleSizePresent;\n flags |= 1024 * +sampleFlagsPresent;\n flags |= 2048 * +sampleCompositionTimeOffsetsPresent;\n return fullBox(\"trun\", 1, flags, [\n u32(track.currentChunk.samples.length),\n // Sample count\n u32(track.currentChunk.offset - track.currentChunk.moofOffset || 0),\n // Data offset\n firstSampleFlagsPresent ? u32(allSampleFlags[0]) : [],\n track.currentChunk.samples.map((_, i) => [\n sampleDurationPresent ? u32(allSampleDurations[i]) : [],\n // Sample duration\n sampleSizePresent ? u32(allSampleSizes[i]) : [],\n // Sample size\n sampleFlagsPresent ? u32(allSampleFlags[i]) : [],\n // Sample flags\n // Sample composition time offsets\n sampleCompositionTimeOffsetsPresent ? i32(allSampleCompositionTimeOffsets[i]) : []\n ])\n ]);\n};\nvar mfra = (tracks) => {\n return box(\"mfra\", null, [\n ...tracks.map(tfra),\n mfro()\n ]);\n};\nvar tfra = (track, trackIndex) => {\n let version = 1;\n return fullBox(\"tfra\", version, 0, [\n u32(track.id),\n // Track ID\n u32(63),\n // This specifies that traf number, trun number and sample number are 32-bit ints\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((chunk) => [\n u64(intoTimescale(chunk.startTimestamp, track.timescale)),\n // Time\n u64(chunk.moofOffset),\n // moof offset\n u32(trackIndex + 1),\n // traf number\n u32(1),\n // trun number\n u32(1)\n // Sample number\n ])\n ]);\n};\nvar mfro = () => {\n return fullBox(\"mfro\", 0, 0, [\n // This value needs to be overwritten manually from the outside, where the actual size of the enclosing mfra box\n // is known\n u32(0)\n // Size\n ]);\n};\nvar VIDEO_CODEC_TO_BOX_NAME = {\n \"avc\": \"avc1\",\n \"hevc\": \"hvc1\",\n \"vp9\": \"vp09\",\n \"av1\": \"av01\"\n};\nvar VIDEO_CODEC_TO_CONFIGURATION_BOX = {\n \"avc\": avcC,\n \"hevc\": hvcC,\n \"vp9\": vpcC,\n \"av1\": av1C\n};\nvar AUDIO_CODEC_TO_BOX_NAME = {\n \"aac\": \"mp4a\",\n \"opus\": \"Opus\"\n};\nvar AUDIO_CODEC_TO_CONFIGURATION_BOX = {\n \"aac\": esds,\n \"opus\": dOps\n};\n\n// src/target.ts\nvar isTarget = Symbol(\"isTarget\");\nvar Target = class {\n};\nisTarget;\nvar ArrayBufferTarget = class extends Target {\n constructor() {\n super(...arguments);\n this.buffer = null;\n }\n};\nvar StreamTarget = class extends Target {\n constructor(options) {\n super();\n this.options = options;\n if (typeof options !== \"object\") {\n throw new TypeError(\"StreamTarget requires an options object to be passed to its constructor.\");\n }\n if (options.onData) {\n if (typeof options.onData !== \"function\") {\n throw new TypeError(\"options.onData, when provided, must be a function.\");\n }\n if (options.onData.length < 2) {\n throw new TypeError(\n \"options.onData, when provided, must be a function that takes in at least two arguments (data and position). Ignoring the position argument, which specifies the byte offset at which the data is to be written, can lead to broken outputs.\"\n );\n }\n }\n if (options.chunked !== void 0 && typeof options.chunked !== \"boolean\") {\n throw new TypeError(\"options.chunked, when provided, must be a boolean.\");\n }\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize < 1024)) {\n throw new TypeError(\"options.chunkSize, when provided, must be an integer and not smaller than 1024.\");\n }\n }\n};\nvar FileSystemWritableFileStreamTarget = class extends Target {\n constructor(stream, options) {\n super();\n this.stream = stream;\n this.options = options;\n if (!(stream instanceof FileSystemWritableFileStream)) {\n throw new TypeError(\"FileSystemWritableFileStreamTarget requires a FileSystemWritableFileStream instance.\");\n }\n if (options !== void 0 && typeof options !== \"object\") {\n throw new TypeError(\"FileSystemWritableFileStreamTarget's options, when provided, must be an object.\");\n }\n if (options) {\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize <= 0)) {\n throw new TypeError(\"options.chunkSize, when provided, must be a positive integer\");\n }\n }\n }\n};\n\n// src/writer.ts\nvar _helper, _helperView;\nvar Writer = class {\n constructor() {\n this.pos = 0;\n __privateAdd(this, _helper, new Uint8Array(8));\n __privateAdd(this, _helperView, new DataView(__privateGet(this, _helper).buffer));\n /**\n * Stores the position from the start of the file to where boxes elements have been written. This is used to\n * rewrite/edit elements that were already added before, and to measure sizes of things.\n */\n this.offsets = /* @__PURE__ */ new WeakMap();\n }\n /** Sets the current position for future writes to a new one. */\n seek(newPos) {\n this.pos = newPos;\n }\n writeU32(value) {\n __privateGet(this, _helperView).setUint32(0, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 4));\n }\n writeU64(value) {\n __privateGet(this, _helperView).setUint32(0, Math.floor(value / 2 ** 32), false);\n __privateGet(this, _helperView).setUint32(4, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 8));\n }\n writeAscii(text) {\n for (let i = 0; i < text.length; i++) {\n __privateGet(this, _helperView).setUint8(i % 8, text.charCodeAt(i));\n if (i % 8 === 7)\n this.write(__privateGet(this, _helper));\n }\n if (text.length % 8 !== 0) {\n this.write(__privateGet(this, _helper).subarray(0, text.length % 8));\n }\n }\n writeBox(box2) {\n this.offsets.set(box2, this.pos);\n if (box2.contents && !box2.children) {\n this.writeBoxHeader(box2, box2.size ?? box2.contents.byteLength + 8);\n this.write(box2.contents);\n } else {\n let startPos = this.pos;\n this.writeBoxHeader(box2, 0);\n if (box2.contents)\n this.write(box2.contents);\n if (box2.children) {\n for (let child of box2.children)\n if (child)\n this.writeBox(child);\n }\n let endPos = this.pos;\n let size = box2.size ?? endPos - startPos;\n this.seek(startPos);\n this.writeBoxHeader(box2, size);\n this.seek(endPos);\n }\n }\n writeBoxHeader(box2, size) {\n this.writeU32(box2.largeSize ? 1 : size);\n this.writeAscii(box2.type);\n if (box2.largeSize)\n this.writeU64(size);\n }\n measureBoxHeader(box2) {\n return 8 + (box2.largeSize ? 8 : 0);\n }\n patchBox(box2) {\n let endPos = this.pos;\n this.seek(this.offsets.get(box2));\n this.writeBox(box2);\n this.seek(endPos);\n }\n measureBox(box2) {\n if (box2.contents && !box2.children) {\n let headerSize = this.measureBoxHeader(box2);\n return headerSize + box2.contents.byteLength;\n } else {\n let result = this.measureBoxHeader(box2);\n if (box2.contents)\n result += box2.contents.byteLength;\n if (box2.children) {\n for (let child of box2.children)\n if (child)\n result += this.measureBox(child);\n }\n return result;\n }\n }\n};\n_helper = new WeakMap();\n_helperView = new WeakMap();\nvar _target, _buffer, _bytes, _maxPos, _ensureSize, ensureSize_fn;\nvar ArrayBufferTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _ensureSize);\n __privateAdd(this, _target, void 0);\n __privateAdd(this, _buffer, new ArrayBuffer(2 ** 16));\n __privateAdd(this, _bytes, new Uint8Array(__privateGet(this, _buffer)));\n __privateAdd(this, _maxPos, 0);\n __privateSet(this, _target, target);\n }\n write(data) {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos + data.byteLength);\n __privateGet(this, _bytes).set(data, this.pos);\n this.pos += data.byteLength;\n __privateSet(this, _maxPos, Math.max(__privateGet(this, _maxPos), this.pos));\n }\n finalize() {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos);\n __privateGet(this, _target).buffer = __privateGet(this, _buffer).slice(0, Math.max(__privateGet(this, _maxPos), this.pos));\n }\n};\n_target = new WeakMap();\n_buffer = new WeakMap();\n_bytes = new WeakMap();\n_maxPos = new WeakMap();\n_ensureSize = new WeakSet();\nensureSize_fn = function(size) {\n let newLength = __privateGet(this, _buffer).byteLength;\n while (newLength < size)\n newLength *= 2;\n if (newLength === __privateGet(this, _buffer).byteLength)\n return;\n let newBuffer = new ArrayBuffer(newLength);\n let newBytes = new Uint8Array(newBuffer);\n newBytes.set(__privateGet(this, _bytes), 0);\n __privateSet(this, _buffer, newBuffer);\n __privateSet(this, _bytes, newBytes);\n};\nvar DEFAULT_CHUNK_SIZE = 2 ** 24;\nvar MAX_CHUNKS_AT_ONCE = 2;\nvar _target2, _sections, _chunked, _chunkSize, _chunks, _writeDataIntoChunks, writeDataIntoChunks_fn, _insertSectionIntoChunk, insertSectionIntoChunk_fn, _createChunk, createChunk_fn, _flushChunks, flushChunks_fn;\nvar StreamTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _writeDataIntoChunks);\n __privateAdd(this, _insertSectionIntoChunk);\n __privateAdd(this, _createChunk);\n __privateAdd(this, _flushChunks);\n __privateAdd(this, _target2, void 0);\n __privateAdd(this, _sections, []);\n __privateAdd(this, _chunked, void 0);\n __privateAdd(this, _chunkSize, void 0);\n /**\n * The data is divided up into fixed-size chunks, whose contents are first filled in RAM and then flushed out.\n * A chunk is flushed if all of its contents have been written.\n */\n __privateAdd(this, _chunks, []);\n __privateSet(this, _target2, target);\n __privateSet(this, _chunked, target.options?.chunked ?? false);\n __privateSet(this, _chunkSize, target.options?.chunkSize ?? DEFAULT_CHUNK_SIZE);\n }\n write(data) {\n __privateGet(this, _sections).push({\n data: data.slice(),\n start: this.pos\n });\n this.pos += data.byteLength;\n }\n flush() {\n if (__privateGet(this, _sections).length === 0)\n return;\n let chunks = [];\n let sorted = [...__privateGet(this, _sections)].sort((a, b) => a.start - b.start);\n chunks.push({\n start: sorted[0].start,\n size: sorted[0].data.byteLength\n });\n for (let i = 1; i < sorted.length; i++) {\n let lastChunk = chunks[chunks.length - 1];\n let section = sorted[i];\n if (section.start <= lastChunk.start + lastChunk.size) {\n lastChunk.size = Math.max(lastChunk.size, section.start + section.data.byteLength - lastChunk.start);\n } else {\n chunks.push({\n start: section.start,\n size: section.data.byteLength\n });\n }\n }\n for (let chunk of chunks) {\n chunk.data = new Uint8Array(chunk.size);\n for (let section of __privateGet(this, _sections)) {\n if (chunk.start <= section.start && section.start < chunk.start + chunk.size) {\n chunk.data.set(section.data, section.start - chunk.start);\n }\n }\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, chunk.data, chunk.start);\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n } else {\n __privateGet(this, _target2).options.onData?.(chunk.data, chunk.start);\n }\n }\n __privateGet(this, _sections).length = 0;\n }\n finalize() {\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this, true);\n }\n }\n};\n_target2 = new WeakMap();\n_sections = new WeakMap();\n_chunked = new WeakMap();\n_chunkSize = new WeakMap();\n_chunks = new WeakMap();\n_writeDataIntoChunks = new WeakSet();\nwriteDataIntoChunks_fn = function(data, position) {\n let chunkIndex = __privateGet(this, _chunks).findIndex((x) => x.start <= position && position < x.start + __privateGet(this, _chunkSize));\n if (chunkIndex === -1)\n chunkIndex = __privateMethod(this, _createChunk, createChunk_fn).call(this, position);\n let chunk = __privateGet(this, _chunks)[chunkIndex];\n let relativePosition = position - chunk.start;\n let toWrite = data.subarray(0, Math.min(__privateGet(this, _chunkSize) - relativePosition, data.byteLength));\n chunk.data.set(toWrite, relativePosition);\n let section = {\n start: relativePosition,\n end: relativePosition + toWrite.byteLength\n };\n __privateMethod(this, _insertSectionIntoChunk, insertSectionIntoChunk_fn).call(this, chunk, section);\n if (chunk.written[0].start === 0 && chunk.written[0].end === __privateGet(this, _chunkSize)) {\n chunk.shouldFlush = true;\n }\n if (__privateGet(this, _chunks).length > MAX_CHUNKS_AT_ONCE) {\n for (let i = 0; i < __privateGet(this, _chunks).length - 1; i++) {\n __privateGet(this, _chunks)[i].shouldFlush = true;\n }\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n }\n if (toWrite.byteLength < data.byteLength) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, data.subarray(toWrite.byteLength), position + toWrite.byteLength);\n }\n};\n_insertSectionIntoChunk = new WeakSet();\ninsertSectionIntoChunk_fn = function(chunk, section) {\n let low = 0;\n let high = chunk.written.length - 1;\n let index = -1;\n while (low <= high) {\n let mid = Math.floor(low + (high - low + 1) / 2);\n if (chunk.written[mid].start <= section.start) {\n low = mid + 1;\n index = mid;\n } else {\n high = mid - 1;\n }\n }\n chunk.written.splice(index + 1, 0, section);\n if (index === -1 || chunk.written[index].end < section.start)\n index++;\n while (index < chunk.written.length - 1 && chunk.written[index].end >= chunk.written[index + 1].start) {\n chunk.written[index].end = Math.max(chunk.written[index].end, chunk.written[index + 1].end);\n chunk.written.splice(index + 1, 1);\n }\n};\n_createChunk = new WeakSet();\ncreateChunk_fn = function(includesPosition) {\n let start = Math.floor(includesPosition / __privateGet(this, _chunkSize)) * __privateGet(this, _chunkSize);\n let chunk = {\n start,\n data: new Uint8Array(__privateGet(this, _chunkSize)),\n written: [],\n shouldFlush: false\n };\n __privateGet(this, _chunks).push(chunk);\n __privateGet(this, _chunks).sort((a, b) => a.start - b.start);\n return __privateGet(this, _chunks).indexOf(chunk);\n};\n_flushChunks = new WeakSet();\nflushChunks_fn = function(force = false) {\n for (let i = 0; i < __privateGet(this, _chunks).length; i++) {\n let chunk = __privateGet(this, _chunks)[i];\n if (!chunk.shouldFlush && !force)\n continue;\n for (let section of chunk.written) {\n __privateGet(this, _target2).options.onData?.(\n chunk.data.subarray(section.start, section.end),\n chunk.start + section.start\n );\n }\n __privateGet(this, _chunks).splice(i--, 1);\n }\n};\nvar FileSystemWritableFileStreamTargetWriter = class extends StreamTargetWriter {\n constructor(target) {\n super(new StreamTarget({\n onData: (data, position) => target.stream.write({\n type: \"write\",\n data,\n position\n }),\n chunked: true,\n chunkSize: target.options?.chunkSize\n }));\n }\n};\n\n// src/muxer.ts\nvar GLOBAL_TIMESCALE = 1e3;\nvar SUPPORTED_VIDEO_CODECS = [\"avc\", \"hevc\", \"vp9\", \"av1\"];\nvar SUPPORTED_AUDIO_CODECS = [\"aac\", \"opus\"];\nvar TIMESTAMP_OFFSET = 2082844800;\nvar FIRST_TIMESTAMP_BEHAVIORS = [\"strict\", \"offset\", \"cross-track-offset\"];\nvar _options, _writer, _ftypSize, _mdat, _videoTrack, _audioTrack, _creationTime, _finalizedChunks, _nextFragmentNumber, _videoSampleQueue, _audioSampleQueue, _finalized, _validateOptions, validateOptions_fn, _writeHeader, writeHeader_fn, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn, _prepareTracks, prepareTracks_fn, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn, _createSampleForTrack, createSampleForTrack_fn, _addSampleToTrack, addSampleToTrack_fn, _validateTimestamp, validateTimestamp_fn, _finalizeCurrentChunk, finalizeCurrentChunk_fn, _finalizeFragment, finalizeFragment_fn, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn, _ensureNotFinalized, ensureNotFinalized_fn;\nvar Muxer = class {\n constructor(options) {\n __privateAdd(this, _validateOptions);\n __privateAdd(this, _writeHeader);\n __privateAdd(this, _computeMoovSizeUpperBound);\n __privateAdd(this, _prepareTracks);\n // https://wiki.multimedia.cx/index.php/MPEG-4_Audio\n __privateAdd(this, _generateMpeg4AudioSpecificConfig);\n __privateAdd(this, _createSampleForTrack);\n __privateAdd(this, _addSampleToTrack);\n __privateAdd(this, _validateTimestamp);\n __privateAdd(this, _finalizeCurrentChunk);\n __privateAdd(this, _finalizeFragment);\n __privateAdd(this, _maybeFlushStreamingTargetWriter);\n __privateAdd(this, _ensureNotFinalized);\n __privateAdd(this, _options, void 0);\n __privateAdd(this, _writer, void 0);\n __privateAdd(this, _ftypSize, void 0);\n __privateAdd(this, _mdat, void 0);\n __privateAdd(this, _videoTrack, null);\n __privateAdd(this, _audioTrack, null);\n __privateAdd(this, _creationTime, Math.floor(Date.now() / 1e3) + TIMESTAMP_OFFSET);\n __privateAdd(this, _finalizedChunks, []);\n // Fields for fragmented MP4:\n __privateAdd(this, _nextFragmentNumber, 1);\n __privateAdd(this, _videoSampleQueue, []);\n __privateAdd(this, _audioSampleQueue, []);\n __privateAdd(this, _finalized, false);\n __privateMethod(this, _validateOptions, validateOptions_fn).call(this, options);\n options.video = deepClone(options.video);\n options.audio = deepClone(options.audio);\n options.fastStart = deepClone(options.fastStart);\n this.target = options.target;\n __privateSet(this, _options, {\n firstTimestampBehavior: \"strict\",\n ...options\n });\n if (options.target instanceof ArrayBufferTarget) {\n __privateSet(this, _writer, new ArrayBufferTargetWriter(options.target));\n } else if (options.target instanceof StreamTarget) {\n __privateSet(this, _writer, new StreamTargetWriter(options.target));\n } else if (options.target instanceof FileSystemWritableFileStreamTarget) {\n __privateSet(this, _writer, new FileSystemWritableFileStreamTargetWriter(options.target));\n } else {\n throw new Error(`Invalid target: ${options.target}`);\n }\n __privateMethod(this, _prepareTracks, prepareTracks_fn).call(this);\n __privateMethod(this, _writeHeader, writeHeader_fn).call(this);\n }\n addVideoChunk(sample, meta, timestamp, compositionTimeOffset) {\n if (!(sample instanceof EncodedVideoChunk)) {\n throw new TypeError(\"addVideoChunk's first argument (sample) must be of type EncodedVideoChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addVideoChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n if (compositionTimeOffset !== void 0 && !Number.isFinite(compositionTimeOffset)) {\n throw new TypeError(\n \"addVideoChunk's fourth argument (compositionTimeOffset), when provided, must be a real number.\"\n );\n }\n let data = new Uint8Array(sample.byteLength);\n sample.copyTo(data);\n this.addVideoChunkRaw(\n data,\n sample.type,\n timestamp ?? sample.timestamp,\n sample.duration,\n meta,\n compositionTimeOffset\n );\n }\n addVideoChunkRaw(data, type, timestamp, duration, meta, compositionTimeOffset) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addVideoChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addVideoChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addVideoChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError(\"addVideoChunkRaw's fourth argument (duration) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunkRaw's fifth argument (meta), when provided, must be an object.\");\n }\n if (compositionTimeOffset !== void 0 && !Number.isFinite(compositionTimeOffset)) {\n throw new TypeError(\n \"addVideoChunkRaw's sixth argument (compositionTimeOffset), when provided, must be a real number.\"\n );\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).video)\n throw new Error(\"No video track declared.\");\n if (typeof __privateGet(this, _options).fastStart === \"object\" && __privateGet(this, _videoTrack).samples.length === __privateGet(this, _options).fastStart.expectedVideoChunks) {\n throw new Error(`Cannot add more video chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedVideoChunks}).`);\n }\n let videoSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _videoTrack), data, type, timestamp, duration, meta, compositionTimeOffset);\n if (__privateGet(this, _options).fastStart === \"fragmented\" && __privateGet(this, _audioTrack)) {\n while (__privateGet(this, _audioSampleQueue).length > 0 && __privateGet(this, _audioSampleQueue)[0].decodeTimestamp <= videoSample.decodeTimestamp) {\n let audioSample = __privateGet(this, _audioSampleQueue).shift();\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n }\n if (videoSample.decodeTimestamp <= __privateGet(this, _audioTrack).lastDecodeTimestamp) {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n } else {\n __privateGet(this, _videoSampleQueue).push(videoSample);\n }\n } else {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n }\n }\n addAudioChunk(sample, meta, timestamp) {\n if (!(sample instanceof EncodedAudioChunk)) {\n throw new TypeError(\"addAudioChunk's first argument (sample) must be of type EncodedAudioChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addAudioChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n let data = new Uint8Array(sample.byteLength);\n sample.copyTo(data);\n this.addAudioChunkRaw(data, sample.type, timestamp ?? sample.timestamp, sample.duration, meta);\n }\n addAudioChunkRaw(data, type, timestamp, duration, meta) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addAudioChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addAudioChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addAudioChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError(\"addAudioChunkRaw's fourth argument (duration) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunkRaw's fifth argument (meta), when provided, must be an object.\");\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).audio)\n throw new Error(\"No audio track declared.\");\n if (typeof __privateGet(this, _options).fastStart === \"object\" && __privateGet(this, _audioTrack).samples.length === __privateGet(this, _options).fastStart.expectedAudioChunks) {\n throw new Error(`Cannot add more audio chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedAudioChunks}).`);\n }\n let audioSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _audioTrack), data, type, timestamp, duration, meta);\n if (__privateGet(this, _options).fastStart === \"fragmented\" && __privateGet(this, _videoTrack)) {\n while (__privateGet(this, _videoSampleQueue).length > 0 && __privateGet(this, _videoSampleQueue)[0].decodeTimestamp <= audioSample.decodeTimestamp) {\n let videoSample = __privateGet(this, _videoSampleQueue).shift();\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n }\n if (audioSample.decodeTimestamp <= __privateGet(this, _videoTrack).lastDecodeTimestamp) {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n } else {\n __privateGet(this, _audioSampleQueue).push(audioSample);\n }\n } else {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n }\n }\n /** Finalizes the file, making it ready for use. Must be called after all video and audio chunks have been added. */\n finalize() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot finalize a muxer more than once.\");\n }\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n for (let videoSample of __privateGet(this, _videoSampleQueue))\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n for (let audioSample of __privateGet(this, _audioSampleQueue))\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this, false);\n } else {\n if (__privateGet(this, _videoTrack))\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _videoTrack));\n if (__privateGet(this, _audioTrack))\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _audioTrack));\n }\n let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter(Boolean);\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n let mdatSize;\n for (let i = 0; i < 2; i++) {\n let movieBox2 = moov(tracks, __privateGet(this, _creationTime));\n let movieBoxSize = __privateGet(this, _writer).measureBox(movieBox2);\n mdatSize = __privateGet(this, _writer).measureBox(__privateGet(this, _mdat));\n let currentChunkPos = __privateGet(this, _writer).pos + movieBoxSize + mdatSize;\n for (let chunk of __privateGet(this, _finalizedChunks)) {\n chunk.offset = currentChunkPos;\n for (let { data } of chunk.samples) {\n currentChunkPos += data.byteLength;\n mdatSize += data.byteLength;\n }\n }\n if (currentChunkPos < 2 ** 32)\n break;\n if (mdatSize >= 2 ** 32)\n __privateGet(this, _mdat).largeSize = true;\n }\n let movieBox = moov(tracks, __privateGet(this, _creationTime));\n __privateGet(this, _writer).writeBox(movieBox);\n __privateGet(this, _mdat).size = mdatSize;\n __privateGet(this, _writer).writeBox(__privateGet(this, _mdat));\n for (let chunk of __privateGet(this, _finalizedChunks)) {\n for (let sample of chunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n }\n } else if (__privateGet(this, _options).fastStart === \"fragmented\") {\n let startPos = __privateGet(this, _writer).pos;\n let mfraBox = mfra(tracks);\n __privateGet(this, _writer).writeBox(mfraBox);\n let mfraBoxSize = __privateGet(this, _writer).pos - startPos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).pos - 4);\n __privateGet(this, _writer).writeU32(mfraBoxSize);\n } else {\n let mdatPos = __privateGet(this, _writer).offsets.get(__privateGet(this, _mdat));\n let mdatSize = __privateGet(this, _writer).pos - mdatPos;\n __privateGet(this, _mdat).size = mdatSize;\n __privateGet(this, _mdat).largeSize = mdatSize >= 2 ** 32;\n __privateGet(this, _writer).patchBox(__privateGet(this, _mdat));\n let movieBox = moov(tracks, __privateGet(this, _creationTime));\n if (typeof __privateGet(this, _options).fastStart === \"object\") {\n __privateGet(this, _writer).seek(__privateGet(this, _ftypSize));\n __privateGet(this, _writer).writeBox(movieBox);\n let remainingBytes = mdatPos - __privateGet(this, _writer).pos;\n __privateGet(this, _writer).writeBox(free(remainingBytes));\n } else {\n __privateGet(this, _writer).writeBox(movieBox);\n }\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n __privateGet(this, _writer).finalize();\n __privateSet(this, _finalized, true);\n }\n};\n_options = new WeakMap();\n_writer = new WeakMap();\n_ftypSize = new WeakMap();\n_mdat = new WeakMap();\n_videoTrack = new WeakMap();\n_audioTrack = new WeakMap();\n_creationTime = new WeakMap();\n_finalizedChunks = new WeakMap();\n_nextFragmentNumber = new WeakMap();\n_videoSampleQueue = new WeakMap();\n_audioSampleQueue = new WeakMap();\n_finalized = new WeakMap();\n_validateOptions = new WeakSet();\nvalidateOptions_fn = function(options) {\n if (typeof options !== \"object\") {\n throw new TypeError(\"The muxer requires an options object to be passed to its constructor.\");\n }\n if (!(options.target instanceof Target)) {\n throw new TypeError(\"The target must be provided and an instance of Target.\");\n }\n if (options.video) {\n if (!SUPPORTED_VIDEO_CODECS.includes(options.video.codec)) {\n throw new TypeError(`Unsupported video codec: ${options.video.codec}`);\n }\n if (!Number.isInteger(options.video.width) || options.video.width <= 0) {\n throw new TypeError(`Invalid video width: ${options.video.width}. Must be a positive integer.`);\n }\n if (!Number.isInteger(options.video.height) || options.video.height <= 0) {\n throw new TypeError(`Invalid video height: ${options.video.height}. Must be a positive integer.`);\n }\n const videoRotation = options.video.rotation;\n if (typeof videoRotation === \"number\" && ![0, 90, 180, 270].includes(videoRotation)) {\n throw new TypeError(`Invalid video rotation: ${videoRotation}. Has to be 0, 90, 180 or 270.`);\n } else if (Array.isArray(videoRotation) && (videoRotation.length !== 9 || videoRotation.some((value) => typeof value !== \"number\"))) {\n throw new TypeError(`Invalid video transformation matrix: ${videoRotation.join()}`);\n }\n if (options.video.frameRate !== void 0 && (!Number.isInteger(options.video.frameRate) || options.video.frameRate <= 0)) {\n throw new TypeError(\n `Invalid video frame rate: ${options.video.frameRate}. Must be a positive integer.`\n );\n }\n }\n if (options.audio) {\n if (!SUPPORTED_AUDIO_CODECS.includes(options.audio.codec)) {\n throw new TypeError(`Unsupported audio codec: ${options.audio.codec}`);\n }\n if (!Number.isInteger(options.audio.numberOfChannels) || options.audio.numberOfChannels <= 0) {\n throw new TypeError(\n `Invalid number of audio channels: ${options.audio.numberOfChannels}. Must be a positive integer.`\n );\n }\n if (!Number.isInteger(options.audio.sampleRate) || options.audio.sampleRate <= 0) {\n throw new TypeError(\n `Invalid audio sample rate: ${options.audio.sampleRate}. Must be a positive integer.`\n );\n }\n }\n if (options.firstTimestampBehavior && !FIRST_TIMESTAMP_BEHAVIORS.includes(options.firstTimestampBehavior)) {\n throw new TypeError(`Invalid first timestamp behavior: ${options.firstTimestampBehavior}`);\n }\n if (typeof options.fastStart === \"object\") {\n if (options.video) {\n if (options.fastStart.expectedVideoChunks === void 0) {\n throw new TypeError(`'fastStart' is an object but is missing property 'expectedVideoChunks'.`);\n } else if (!Number.isInteger(options.fastStart.expectedVideoChunks) || options.fastStart.expectedVideoChunks < 0) {\n throw new TypeError(`'expectedVideoChunks' must be a non-negative integer.`);\n }\n }\n if (options.audio) {\n if (options.fastStart.expectedAudioChunks === void 0) {\n throw new TypeError(`'fastStart' is an object but is missing property 'expectedAudioChunks'.`);\n } else if (!Number.isInteger(options.fastStart.expectedAudioChunks) || options.fastStart.expectedAudioChunks < 0) {\n throw new TypeError(`'expectedAudioChunks' must be a non-negative integer.`);\n }\n }\n } else if (![false, \"in-memory\", \"fragmented\"].includes(options.fastStart)) {\n throw new TypeError(`'fastStart' option must be false, 'in-memory', 'fragmented' or an object.`);\n }\n if (options.minFragmentDuration !== void 0 && (!Number.isFinite(options.minFragmentDuration) || options.minFragmentDuration < 0)) {\n throw new TypeError(`'minFragmentDuration' must be a non-negative number.`);\n }\n};\n_writeHeader = new WeakSet();\nwriteHeader_fn = function() {\n __privateGet(this, _writer).writeBox(ftyp({\n holdsAvc: __privateGet(this, _options).video?.codec === \"avc\",\n fragmented: __privateGet(this, _options).fastStart === \"fragmented\"\n }));\n __privateSet(this, _ftypSize, __privateGet(this, _writer).pos);\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n __privateSet(this, _mdat, mdat(false));\n } else if (__privateGet(this, _options).fastStart === \"fragmented\") {\n } else {\n if (typeof __privateGet(this, _options).fastStart === \"object\") {\n let moovSizeUpperBound = __privateMethod(this, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn).call(this);\n __privateGet(this, _writer).seek(__privateGet(this, _writer).pos + moovSizeUpperBound);\n }\n __privateSet(this, _mdat, mdat(true));\n __privateGet(this, _writer).writeBox(__privateGet(this, _mdat));\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_computeMoovSizeUpperBound = new WeakSet();\ncomputeMoovSizeUpperBound_fn = function() {\n if (typeof __privateGet(this, _options).fastStart !== \"object\")\n return;\n let upperBound = 0;\n let sampleCounts = [\n __privateGet(this, _options).fastStart.expectedVideoChunks,\n __privateGet(this, _options).fastStart.expectedAudioChunks\n ];\n for (let n of sampleCounts) {\n if (!n)\n continue;\n upperBound += (4 + 4) * Math.ceil(2 / 3 * n);\n upperBound += 4 * n;\n upperBound += (4 + 4 + 4) * Math.ceil(2 / 3 * n);\n upperBound += 4 * n;\n upperBound += 8 * n;\n }\n upperBound += 4096;\n return upperBound;\n};\n_prepareTracks = new WeakSet();\nprepareTracks_fn = function() {\n if (__privateGet(this, _options).video) {\n __privateSet(this, _videoTrack, {\n id: 1,\n info: {\n type: \"video\",\n codec: __privateGet(this, _options).video.codec,\n width: __privateGet(this, _options).video.width,\n height: __privateGet(this, _options).video.height,\n rotation: __privateGet(this, _options).video.rotation ?? 0,\n decoderConfig: null\n },\n // The fallback contains many common frame rates as factors\n timescale: __privateGet(this, _options).video.frameRate ?? 57600,\n samples: [],\n finalizedChunks: [],\n currentChunk: null,\n firstDecodeTimestamp: void 0,\n lastDecodeTimestamp: -1,\n timeToSampleTable: [],\n compositionTimeOffsetTable: [],\n lastTimescaleUnits: null,\n lastSample: null,\n compactlyCodedChunkTable: []\n });\n }\n if (__privateGet(this, _options).audio) {\n __privateSet(this, _audioTrack, {\n id: __privateGet(this, _options).video ? 2 : 1,\n info: {\n type: \"audio\",\n codec: __privateGet(this, _options).audio.codec,\n numberOfChannels: __privateGet(this, _options).audio.numberOfChannels,\n sampleRate: __privateGet(this, _options).audio.sampleRate,\n decoderConfig: null\n },\n timescale: __privateGet(this, _options).audio.sampleRate,\n samples: [],\n finalizedChunks: [],\n currentChunk: null,\n firstDecodeTimestamp: void 0,\n lastDecodeTimestamp: -1,\n timeToSampleTable: [],\n compositionTimeOffsetTable: [],\n lastTimescaleUnits: null,\n lastSample: null,\n compactlyCodedChunkTable: []\n });\n if (__privateGet(this, _options).audio.codec === \"aac\") {\n let guessedCodecPrivate = __privateMethod(this, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn).call(\n this,\n 2,\n // Object type for AAC-LC, since it's the most common\n __privateGet(this, _options).audio.sampleRate,\n __privateGet(this, _options).audio.numberOfChannels\n );\n __privateGet(this, _audioTrack).info.decoderConfig = {\n codec: __privateGet(this, _options).audio.codec,\n description: guessedCodecPrivate,\n numberOfChannels: __privateGet(this, _options).audio.numberOfChannels,\n sampleRate: __privateGet(this, _options).audio.sampleRate\n };\n }\n }\n};\n_generateMpeg4AudioSpecificConfig = new WeakSet();\ngenerateMpeg4AudioSpecificConfig_fn = function(objectType, sampleRate, numberOfChannels) {\n let frequencyIndices = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350];\n let frequencyIndex = frequencyIndices.indexOf(sampleRate);\n let channelConfig = numberOfChannels;\n let configBits = \"\";\n configBits += objectType.toString(2).padStart(5, \"0\");\n configBits += frequencyIndex.toString(2).padStart(4, \"0\");\n if (frequencyIndex === 15)\n configBits += sampleRate.toString(2).padStart(24, \"0\");\n configBits += channelConfig.toString(2).padStart(4, \"0\");\n let paddingLength = Math.ceil(configBits.length / 8) * 8;\n configBits = configBits.padEnd(paddingLength, \"0\");\n let configBytes = new Uint8Array(configBits.length / 8);\n for (let i = 0; i < configBits.length; i += 8) {\n configBytes[i / 8] = parseInt(configBits.slice(i, i + 8), 2);\n }\n return configBytes;\n};\n_createSampleForTrack = new WeakSet();\ncreateSampleForTrack_fn = function(track, data, type, timestamp, duration, meta, compositionTimeOffset) {\n let presentationTimestampInSeconds = timestamp / 1e6;\n let decodeTimestampInSeconds = (timestamp - (compositionTimeOffset ?? 0)) / 1e6;\n let durationInSeconds = duration / 1e6;\n let adjusted = __privateMethod(this, _validateTimestamp, validateTimestamp_fn).call(this, presentationTimestampInSeconds, decodeTimestampInSeconds, track);\n presentationTimestampInSeconds = adjusted.presentationTimestamp;\n decodeTimestampInSeconds = adjusted.decodeTimestamp;\n if (meta?.decoderConfig) {\n if (track.info.decoderConfig === null) {\n track.info.decoderConfig = meta.decoderConfig;\n } else {\n Object.assign(track.info.decoderConfig, meta.decoderConfig);\n }\n }\n let sample = {\n presentationTimestamp: presentationTimestampInSeconds,\n decodeTimestamp: decodeTimestampInSeconds,\n duration: durationInSeconds,\n data,\n size: data.byteLength,\n type,\n // Will be refined once the next sample comes in\n timescaleUnitsToNextSample: intoTimescale(durationInSeconds, track.timescale)\n };\n return sample;\n};\n_addSampleToTrack = new WeakSet();\naddSampleToTrack_fn = function(track, sample) {\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n track.samples.push(sample);\n }\n const sampleCompositionTimeOffset = intoTimescale(sample.presentationTimestamp - sample.decodeTimestamp, track.timescale);\n if (track.lastTimescaleUnits !== null) {\n let timescaleUnits = intoTimescale(sample.decodeTimestamp, track.timescale, false);\n let delta = Math.round(timescaleUnits - track.lastTimescaleUnits);\n track.lastTimescaleUnits += delta;\n track.lastSample.timescaleUnitsToNextSample = delta;\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n let lastTableEntry = last(track.timeToSampleTable);\n if (lastTableEntry.sampleCount === 1) {\n lastTableEntry.sampleDelta = delta;\n lastTableEntry.sampleCount++;\n } else if (lastTableEntry.sampleDelta === delta) {\n lastTableEntry.sampleCount++;\n } else {\n lastTableEntry.sampleCount--;\n track.timeToSampleTable.push({\n sampleCount: 2,\n sampleDelta: delta\n });\n }\n const lastCompositionTimeOffsetTableEntry = last(track.compositionTimeOffsetTable);\n if (lastCompositionTimeOffsetTableEntry.sampleCompositionTimeOffset === sampleCompositionTimeOffset) {\n lastCompositionTimeOffsetTableEntry.sampleCount++;\n } else {\n track.compositionTimeOffsetTable.push({\n sampleCount: 1,\n sampleCompositionTimeOffset\n });\n }\n }\n } else {\n track.lastTimescaleUnits = 0;\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n track.timeToSampleTable.push({\n sampleCount: 1,\n sampleDelta: intoTimescale(sample.duration, track.timescale)\n });\n track.compositionTimeOffsetTable.push({\n sampleCount: 1,\n sampleCompositionTimeOffset\n });\n }\n }\n track.lastSample = sample;\n let beginNewChunk = false;\n if (!track.currentChunk) {\n beginNewChunk = true;\n } else {\n let currentChunkDuration = sample.presentationTimestamp - track.currentChunk.startTimestamp;\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n let mostImportantTrack = __privateGet(this, _videoTrack) ?? __privateGet(this, _audioTrack);\n const chunkDuration = __privateGet(this, _options).minFragmentDuration ?? 1;\n if (track === mostImportantTrack && sample.type === \"key\" && currentChunkDuration >= chunkDuration) {\n beginNewChunk = true;\n __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this);\n }\n } else {\n beginNewChunk = currentChunkDuration >= 0.5;\n }\n }\n if (beginNewChunk) {\n if (track.currentChunk) {\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, track);\n }\n track.currentChunk = {\n startTimestamp: sample.presentationTimestamp,\n samples: []\n };\n }\n track.currentChunk.samples.push(sample);\n};\n_validateTimestamp = new WeakSet();\nvalidateTimestamp_fn = function(presentationTimestamp, decodeTimestamp, track) {\n const strictTimestampBehavior = __privateGet(this, _options).firstTimestampBehavior === \"strict\";\n const noLastDecodeTimestamp = track.lastDecodeTimestamp === -1;\n const timestampNonZero = decodeTimestamp !== 0;\n if (strictTimestampBehavior && noLastDecodeTimestamp && timestampNonZero) {\n throw new Error(\n `The first chunk for your media track must have a timestamp of 0 (received DTS=${decodeTimestamp}).Non-zero first timestamps are often caused by directly piping frames or audio data from a MediaStreamTrack into the encoder. Their timestamps are typically relative to the age of thedocument, which is probably what you want.\n\nIf you want to offset all timestamps of a track such that the first one is zero, set firstTimestampBehavior: 'offset' in the options.\n`\n );\n } else if (__privateGet(this, _options).firstTimestampBehavior === \"offset\" || __privateGet(this, _options).firstTimestampBehavior === \"cross-track-offset\") {\n if (track.firstDecodeTimestamp === void 0) {\n track.firstDecodeTimestamp = decodeTimestamp;\n }\n let baseDecodeTimestamp;\n if (__privateGet(this, _options).firstTimestampBehavior === \"offset\") {\n baseDecodeTimestamp = track.firstDecodeTimestamp;\n } else {\n baseDecodeTimestamp = Math.min(\n __privateGet(this, _videoTrack)?.firstDecodeTimestamp ?? Infinity,\n __privateGet(this, _audioTrack)?.firstDecodeTimestamp ?? Infinity\n );\n }\n decodeTimestamp -= baseDecodeTimestamp;\n presentationTimestamp -= baseDecodeTimestamp;\n }\n if (decodeTimestamp < track.lastDecodeTimestamp) {\n throw new Error(\n `Timestamps must be monotonically increasing (DTS went from ${track.lastDecodeTimestamp * 1e6} to ${decodeTimestamp * 1e6}).`\n );\n }\n track.lastDecodeTimestamp = decodeTimestamp;\n return { presentationTimestamp, decodeTimestamp };\n};\n_finalizeCurrentChunk = new WeakSet();\nfinalizeCurrentChunk_fn = function(track) {\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n throw new Error(\"Can't finalize individual chunks if 'fastStart' is set to 'fragmented'.\");\n }\n if (!track.currentChunk)\n return;\n track.finalizedChunks.push(track.currentChunk);\n __privateGet(this, _finalizedChunks).push(track.currentChunk);\n if (track.compactlyCodedChunkTable.length === 0 || last(track.compactlyCodedChunkTable).samplesPerChunk !== track.currentChunk.samples.length) {\n track.compactlyCodedChunkTable.push({\n firstChunk: track.finalizedChunks.length,\n // 1-indexed\n samplesPerChunk: track.currentChunk.samples.length\n });\n }\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n track.currentChunk.offset = 0;\n return;\n }\n track.currentChunk.offset = __privateGet(this, _writer).pos;\n for (let sample of track.currentChunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_finalizeFragment = new WeakSet();\nfinalizeFragment_fn = function(flushStreamingWriter = true) {\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n throw new Error(\"Can't finalize a fragment unless 'fastStart' is set to 'fragmented'.\");\n }\n let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter((track) => track && track.currentChunk);\n if (tracks.length === 0)\n return;\n let fragmentNumber = __privateWrapper(this, _nextFragmentNumber)._++;\n if (fragmentNumber === 1) {\n let movieBox = moov(tracks, __privateGet(this, _creationTime), true);\n __privateGet(this, _writer).writeBox(movieBox);\n }\n let moofOffset = __privateGet(this, _writer).pos;\n let moofBox = moof(fragmentNumber, tracks);\n __privateGet(this, _writer).writeBox(moofBox);\n {\n let mdatBox = mdat(false);\n let totalTrackSampleSize = 0;\n for (let track of tracks) {\n for (let sample of track.currentChunk.samples) {\n totalTrackSampleSize += sample.size;\n }\n }\n let mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize;\n if (mdatSize >= 2 ** 32) {\n mdatBox.largeSize = true;\n mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize;\n }\n mdatBox.size = mdatSize;\n __privateGet(this, _writer).writeBox(mdatBox);\n }\n for (let track of tracks) {\n track.currentChunk.offset = __privateGet(this, _writer).pos;\n track.currentChunk.moofOffset = moofOffset;\n for (let sample of track.currentChunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n }\n let endPos = __privateGet(this, _writer).pos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(moofBox));\n let newMoofBox = moof(fragmentNumber, tracks);\n __privateGet(this, _writer).writeBox(newMoofBox);\n __privateGet(this, _writer).seek(endPos);\n for (let track of tracks) {\n track.finalizedChunks.push(track.currentChunk);\n __privateGet(this, _finalizedChunks).push(track.currentChunk);\n track.currentChunk = null;\n }\n if (flushStreamingWriter) {\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n }\n};\n_maybeFlushStreamingTargetWriter = new WeakSet();\nmaybeFlushStreamingTargetWriter_fn = function() {\n if (__privateGet(this, _writer) instanceof StreamTargetWriter) {\n __privateGet(this, _writer).flush();\n }\n};\n_ensureNotFinalized = new WeakSet();\nensureNotFinalized_fn = function() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot add new video or audio chunks after the file has been finalized.\");\n }\n};\nexport {\n ArrayBufferTarget,\n FileSystemWritableFileStreamTarget,\n Muxer,\n StreamTarget\n};\n","import {ArrayBufferTarget, Muxer} from \"mp4-muxer\";\nimport EventEmitter from \"../../../utils/EventEmitter\";\nimport { WorkerController } from \"../../../utils/WorkerController\";\nimport { VideoWorker } from \"../video/video\";\nexport interface AudioTrackData {\n codec: string,\n sampleRate: number ,\n numberOfChannels: number\n}\n\n// Duration of each audio segment (time-based blocks that contain multiple EncodedAudioChunks)\nconst SEGMENT_DURATION = 30; // seconds\n\n\nexport interface AudioPlayerArgs {\n\n audioConfig: AudioTrackData;\n duration: number;\n worker: WorkerController;\n file: File;\n}\n\n\nexport class WebAudioPlayer {\n\n\n audioContext: AudioContext | null;\n sourceNode: AudioBufferSourceNode | null;\n isPlaying: boolean;\n startTime: number;\n pauseTime: number;\n duration: number;\n encodedChunks: EncodedAudioChunk[]; // EncodedAudioChunks from current segment\n audioSegments: Map<number, AudioBuffer>; // Decoded audio segments (segmentIndex -> AudioBuffer)\n scheduledNodes: Map<number, AudioBufferSourceNode>;\n preloadThreshold: number; // Seconds before segment end to trigger preload\n file: File;\n\n worker: WorkerController;\n isPreloading: boolean;\n audioConfig: AudioTrackData | null;\n constructor(args: AudioPlayerArgs) {\n this.audioContext = null;\n this.sourceNode = null;\n this.isPlaying = false;\n this.startTime = 0;\n this.pauseTime = 0;\n this.duration = args.duration;\n this.audioConfig = args.audioConfig;\n\n this.encodedChunks = [];\n this.audioSegments = new Map(); // Cache for decoded audio segments\n this.scheduledNodes = new Map(); // Track scheduled audio nodes\n this.preloadThreshold = 5; // Seconds before segment end to trigger preload\n this.isPreloading = false;\n\n //Audio Renderer gets its own worker to avoid using the video worker to get audio chunks while the video renderer is running / fetching video chunks\n this.worker = args.worker;\n this.file = args.file;\n\n\n this.init();\n }\n\n init() {\n this.audioContext = new AudioContext();\n\n this.seek(0);\n \n }\n\n /**\n * Mux EncodedAudioChunks to an ArrayBuffer for Web Audio API decoding\n * @param chunks - Array of EncodedAudioChunks from a segment\n */\n async muxEncodedChunksToBuffer(chunks: EncodedAudioChunk[], config: AudioTrackData) {\n // Create MP4 muxer\n const muxer = new Muxer({\n target: new ArrayBufferTarget(),\n fastStart: 'in-memory',\n firstTimestampBehavior: 'offset',\n audio: {\n codec: 'aac',\n sampleRate: config.sampleRate,\n numberOfChannels: config.numberOfChannels\n }\n });\n\n // Add EncodedAudioChunks to muxer\n for (const chunk of chunks) {\n muxer.addAudioChunk(chunk);\n }\n\n // Finalize and get array buffer\n await muxer.finalize();\n return muxer.target.buffer;\n }\n\n /**\n * Fetch EncodedAudioChunks for a specific time segment from the file worker\n * @param time - Time in seconds\n * @returns Array of EncodedAudioChunks\n */\n async getEncodedChunksForTime(time: number) {\n const segmentIndex = Math.floor(time / SEGMENT_DURATION);\n\n const chunks = <EncodedAudioChunk[]> await this.worker.sendMessage('get-audio-segment', {\n start: segmentIndex * SEGMENT_DURATION,\n end: segmentIndex * SEGMENT_DURATION + SEGMENT_DURATION,\n file: this.file\n });\n\n this.encodedChunks = chunks;\n\n return chunks;\n }\n\n /**\n * Load and decode an audio segment\n * @param time - Time in seconds\n * @returns Decoded AudioBuffer for the segment\n */\n async loadSegment(time: number) {\n const segmentIndex = Math.floor(time / SEGMENT_DURATION);\n\n // Check cache first\n if (this.audioSegments.has(segmentIndex)) {\n return this.audioSegments.get(segmentIndex);\n }\n\n // Fetch EncodedAudioChunks for this segment\n const encodedChunks = await this.getEncodedChunksForTime(segmentIndex * SEGMENT_DURATION);\n if (encodedChunks.length === 0) return null;\n\n try {\n const a = performance.now();\n\n // Mux EncodedAudioChunks to AAC buffer\n const muxedBuffer = await this.muxEncodedChunksToBuffer(encodedChunks, this.audioConfig!);\n\n const b = performance.now();\n\n // Decode to AudioBuffer for Web Audio API\n const audioBuffer = await this.audioContext!.decodeAudioData(muxedBuffer);\n\n const c = performance.now();\n console.log(`Segment ${segmentIndex}: Muxing took ${b - a}ms, Decoding took ${c - b}ms`);\n\n // Cache the decoded segment\n this.audioSegments.set(segmentIndex, audioBuffer);\n\n return audioBuffer;\n } catch (error) {\n console.error('Error loading audio segment:', error);\n return null;\n }\n }\n\n\n\n async startPlayback(startFrom = this.pauseTime) {\n // Clear any previously scheduled nodes\n this.clearScheduledNodes();\n\n const currentSegment = await this.loadSegment(startFrom);\n\n if (!currentSegment) return;\n\n const segmentOffset = startFrom % SEGMENT_DURATION;\n const timeUntilEnd = SEGMENT_DURATION - segmentOffset;\n\n // Schedule current segment\n this.scheduleSegment(currentSegment, startFrom, segmentOffset);\n\n // Pre-load and schedule next segment\n this.preloadNextSegment(startFrom + timeUntilEnd);\n }\n\n clearScheduledNodes() {\n // Clear both audio nodes and preload timeouts\n for (const node of this.scheduledNodes.values()) {\n node.stop();\n node.disconnect();\n }\n this.scheduledNodes.clear();\n }\n\n getCurrentSegmentIndex() {\n return Math.floor(this.getCurrentTime() / SEGMENT_DURATION);\n }\n\n async preloadNextSegment(startTime: number) {\n if (this.isPreloading || startTime >= this.duration) return;\n\n const nextSegmentIndex = Math.floor(startTime / SEGMENT_DURATION);\n\n // Check if we already have this segment cached\n if (this.audioSegments.has(nextSegmentIndex)) {\n this.scheduleSegment(this.audioSegments.get(nextSegmentIndex), startTime, 0);\n return;\n }\n this.isPreloading = true;\n try {\n const nextSegment = await this.loadSegment(startTime);\n if (!nextSegment || !this.isPlaying) return;\n\n this.scheduleSegment(nextSegment, startTime, 0);\n\n // Instead of setTimeout, we'll check during playback updates\n } finally {\n this.isPreloading = false;\n }\n }\n\n scheduleSegment(audioBuffer: AudioBuffer, startTime: number, offset: number) {\n const sourceNode = this.audioContext!.createBufferSource();\n sourceNode.buffer = audioBuffer;\n sourceNode.connect(this.audioContext!.destination);\n const playbackTime = this.startTime + (startTime - this.pauseTime);\n sourceNode.start(playbackTime, offset);\n this.scheduledNodes.set(startTime, sourceNode);\n\n // Clean up completed nodes\n sourceNode.onended = () => {\n sourceNode.disconnect();\n this.scheduledNodes.delete(startTime);\n };\n }\n\n async play() {\n this.startTime = this.audioContext!.currentTime;\n await this.startPlayback();\n this.isPlaying = true;\n }\n\n async pause() {\n this.clearScheduledNodes();\n this.pauseTime = this.getCurrentTime();\n this.isPlaying = false;\n }\n\n \n async seek(time: number) {\n const wasPlaying = this.isPlaying; \n if (wasPlaying) {\n this.clearScheduledNodes();\n this.isPlaying = false;\n }\n this.pauseTime = time;\n if (wasPlaying) {\n this.startTime = this.audioContext!.currentTime;\n this.isPlaying = true;\n await this.startPlayback(time);\n\n }\n }\n\n\n checkForPreLoad() {\n if (!this.isPlaying) return;\n const currentTime = this.getCurrentTime();\n // Check if we need to preload the next segment\n const currentSegmentIndex = this.getCurrentSegmentIndex();\n const timeInCurrentSegment = currentTime % SEGMENT_DURATION;\n\n if (timeInCurrentSegment >= (SEGMENT_DURATION - this.preloadThreshold) &&\n !this.isPreloading &&\n !this.audioSegments.has(currentSegmentIndex + 1)) {\n this.preloadNextSegment((currentSegmentIndex + 1) * SEGMENT_DURATION);\n } \n }\n\n getCurrentTime() {\n if (!this.isPlaying) return this.pauseTime;\n return this.pauseTime + (this.audioContext!.currentTime - this.startTime);\n }\n\n\n}\n\n","import { v4 as uuidv4 } from 'uuid';\n\ntype Listener = (args?: any) => void;\n\nexport default class EventEmitter {\n listeners: Record<string, Record<string, Listener>> = {};\n\n /**\n * Add an event listener and return its unique ID\n */\n on(event: string, listener: Listener): string {\n\n if (!this.listeners[event]) {\n this.listeners[event] = {};\n }\n\n const id = uuidv4();\n this.listeners[event][id] = listener;\n return id;\n }\n\n /**\n * Remove a specific listener by its ID\n */\n off(event: string, listenerId: string): void {\n if (this.listeners[event]) {\n delete this.listeners[event][listenerId];\n }\n }\n\n /**\n * Emit an event to all registered listeners\n */\n emit(event: string, args?: any): void {\n if (this.listeners[event]) {\n Object.values(this.listeners[event]).forEach(listener => {\n listener(args);\n });\n }\n }\n\n /**\n * Remove all listeners for a specific event\n */\n removeAllListeners(event: string): void {\n if (this.listeners[event]) {\n this.listeners[event] = {};\n }\n }\n} ","import EventEmitter from \"../../../utils/EventEmitter\";\nimport VideoWorkerConstructor from './video.worker.ts?worker&inline';\nimport { WorkerController } from \"../../../utils/WorkerController\";\n\nexport interface VideoWorkerParams {\n src: File;\n canvas: HTMLCanvasElement;\n fileWorkerPort: MessagePort;\n}\n\n\n\n/**\n * OffscreenVideoWorker is a wrapper around the video.worker.ts\n * It handles communication with the worker and provides a simple interface.\n */\nexport class VideoWorker extends EventEmitter {\n private canvas: HTMLCanvasElement;\n private offscreenCanvas: OffscreenCanvas | null = null;\n public duration: number = 0;\n private worker: WorkerController;\n private fileWorkerPort: MessagePort;\n\n constructor(params: VideoWorkerParams) {\n super();\n this.canvas = params.canvas;\n this.fileWorkerPort = params.fileWorkerPort;\n this.worker = new WorkerController(VideoWorkerConstructor);\n }\n \n\n /**\n * Send a message to the worker and wait for a response\n */\n\n\n /**\n * Initialize the video player\n */\n async initialize(): Promise<void> {\n // Create the offscreen canvas\n this.offscreenCanvas = this.canvas.transferControlToOffscreen();\n\n // Initialize the worker with the offscreen canvas and file worker port\n const initialized = await this.worker.sendMessage('init', {\n canvas: this.offscreenCanvas,\n fileWorkerPort: this.fileWorkerPort\n }, [this.offscreenCanvas, this.fileWorkerPort]);\n\n\n // Emit initialization event\n this.emit('initialized', initialized);\n }\n\n\n\n /**\n * Seek to a specific time\n */\n async seek(time: number): Promise<void> {\n // Send seek command to worker\n await this.worker.sendMessage('seek', { time });\n }\n\n /**\n * Get debug information from the video worker\n */\n async getDebugInfo(): Promise<any> {\n return await this.worker.sendMessage('get-debug-info', {});\n }\n\n\n async setTrackData(videoMetadata: any, duration: number): Promise<void> {\n await this.worker.sendMessage('set-track-data', {\n videoMetadata,\n duration\n });\n }\n /**\n * Clean up resources\n */\n terminate(): void {\n\n // Terminate the worker\n this.worker.sendMessage('terminate').catch(console.error);\n \n // Clean up\n this.worker.terminate();\n this.offscreenCanvas = null;\n \n // Emit terminate event\n this.emit('terminated');\n }\n\n /**\n\n /**\n * Update the current frame (animation loop)\n */\n\n\n render(time: number): void {\n\n // Send render command to worker\n this.worker.sendMessage('render', { time: time });\n }\n}","import EventEmitter from '../utils/EventEmitter';\nimport { WebAudioPlayer } from './renderers/audio/audio';\nimport { VideoWorker } from './renderers/video/video';\n\n/**\n * Clock - Time Management for Video Playback\n *\n * The Clock is the central coordinator for playback timing. It:\n * - Uses the audio timeline as the source of truth (Web Audio API currentTime)\n * - Manages the requestAnimationFrame loop\n * - Emits tick events for UI updates\n * - Coordinates video rendering at the correct time\n * - Provides getCurrentTime() for on-demand queries\n *\n * Architecture:\n *\n * Clock (this class)\n * │\n * ├─> Queries audioPlayer.getCurrentTime() ← Audio timeline is source of truth\n * ├─> Emits 'tick' events with current time\n * ├─> Calls videoWorker.render(time) passively\n * └─> Provides getCurrentTime() for external queries\n *\n * Why use the audio timeline?\n * - Web Audio API provides high-precision timing via AudioContext.currentTime\n * - Hardware accelerated and synchronized with audio output\n * - More reliable than performance.now() for A/V sync\n */\nexport class Clock extends EventEmitter {\n\n private audioPlayer: WebAudioPlayer;\n private videoWorker: VideoWorker;\n private isPlaying: boolean = false;\n private animationFrame: number | null = null;\n private duration: number;\n\n // Frame rate management\n private readonly TARGET_FPS = 30; // Target 30fps for smooth playback\n private readonly FRAME_INTERVAL: number;\n private lastFrameTime = 0;\n\n /**\n * Create a new Clock\n * @param audioPlayer - Audio player with Web Audio timeline\n * @param videoWorker - Video worker for passive rendering\n * @param duration - Total video duration in seconds\n */\n constructor(audioPlayer: WebAudioPlayer, videoWorker: VideoWorker, duration: number) {\n super();\n\n this.audioPlayer = audioPlayer;\n this.videoWorker = videoWorker;\n this.duration = duration;\n this.FRAME_INTERVAL = 1000 / this.TARGET_FPS;\n }\n\n /**\n * Start playback\n *\n * Starts the audio player and begins the tick loop.\n * The tick loop queries the audio timeline and drives video rendering.\n */\n async play(): Promise<void> {\n if (this.isPlaying) return;\n\n this.isPlaying = true;\n\n // Start audio playback (this starts the timeline)\n await this.audioPlayer.play();\n\n // Start the tick loop\n this.lastFrameTime = performance.now();\n this.tick();\n\n this.emit('play');\n }\n\n /**\n * Pause playback\n *\n * Pauses audio and stops the tick loop.\n */\n pause(): void {\n if (!this.isPlaying) return;\n\n this.isPlaying = false;\n\n // Pause audio\n this.audioPlayer.pause();\n\n // Stop the tick loop\n if (this.animationFrame) {\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = null;\n }\n\n this.emit('pause');\n }\n\n /**\n * Seek to a specific time\n *\n * @param time - Time in seconds\n */\n async seek(time: number): Promise<void> {\n const clampedTime = Math.max(0, Math.min(time, this.duration));\n\n // Seek both video and audio\n this.videoWorker.seek(clampedTime);\n await this.audioPlayer.seek(clampedTime);\n\n this.emit('seek', clampedTime);\n }\n\n /**\n * Get the current playback time\n *\n * Queries the audio player's timeline, which is the source of truth.\n *\n * @returns Current time in seconds\n */\n getCurrentTime(): number {\n return this.audioPlayer.getCurrentTime();\n }\n\n /**\n * Check if currently playing\n */\n playing(): boolean {\n return this.isPlaying;\n }\n\n /**\n * Main tick loop\n *\n * This runs at TARGET_FPS and:\n * 1. Queries the current time from audio timeline\n * 2. Emits tick event for UI updates\n * 3. Tells video worker to render at this time\n * 4. Checks for end of video\n *\n * The video worker is passive - it just renders whatever time we tell it.\n * The audio timeline is the source of truth for the current time.\n */\n private tick(): void {\n if (!this.isPlaying) return;\n\n const now = performance.now();\n const elapsed = now - this.lastFrameTime;\n\n // Frame rate throttling: only update at TARGET_FPS\n // This prevents unnecessary rendering and saves CPU/battery\n if (elapsed < this.FRAME_INTERVAL) {\n this.animationFrame = requestAnimationFrame(() => this.tick());\n return;\n }\n\n this.lastFrameTime = now;\n\n // Get current time from audio timeline (source of truth)\n const currentTime = this.audioPlayer.getCurrentTime();\n\n // Check if we've reached the end\n if (currentTime >= this.duration - 0.1) {\n this.pause();\n this.emit('ended');\n return;\n }\n\n // Emit tick event for UI updates\n // UI should listen to this rather than polling getCurrentTime()\n this.emit('tick', currentTime);\n\n // Tell video worker to render at this time (passive)\n // Video worker doesn't track time itself - it just renders whatever we tell it\n this.videoWorker.render(currentTime);\n this.audioPlayer.checkForPreLoad();\n\n // Schedule next tick\n this.animationFrame = requestAnimationFrame(() => this.tick());\n }\n\n /**\n * Update duration (if needed after initialization)\n */\n setDuration(duration: number): void {\n this.duration = duration;\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.animationFrame) {\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = null;\n }\n this.isPlaying = false;\n }\n}\n","import { VideoTrackData } from \"./renderers/video/decoder\";\nimport EventEmitter from \"../utils/EventEmitter\";\nimport { WorkerController } from '../utils/WorkerController';\nimport { AudioTrackData, WebAudioPlayer } from \"./renderers/audio/audio\";\nimport { VideoWorker } from \"./renderers/video/video\";\nimport { Clock } from \"./clock\";\nimport FileWorker from './file.ts?worker&inline';\n// Note to Claude: Do not edit this file or make suggestions unless I specifically ask you to.\n\nexport interface WebCodecsPlayerParams {\n src: File;\n canvas: HTMLCanvasElement;\n}\n\n\nexport interface TrackData {\n duration: number,\n audio?: AudioTrackData\n video?: VideoTrackData\n}\n\n\n\n\n\nexport class WebCodecsPlayer {\n private canvas: HTMLCanvasElement | null = null;\n private params: WebCodecsPlayerParams;\n private file: File;\n duration: number = 0;\n private renderer: VideoWorker | null = null;\n private audioPlayer: WebAudioPlayer | null = null;\n private worker: WorkerController | null = null;\n private clock: Clock | null = null;\n private trackData: TrackData | null = null;\n\n constructor(params: WebCodecsPlayerParams) {\n\n this.params = params;\n this.worker = new WorkerController(FileWorker);\n this.file = params.src;\n this.canvas = params.canvas;\n this.duration = 0;\n }\n\n\n\n async play() {\n if (!this.clock) {\n throw new Error('Player not initialized. Call initialize() first.');\n }\n\n await this.clock.play();\n }\n\n async pause() {\n if (!this.clock) {\n throw new Error('Player not initialized. Call initialize() first.');\n }\n\n this.clock.pause();\n }\n\n async seek(time: number) {\n if (!this.clock) {\n throw new Error('Player not initialized. Call initialize() first.');\n }\n\n await this.clock.seek(time);\n }\n\n getCurrentTime(): number {\n return this.clock?.getCurrentTime() || 0;\n }\n\n async getDebugInfo() {\n const videoDebugInfo = this.renderer ? await this.renderer.getDebugInfo() : null;\n\n return {\n trackData: {\n duration: this.duration,\n audio: this.audioPlayer ? {\n codec: this.audioPlayer.audioConfig?.codec,\n sampleRate: this.audioPlayer.audioConfig?.sampleRate,\n numberOfChannels: this.audioPlayer.audioConfig?.numberOfChannels,\n startTime: this.audioPlayer.startTime,\n pauseTime: this.audioPlayer.pauseTime,\n isPlaying: this.audioPlayer.isPlaying,\n loadedSegments: this.audioPlayer.audioSegments.size,\n scheduledNodeCount: this.audioPlayer.scheduledNodes.size\n } : null,\n video: videoDebugInfo ? {\n duration: this.renderer?.duration,\n codec: this.trackData?.video?.codec,\n width: this.trackData?.video?.codedWidth,\n height: this.trackData?.video?.codedHeight,\n frameRate: this.trackData?.video?.frameRate,\n ...videoDebugInfo\n } : null\n },\n clock: {\n isPlaying: this.clock?.playing(),\n currentTime: this.getCurrentTime()\n }\n };\n }\n\n terminate(){\n // Clean up clock\n if (this.clock) {\n this.clock.destroy();\n this.clock = null;\n }\n\n // Clean up audio resources\n if (this.audioPlayer) {\n this.audioPlayer.pause();\n // Any additional cleanup for audio...\n }\n\n // Clean up renderer resources\n if (this.renderer) {\n if (this.renderer instanceof VideoWorker) {\n this.renderer.terminate();\n } \n this.renderer = null;\n }\n\n }\n\n async initialize(): Promise<void> {\n\n console.log(\"Initializing\");\n\n // Create file demuxer worker\n this.worker = new WorkerController(FileWorker);\n\n // Create MessageChannel for file worker <-> video worker communication\n const videoChannel = new MessageChannel();\n\n // Initialize file worker with video port\n await this.worker.sendMessage('init', {\n file: this.file,\n videoPort: videoChannel.port1\n }, [videoChannel.port1]);\n\n // Get track metadata from file worker\n const trackData = <TrackData> await this.worker.sendMessage('get-tracks', {});\n console.log(\"Track data\", trackData);\n\n this.trackData = trackData;\n this.duration = trackData.duration;\n\n // Initialize video worker with port to file worker\n this.renderer = new VideoWorker({\n src: this.file,\n canvas: this.canvas!,\n fileWorkerPort: videoChannel.port2\n });\n\n await this.renderer.initialize();\n\n // Send track metadata to video worker\n await this.renderer.setTrackData(trackData.video!, trackData.duration);\n\n // Initialize audio player with file worker\n this.audioPlayer = new WebAudioPlayer({\n worker: this.worker,\n audioConfig: trackData.audio!,\n duration: trackData.duration,\n file: this.file\n });\n\n // Create clock to manage playback timing\n // The clock coordinates audio and video using the audio timeline as source of truth\n this.clock = new Clock(this.audioPlayer, this.renderer, this.duration);\n\n // Forward clock events to external listeners\n\n }\n\n on(event, listener){\n this.clock.on(event, listener)\n }\n\n // Add more methods as needed\n}\n\nexport default WebCodecsPlayer; "],"names":["byteToHex","i","unsafeStringify","arr","offset","getRandomValues","rnds8","rng","randomUUID","native","v4","options","buf","rnds","WorkerController","workerUrlOrConstructor","persistentEvents","port","event","eventName","handler","cmd","data","transfer","sanitize","request_id","uuidv4","sanitizedData","sanitizeForWorker","resolve","reject","message","response","error","obj","special_types","type","item","rawObj","sanitized","key","value","__accessCheck","member","msg","__privateGet","getter","__privateAdd","__privateSet","setter","__privateWrapper","__privateMethod","method","bytes","view","u8","u16","i16","u24","u32","i32","u64","fixed_8_8","fixed_16_16","fixed_2_30","ascii","text","nullTerminated","bytes2","_","last","lastPresentedSample","samples","result","sample","intoTimescale","timeInSeconds","timescale","round","rotationMatrix","rotationInDegrees","theta","cosTheta","sinTheta","IDENTITY_MATRIX","matrixToBytes","matrix","deepClone","x","isU32","box","contents","children","fullBox","version","flags","ftyp","details","minorVersion","mdat","reserveLargeSize","free","size","moov","tracks","creationTime","fragmented","mvhd","trak","mvex","duration","lastSample","GLOBAL_TIMESCALE","nextTrackId","needsU64","u32OrU64","track","tkhd","mdia","durationInGlobalTimescale","mdhd","hdlr","minf","localDuration","componentSubtype","vmhd","smhd","dinf","stbl","dref","url","needsCtts","stsd","stts","stss","stsc","stsz","stco","ctts","videoSampleDescription","VIDEO_CODEC_TO_BOX_NAME","soundSampleDescription","AUDIO_CODEC_TO_BOX_NAME","compressionType","VIDEO_CODEC_TO_CONFIGURATION_BOX","colr","COLOR_PRIMARIES_MAP","TRANSFER_CHARACTERISTICS_MAP","MATRIX_COEFFICIENTS_MAP","avcC","hvcC","vpcC","decoderConfig","parts","profile","level","thirdByte","av1C","firstByte","AUDIO_CODEC_TO_CONFIGURATION_BOX","esds","description","dOps","_a","preskip","gain","view2","keySamples","index","trex","moof","sequenceNumber","mfhd","traf","fragmentSampleFlags","byte1","byte2","byte3","byte4","sampleIsDifferenceSample","tfhd","tfdt","trun","tfFlags","referenceSample","referenceSampleInfo","allSampleDurations","allSampleSizes","allSampleFlags","allSampleCompositionTimeOffsets","uniqueSampleDurations","uniqueSampleSizes","uniqueSampleFlags","uniqueSampleCompositionTimeOffsets","firstSampleFlagsPresent","sampleDurationPresent","sampleSizePresent","sampleFlagsPresent","sampleCompositionTimeOffsetsPresent","mfra","tfra","mfro","trackIndex","chunk","Target","ArrayBufferTarget","StreamTarget","FileSystemWritableFileStreamTarget","stream","_helper","_helperView","Writer","newPos","box2","startPos","child","endPos","_target","_buffer","_bytes","_maxPos","_ensureSize","ensureSize_fn","ArrayBufferTargetWriter","target","newLength","newBuffer","newBytes","DEFAULT_CHUNK_SIZE","MAX_CHUNKS_AT_ONCE","_target2","_sections","_chunked","_chunkSize","_chunks","_writeDataIntoChunks","writeDataIntoChunks_fn","_insertSectionIntoChunk","insertSectionIntoChunk_fn","_createChunk","createChunk_fn","_flushChunks","flushChunks_fn","StreamTargetWriter","_b","chunks","sorted","b","lastChunk","section","position","chunkIndex","relativePosition","toWrite","low","high","mid","includesPosition","a","force","FileSystemWritableFileStreamTargetWriter","SUPPORTED_VIDEO_CODECS","SUPPORTED_AUDIO_CODECS","TIMESTAMP_OFFSET","FIRST_TIMESTAMP_BEHAVIORS","_options","_writer","_ftypSize","_mdat","_videoTrack","_audioTrack","_creationTime","_finalizedChunks","_nextFragmentNumber","_videoSampleQueue","_audioSampleQueue","_finalized","_validateOptions","validateOptions_fn","_writeHeader","writeHeader_fn","_computeMoovSizeUpperBound","computeMoovSizeUpperBound_fn","_prepareTracks","prepareTracks_fn","_generateMpeg4AudioSpecificConfig","generateMpeg4AudioSpecificConfig_fn","_createSampleForTrack","createSampleForTrack_fn","_addSampleToTrack","addSampleToTrack_fn","_validateTimestamp","validateTimestamp_fn","_finalizeCurrentChunk","finalizeCurrentChunk_fn","_finalizeFragment","finalizeFragment_fn","_maybeFlushStreamingTargetWriter","maybeFlushStreamingTargetWriter_fn","_ensureNotFinalized","ensureNotFinalized_fn","Muxer","meta","timestamp","compositionTimeOffset","videoSample","audioSample","mdatSize","movieBox2","movieBoxSize","currentChunkPos","movieBox","mfraBox","mfraBoxSize","mdatPos","remainingBytes","videoRotation","moovSizeUpperBound","upperBound","sampleCounts","n","guessedCodecPrivate","objectType","sampleRate","numberOfChannels","frequencyIndex","channelConfig","configBits","paddingLength","configBytes","presentationTimestampInSeconds","decodeTimestampInSeconds","durationInSeconds","adjusted","sampleCompositionTimeOffset","timescaleUnits","delta","lastTableEntry","lastCompositionTimeOffsetTableEntry","beginNewChunk","currentChunkDuration","mostImportantTrack","chunkDuration","presentationTimestamp","decodeTimestamp","strictTimestampBehavior","noLastDecodeTimestamp","baseDecodeTimestamp","flushStreamingWriter","fragmentNumber","moofOffset","moofBox","mdatBox","totalTrackSampleSize","newMoofBox","SEGMENT_DURATION","WebAudioPlayer","args","config","muxer","time","segmentIndex","encodedChunks","muxedBuffer","audioBuffer","c","startFrom","currentSegment","segmentOffset","timeUntilEnd","node","startTime","nextSegmentIndex","nextSegment","sourceNode","playbackTime","wasPlaying","currentTime","currentSegmentIndex","EventEmitter","listener","id","listenerId","VideoWorker","params","VideoWorkerConstructor","initialized","videoMetadata","Clock","audioPlayer","videoWorker","clampedTime","now","WebCodecsPlayer","FileWorker","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","videoDebugInfo","videoChannel","trackData"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjCO,MAAM6W,WAAoBJ,GAAa;AAAA,EAO5C,YAAYK,GAA2B;AACrC,UAAA,GANF,KAAQ,kBAA0C,MAClD,KAAO,WAAmB,GAMxB,KAAK,SAASA,EAAO,QACrB,KAAK,iBAAiBA,EAAO,gBAC7B,KAAK,SAAS,IAAIlX,GAAiBmX,EAAsB;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,aAA4B;AAEhC,SAAK,kBAAkB,KAAK,OAAO,2BAAA;AAGnC,UAAMC,IAAc,MAAM,KAAK,OAAO,YAAY,QAAQ;AAAA,MACxD,QAAQ,KAAK;AAAA,MACb,gBAAgB,KAAK;AAAA,IAAA,GACpB,CAAC,KAAK,iBAAiB,KAAK,cAAc,CAAC;AAI9C,SAAK,KAAK,eAAeA,CAAW;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAK1B,GAA6B;AAEtC,UAAM,KAAK,OAAO,YAAY,QAAQ,EAAE,MAAAA,GAAM;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAA6B;AACjC,WAAO,MAAM,KAAK,OAAO,YAAY,kBAAkB,CAAA,CAAE;AAAA,EAC3D;AAAA,EAGA,MAAM,aAAa2B,GAAoBrR,GAAiC;AACtE,UAAM,KAAK,OAAO,YAAY,kBAAkB;AAAA,MAC9C,eAAAqR;AAAA,MACA,UAAArR;AAAA,IAAA,CACD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAIA,YAAkB;AAGhB,SAAK,OAAO,YAAY,WAAW,EAAE,MAAM,QAAQ,KAAK,GAGxD,KAAK,OAAO,UAAA,GACZ,KAAK,kBAAkB,MAGvB,KAAK,KAAK,YAAY;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO0P,GAAoB;AAGzB,SAAK,OAAO,YAAY,UAAU,EAAE,MAAAA,GAAY;AAAA,EAClD;AACF;AC9EO,MAAM4B,WAAcT,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBtC,YAAYU,GAA6BC,GAA0BxR,GAAkB;AACnF,UAAA,GAhBF,KAAQ,YAAqB,IAC7B,KAAQ,iBAAgC,MAIxC,KAAiB,aAAa,IAE9B,KAAQ,gBAAgB,GAWtB,KAAK,cAAcuR,GACnB,KAAK,cAAcC,GACnB,KAAK,WAAWxR,GAChB,KAAK,iBAAiB,MAAO,KAAK;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAsB;AAC1B,IAAI,KAAK,cAET,KAAK,YAAY,IAGjB,MAAM,KAAK,YAAY,KAAA,GAGvB,KAAK,gBAAgB,YAAY,IAAA,GACjC,KAAK,KAAA,GAEL,KAAK,KAAK,MAAM;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAc;AACZ,IAAK,KAAK,cAEV,KAAK,YAAY,IAGjB,KAAK,YAAY,MAAA,GAGb,KAAK,mBACP,qBAAqB,KAAK,cAAc,GACxC,KAAK,iBAAiB,OAGxB,KAAK,KAAK,OAAO;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAK0P,GAA6B;AACtC,UAAM+B,IAAc,KAAK,IAAI,GAAG,KAAK,IAAI/B,GAAM,KAAK,QAAQ,CAAC;AAG7D,SAAK,YAAY,KAAK+B,CAAW,GACjC,MAAM,KAAK,YAAY,KAAKA,CAAW,GAEvC,KAAK,KAAK,QAAQA,CAAW;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,iBAAyB;AACvB,WAAO,KAAK,YAAY,eAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcQ,OAAa;AACnB,QAAI,CAAC,KAAK,UAAW;AAErB,UAAMC,IAAM,YAAY,IAAA;AAKxB,QAJgBA,IAAM,KAAK,gBAIb,KAAK,gBAAgB;AACjC,WAAK,iBAAiB,sBAAsB,MAAM,KAAK,MAAM;AAC7D;AAAA,IACF;AAEA,SAAK,gBAAgBA;AAGrB,UAAMf,IAAc,KAAK,YAAY,eAAA;AAGrC,QAAIA,KAAe,KAAK,WAAW,KAAK;AACtC,WAAK,MAAA,GACL,KAAK,KAAK,OAAO;AACjB;AAAA,IACF;AAIA,SAAK,KAAK,QAAQA,CAAW,GAI7B,KAAK,YAAY,OAAOA,CAAW,GACnC,KAAK,YAAY,gBAAA,GAGjB,KAAK,iBAAiB,sBAAsB,MAAM,KAAK,MAAM;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY3Q,GAAwB;AAClC,SAAK,WAAWA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,IAAI,KAAK,mBACP,qBAAqB,KAAK,cAAc,GACxC,KAAK,iBAAiB,OAExB,KAAK,YAAY;AAAA,EACnB;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[0,1,2,3,5]}